OpenVPNサーバー

中国に出張することが増えたのですが、あれこれ繋がらないインターネットなので、勉強がてらVPNをセットアップします。
以前はPPTPを使っていましたが、最近はOpenVPNがメインになりつつあるようなので、ここではOpenVPNを使っています。
なお、クライアント側はAndroidを想定しています。

インストール

  1. インストールします。
    # apt install openvpn easy-rsa
    インストール段階では何らの設定等はありません。

証明書の作成

サーバー/クライアントで使用する証明書を作成します。
主に参考にしたのはこちら→http://qiita.com/mcddx330/items/5814f5c9175fbd517be6

  1. 証明書関連のディレクトリを作成します。
    # make-cadir /etc/openvpn/easy-rsa
    指定したディレクトリ内に必要なスクリプトや設定ファイルもコピーされています。
  2. 証明書作成のパラメータを/etc/openvpn/easy-rsa/varsに入力します。
    # These are the default values for fields
    # which will be placed in the certificate.
    # Don't leave any of these fields blank.
    export KEY_COUNTRY="JP"
    export KEY_PROVINCE="Tokyo"
    export KEY_CITY="Minato"
    export KEY_ORG="Example"
    export KEY_EMAIL="example@example.net"
    export KEY_OU="Example"
    SSL証明書を作る時に必要な項目を入れているだけです。個人利用なので、何でもいいのですが…。
  3. 証明書(CA)を作成します
    # . vars
    # ./clean-all
    # ./build-ca
    先ほどvarsに設定した内容がデフォルトとして表示されるので、Enterを連打すれば完了します。
  4. サーバー側の証明書を作成します
    VPNサーバー側で使用する証明書を作成します。
    # ./biuild-key-server server
    (中略)
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
  5. クライアント側の証明書を作成します
    VPNクライアント側で使用する証明書を作成します。
    # ./biuild-key client1
    (中略)
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
  6. Diffie Hellmanパラメータを生成します
    時間がかかるよ〜というような注意は出ますが、数分程度です。
    # ./build-dh
  7. tls-auth鍵を生成します
    セキュリティ向上の他、攻撃防止効果もあるので使用します。詳しくはこちら:http://yamatamemo.blogspot.jp/2014/04/openvpn-tls-auth.html
    # openvpn --genkey --secret key/ta.key

VPNサーバーの設定

  1. 設定ファイルの雛形をコピーします
    雛形はusr/share/docにあるので、コピーして展開します。
    # cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
    # gzip -d server.conf.gz
  2. 設定ファイルを修正します
    OpenVPNはプロトコルやポートを自由に設定できるので、せっかくならTCPのポート443にして、httpsのフリをしてみます。
    ※ただし、TCPはUDPよりスループットが落ちるそうなので、あまり推奨されません。
    port 443
    proto tcp
    ca /etc/openvpn/easy-rsa/keys/ca.crt
    cert /etc/openvpn/easy-rsa/keys/server.crt
    key /etc/openvpn/easy-rsa/keys/server.key
    dh /etc/openvpn/easy-rsa/keys/dh2048.pem
    push "redirect-gateway def1 bypass-dhcp" ※すべての通信をVPN経由に変更
    push "dhcp-option DNS 8.8.8.8" ※DNSサーバーは適宜環境に合わせて設定してください
    push "dhcp-option DNS 8.8.4.4"
    tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0 # This file is secret
    user nobody
    group nogroup
    詳細説明はconfファイルそのものに書いてあるので割愛します。
  3. 再起動せずに設定を反映するための作業をします
    最初は、再起動せずにネットワーク設定を変更し、openvpnを手動起動して正常に接続できるか試します。
    # iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    # sysctl net.ipv4.ip_forward=1
    # openvpn --config server.conf
    Initialization Sequence Completedとなってopenvpnが待機したら設定はOKなので、クライアント側を設定して正常に接続できるか確認します。
  4. 再起動後のためのNAT設定を作成します。
    /etc/network/if-up.d/natを作成し、iptablesの設定を記載します。
    #!bin/sh
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    また、chmod +xしてこのスクリプトには実行権限をつけておきます。
  5. パケットフォワードを有効化します
    /etc/sysctl.confの以下の行をアンコメントします
    net.ipv4.ip_forward=1

VPNクライアントの設定(Androidの場合)

Androidをクライアントにする場合、設定を1ファイルに統合した.ovpnファイルが必要になるようです。
作り方はこちらのサイトを参照しました→http://hachulog.blogspot.jp/2013/08/androidopenvpn.html

  1. 設定ファイルの雛形をコピーします。
    こちらも雛形はusr/share/docにあるので、コピーします。
    # cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client1.ovpn
  2. 設定ファイルを修正します。
    内容はサーバーに合わせます。また、ovpnの書き方にするため、ca / cert / keyは専用のタグで証明書の内容をコピペします。
    port 443
    proto tcp
    remote example.com 443
    user nobody
    group nogroup
    ;ca ca.crt
    ;cert client.crt
    ;key client.key
    ;tls-auth ta.key 1
    <ca>
    -----BEGIN CERTIFICATE-----
    (中略)
    -----END CERTIFICATE-----
    </ca>
    
    <cert>
    -----BEGIN CERTIFICATE-----
    (中略)
    -----END CERTIFICATE-----
    </cert>
    
    <key>
    -----BEGIN CERTIFICATE-----
    (中略)
    -----END CERTIFICATE-----
    </key>
    
    key-direction 1
    <tls-auth>
    (中略)
    </tls-auth>
  3. Android側でovpnファイルを設定します

目次へ戻る