07 Dec 2014, 21:21

【VPS1台でインフラ勉強】SoftEtherを使ってVPN構築

おつかれさまです。もーすけです。
VPS1台でインフラ勉強シリーズの第3回目でVPN構築を行ったのでその知見を残しておきます。

  • 第1回 サーバ複数台構成、Nginxでリバースプロキシ構築
  • 第2回 HAProxyでロードバランサ構築
  • 第3回 SoftEtherを使ってVPN構築
  • 1. 実施したこと

    VPSのホストサーバをVPSサーバとし、その上で仮想で立ち上げたサーバ(ローカルネットワーク)に外部から接続できるようにすること。

    f:id:mosuke5:20141207200544p:plain

    2. 環境

    ・VPNソフトウェア:SoftEther VPN プロジェクト - SoftEther VPN プロジェクト
    ・メモリ:1GB
    ・CPU:仮想2コア
    ・HDD:100GB
    ・OS:CentOS7
    ・サーバ仮想化:Vagrant(Utuntu13)

    3. SoftEtherのインストール

    インストール手順は公式ドキュメント通りなので簡単にコマンドのみ記述しておく。
    7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト

    【ダウンロードしたもの】
    ここから環境に応じて対象のソフトウェアを選ぶ
    SoftEther ダウンロード センター

    コンポーネントSoftEther VPN Server
    ・プラットフォーム:Linux
    ・CPU:Intel x86 / AMD64(64bit)

    ## ダウンロード
    $ wget ttp://jp.softether-download.com/files/softether/v4.08-9449-rtm-2014.06.08-tree/Linux/SoftEther%20VPN%20Server/64bit%20-%20Intel%20x64%20or%20AMD64/softether-vpnserver-v4.08-9449-rtm-2014.06.08-linux-x64-64bit.tar.gz
    
    ## 解凍
    $ tar zxvf softether-vpnserver-v4.08-9449-rtm-2014.06.08-linux-x64-64bit.tar.gz
    
    ## 実行可能ファイル作成
    $ cd vpnserver/
    $ sudo make
    
    ## /usr/localへ配置
    $ sudo mv vpnserver /usr/local
    
    ## パーミッション変更
    ### 基本的には600。実行ファイルのみ700
    $ cd /usr/local/vpnserver
    $ sudo chown root:root ./*
    $ sudo chmod 600 ./*
    $ sudo chmod 700 ./vpncmd
    $ sudo chmod 700 ./vpnserver
    
    ## 動作チェック
    $ sudo ./vpncmd
    1. VPN Server または VPN Bridge の管理
    2. VPN Client の管理
    3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)
    
    1 - 3 を選択: 3
    
    VPN Tools>
    ##helpとうつと利用可能なコマンドが出る
    VPN Tools> help
    下記の 6 個のコマンドが使用できます:
     About         - バージョン情報の表示
     Check         - SoftEther VPN の動作が可能かどうかチェックする
     MakeCert      - 新しい X.509 証明書と秘密鍵の作成 (1024 bit)
     MakeCert2048  - 新しい X.509 証明書と秘密鍵の作成 (2048 bit)
     TrafficClient - 通信スループット測定ツールクライアントの実行
     TrafficServer - 通信スループット測定ツールサーバーの実行
    VPN Tools> 
    VPN Tools> Check
    (略)
    すべてのチェックに合格しました。
    VPN Tools> 
    VPN Tools> exit
    
    ##起動スクリプトの作成
    $ sudo vim /etc/init.d/vpnserver
    #!/bin/sh
    # chkconfig: 2345 99 01
    # description: SoftEther VPN Server
    DAEMON=/usr/local/vpnserver/vpnserver
    LOCK=/var/lock/subsys/vpnserver
    test -x $DAEMON || exit 0
    case "$1" in
    start)
    $DAEMON start
    touch $LOCK
    ;;
    stop)
    $DAEMON stop
    rm $LOCK
    ;;
    restart)
    $DAEMON stop
    sleep 3
    $DAEMON start
    ;;
    *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
    esac
    exit 0
    
    ##サービス登録
    $ sudo chkconfig --add vpnserver
    $ sudo chkconfig --list vpnserver
    vpnserver      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
    
    ##起動
    $ sudo /etc/init.d/vpnserver start  
    

    4. 設定

    (1)管理者パスワードの設定

    ## vpnserverへ接続
    $ sudo ./vpncmd localhost:443 /SERVER
    
    ## 管理者パスワード設定
    VPN Server> ServerPasswordSet 
    

    (2)仮想HUBの作成

    デフォルトで「default」という仮想がHUBがあるのでそれで構築。
    自分の仮想HUBを作りたければHubCreateでつくれる。

    VPN Server> HubCreate 
    

    ※HELPコマンドがだいぶ使えるので使おう。日本語で書かれているのでわかりやすいです。

    VPN Server>HELP
    下記の 205 個のコマンドが使用できます:
     About                      - バージョン情報の表示
     AcAdd                      - 接続元 IP 制限リストにルールを追加 (IPv4)
     AcAdd6                     - 接続元 IP 制限リストにルールを追加 (IPv6)
     AcDel                      - 接続元 IP 制限リスト内のルールの削除
     AcList                     - 接続元 IP 制限リストのルール一覧の取得
    (...以下略) 
    

    (3) IPsec VPN サーバー機能の有効化

    VPNのトンネリングをするにあたって事前共有鍵が必要なので作成する必要がある。

    VPN Server>IPsecEnable
        IPsecEnable コマンド - IPsec VPN サーバー機能の有効化 / 無効化
        L2TP over IPsec サーバー機能を有効 (yes / no): yes
        Raw L2TP サーバー機能を有効 (yes / no): yes
        EtherIP / L2TPv3 over IPsec サーバー機能を有効 (yes / no): yes
        IPsec 事前共有鍵の文字列 (9 文字以下を推奨): *******
        VPN 接続時に仮想 HUB 名が省略された場合のデフォルト仮想 HUB 名: Default 
    

    (4) グループとユーザの作成

    ユーザを作成するにはグループの作成が必要なので先にグループを作る。
    また、ユーザを作ったでではパスワードが設定されないので忘れずにパスワード設定。

    VPN Server>Hub Default
    VPN Server/DEFAULT>GroupCreate
        GroupCreate コマンド - グループの作成
        グループ名: mygroup
        グループの本名: mygroup
        グループの説明: mygroup
    
    VPN Server/DEFAULT>UserCreate
        UserCreate コマンド - ユーザーの作成
        ユーザー名: myuser
        参加するグループ名: mygroup
        ユーザーの本名: myuser
        ユーザーの説明: myuser
        コマンドは正常に終了しました。
    
    ## ユーザを作っただけではパスワードが設定されないので
    VPN Server/DEFAULT> UserPasswordSet 
    

    (5) ローカルブリッジの設定

    次にローカルブリッジの設定をする。
    ローカルブリッジはVPNの仮想ネットワークと、LAN の実ネットワーク(ここではVPSホストサーバと仮想Webサーバ間のローカルネットワーク)をつなげる設定です。
    ローカルブリッジを行うLANカードを指定する必要があるが、ここでは仮想の「vboxnet0」を使用します。

    VPN Server/DEFAULT>BridgeCreate
        BridgeCreate コマンド - ローカルブリッジ接続の作成
        ブリッジする仮想 HUB 名: Default
        ブリッジ先のデバイス名: vboxnet0 
    

    (6) DHCPの設定

    VPNクライアント側に割り当てるIPアドレスのレンジを決めてあげます。
    今回は最小限構成で実現するため、ローカルのIPアドレスは同一セグメントとしました。
    192.168.33.0/24を利用セグメントとした。
    また、サーバ側に割り当てているIPとバッティングしないように192.168.33.20以降をDHCPのIPレンジとした。

    ##まずは有効化。これをやらないと「PPPサーバーとの接続が確立ができません」ってなってハマります。
    VPN Server/example> SecureNatEnable
    
    VPN Server/DEFAULT>DhcpSet
        DhcpSet コマンド - SecureNAT 機能の仮想 DHCP サーバー機能の設定の変更
        配布するアドレス帯の開始点: 192.168.33.20
        配布するアドレス帯の終了点: 192.168.33.50
        サブネットマスク: 255.255.255.0
        リース期限 (秒): 7200
        デフォルトゲートウェイ (未設定可):
        DNS サーバー 1 (未設定可):
        DNS サーバー 2 (未設定可):
        ドメイン名:
        ログの保存 (yes / no): yes 
    

    5. VPN接続試験

    iPhoneVPNの設定から以下のように設定をする。
    アカウントの部分は「ユーザ名@仮想Hub名」にすること。
    f:id:mosuke5:20141207212531j:plain


    接続すると、ローカルのIPが割り当てられていることを確認。
    途中で切れているが192.168.33.21が割り当てられました。
    f:id:mosuke5:20141207212546j:plain

    VPNにつないだ状態でブラウザから192.168.33.10にアクセスすると”It works!!!”。
    f:id:mosuke5:20141207212556j:plain

    6 最後に

    VPNの構築そのものはなんとかできるが、やはり奥は深い。
    挙動がまだ不安定な部分もあるので、きちんと仕組みを理解していくことと、
    今回はVPNクライアント側とアクセス先サーバを同一セグメントとしたので、L3の設定などをして違うセグメントにもアクセスできるようにしていきたい。

    関連する記事はこちら
  • Docker上でMySQLを利用する際のセットアップについて (2018/04/21)
  • [随時更新] ElasticSearchの基本APIのまとめ (2018/01/14)
  • ElasticSearch入門 インストールから検索、そしてKibanaまで (2017/08/13)
  • クラウド上でのWordPressのスケールアウトを考える (2017/01/04)
  • Nginxの仕組みについて入門 (2016/06/04)
  • comments powered by Disqus
    このエントリーをはてなブックマークに追加