Asial Blog

Recruit! Asialで一緒に働きませんか?

OpenVPNで拠点間VPN

カテゴリ :
バックエンド(インフラ)
タグ :
Tech
Linux
Debian
OpenVpn
OpenVPNで拠点間VPN

元々、個人専用のWEBサーバーを立ち上げ、ファイルサーバーのデータを外部から参照可能にしているが、
単純にファイルを転送するだけならともかく、ディレクトリごとダウンロードや、一部だけ読み取ることなどは出来ないため割と不便。
解決法はWebDAVとかFTPとかいろいろとある中、どうせなら自宅ネットワークに直接接続出来れば、便利じゃないかと思いVPNを張ることを計画。
(NFSとかFTPとかSVNとかrsyncなどの内部用の設定なため、外部に公開したらひどいことになる通信も使える!)
VPNといえば、IPSecとかPPTPなどの有名どころはありますが、割と設定が面倒で設定をしっかりしないと穴が開くこともあるので、設定が簡単な(デフォルトでもそこそこしっかりしている)OpenVPNを採用。

・OpenVPNとは
SSLVPNの一つで、設定がシンプル。そこそこ堅牢。IPSecなどと違い、ユーザーランドで動作するのでセキュリティホールがあった場合にも影響が少ないはず。暗号化の方式も割と自由に選択可能。

以下、詳しいことはいつものとおり割愛して、具体的な設定方法。

インストール
  1. $ sudo apt-get install openvpn

証明書の作成
まずは、easy-rsaをコピー
  1. hoge@localhost:~$ sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa-hoge/

移動
  1. hoge@localhost:~$ cd /etc/openvpn/easy-rsa-hoge/

お好みにより証明書の内容を編集(オレオレ証明書なので適当に)
  1. hoge@localhost:/etc/openvpn/easy-rsa-hoge$ vi vars
  2. ##############
  3. export KEY_COUNTRY="HO"
  4. export KEY_PROVINCE="GE"
  5. export KEY_CITY="hogecity"
  6. export KEY_ORG="Hoge corp"
  7. export KEY_EMAIL="me@myhost.mydomain"
  8. ##############

varsの内容を環境変数にセット
  1. hoge@localhost:/etc/openvpn/easy-rsa-hoge$ . ./vars

CAを作成
  1. hoge@localhost:/etc/openvpn/easy-rsa-hoge$ ./build-ca
  2. Generating a 1024 bit RSA private key
  3. ......++++++
  4. ......++++++
  5. writing new private key to 'ca.key'
  6. -----
  7. You are about to be asked to enter information that will be incorporated
  8. into your certificate request.
  9. What you are about to enter is what is called a Distinguished Name or a DN.
  10. There are quite a few fields but you can leave some blank
  11. For some fields there will be a default value,
  12. If you enter '.', the field will be left blank.
  13. -----
  14. Country Name (2 letter code) [HO]:
  15. State or Province Name (full name) [GE]:
  16. Locality Name (eg, city) [hogecity]:
  17. Organization Name (eg, company) [Hoge corp]:
  18. Organizational Unit Name (eg, section) []:
  19. Common Name (eg, your name or your server's hostname) [Hoge corp CA]:
  20. Name []:
  21. Email Address [me@myhost.mydomain]:

1・サーバー側で証明書作成
第一引数のサーバー名はお好みで(今回はserver)
  1. hoge@localhost:/etc/openvpn/easy-rsa-hoge$ ./build-key-server server
  2. Generating a 1024 bit RSA private key
  3. .........++++++
  4. ........++++++
  5. writing new private key to 'server.key'
  6. -----
  7. You are about to be asked to enter information that will be incorporated
  8. into your certificate request.
  9. What you are about to enter is what is called a Distinguished Name or a DN.
  10. There are quite a few fields but you can leave some blank
  11. For some fields there will be a default value,
  12. If you enter '.', the field will be left blank.
  13. -----
  14. Country Name (2 letter code) [HO]:
  15. State or Province Name (full name) [GE]:
  16. Locality Name (eg, city) [hogecity]:
  17. Organization Name (eg, company) [Hoge corp]:
  18. Organizational Unit Name (eg, section) []:
  19. Common Name (eg, your name or your server's hostname) [server]:
  20. Name []:
  21. Email Address [me@myhost.mydomain]:
  22. Please enter the following 'extra' attributes
  23. to be sent with your certificate request
  24. A challenge password []:
  25. An optional company name []:
  26. Using configuration from /etc/openvpn/easy-rsa-hoge/openssl.cnf
  27. Check that the request matches the signature
  28. Signature ok
  29. The Subject's Distinguished Name is as follows
  30. countryName           :PRINTABLE:'HO'
  31. stateOrProvinceName   :PRINTABLE:'GE'
  32. localityName          :PRINTABLE:'hogecity'
  33. organizationName      :PRINTABLE:'Hoge corp'
  34. commonName            :PRINTABLE:'server'
  35. emailAddress          :IA5STRING:'me@myhost.mydomain'
  36. Certificate is to be certified until Feb 23 07:32:18 2020 GMT (3650 days)
  37. Sign the certificate? [y/n]:y
  38. 1 out of 1 certificate requests certified, commit? [y/n]y
  39. Write out database with 1 new entries
  40. Data Base Updated

クライアント証明書作成
クライアント名もお好みで(今回はclient)
コマンドを"build-key-pass"にするとパスフレーズ付きで鍵を作成可能(ただし、起動時にパスフレーズを訊かれるため面倒)
  1. hoge@localhost:/etc/openvpn/easy-rsa-hoge$ ./build-key client
  2. Generating a 1024 bit RSA private key
  3. ...................................++++++
  4. ....................++++++
  5. writing new private key to 'client.key'
  6. -----
  7. You are about to be asked to enter information that will be incorporated
  8. into your certificate request.
  9. What you are about to enter is what is called a Distinguished Name or a DN.
  10. There are quite a few fields but you can leave some blank
  11. For some fields there will be a default value,
  12. If you enter '.', the field will be left blank.
  13. -----
  14. Country Name (2 letter code) [HO]:
  15. State or Province Name (full name) [GE]:
  16. Locality Name (eg, city) [hogecity]:
  17. Organization Name (eg, company) [Hoge corp]:
  18. Organizational Unit Name (eg, section) []:
  19. Common Name (eg, your name or your server's hostname) [client]:
  20. Name []:
  21. Email Address [me@myhost.mydomain]:
  22. Please enter the following 'extra' attributes
  23. to be sent with your certificate request
  24. A challenge password []:
  25. An optional company name []:
  26. Using configuration from /etc/openvpn/easy-rsa-hoge/openssl.cnf
  27. Check that the request matches the signature
  28. Signature ok
  29. The Subject's Distinguished Name is as follows
  30. countryName           :PRINTABLE:'HO'
  31. stateOrProvinceName   :PRINTABLE:'GE'
  32. localityName          :PRINTABLE:'hogecity'
  33. organizationName      :PRINTABLE:'Hoge corp'
  34. commonName            :PRINTABLE:'client'
  35. emailAddress          :IA5STRING:'me@myhost.mydomain'
  36. Certificate is to be certified until Feb 23 07:35:43 2020 GMT (3650 days)
  37. Sign the certificate? [y/n]:y
  38. 1 out of 1 certificate requests certified, commit? [y/n]y
  39. Write out database with 1 new entries
  40. Data Base Updated

DH生成
  1. hoge@localhost:/etc/openvpn/easy-rsa-hoge$ ./build-dh
  2. Generating DH parameters, 1024 bit long safe prime, generator 2
  3. This is going to take a long time
  4. .................+............+..............................................................................................................................................+........................\
  5. ...................................................................................................................................++*++*++*

以上で証明書生成は完了。

2・サーバー側設定
/etc/openvpn/server.conf
  1. # ポート
  2. port 11072
  3. # 使用するプロトコル
  4. proto udp
  5. # デバイス
  6. ## 今回はL3トンネルなので、tunを使用
  7. ## (L2の場合はtapを使用)
  8. ## tun0のようにすれば、デバイスを固定出来る
  9. dev tun0
  10. # keepalive
  11. keepalive 10 120
  12. # 実行中はnobodyとして動作
  13. user nobody
  14. group nogroup
  15. # 証明書関係
  16. ca /etc/openvpn/easy-rsa-hoge/keys/ca.crt
  17. cert /etc/openvpn/easy-rsa-hoge/keys/server.crt
  18. key /etc/openvpn/easy-rsa-hoge/keys/server.key
  19. dh /etc/openvpn/easy-rsa-hoge/keys/dh1024.pem
  20. # サーバーとして設定
  21. tls-server
  22. # server ネットワーク ネットマスク
  23. ## このネットワークの範囲内で自動的にIPを割り振る
  24. server 192.168.4.0 255.255.255.0
  25. # 割り振ったIPの記録先(証明書ベースでIPを管理)
  26. ifconfig-pool-persist /etc/openvpn/hoge-persist
  27. # クライアントに送るコマンド
  28. # 192.168.1.100/32へ行くにはこのネットワークを通す設定
  29. push "route 192.168.1.100 255.255.255.255"
  30. persist-key
  31. persist-tun
  32. # ログの出力先
  33. ## 設定しないと標準出力に表示
  34. log /var/log/openvpn-hoge.log
  35. log-append /var/log/openvpn-hoge.log
  36. # ログレベル
  37. verb 3
  38. # MTUの設定
  39. fragment 1200
  40. mssfix
こんな感じで設定。

*.confとなっていれば起動時に自動で読み込まれるため、ポート・デバイスをそれぞれ設定すれば、複数のサーバーを起動可能。

3・クライアント設定
/etc/openvpn/client.conf
  1. # クライアントとして設定
  2. tls-client
  3. # 使用するプロトコル
  4. proto udp
  5. # デバイス
  6. dev tun
  7. # サーバーのアドレスとポート
  8. remote hoge.example.com 11072
  9. # 証明書関係
  10. ca /etc/openvpn/keys/ca.crt
  11. cert /etc/openvpn/keys/client.crt
  12. key /etc/openvpn/keys/client.key
  13. user nobody
  14. group nogroup
  15. # pushで送られた設定を受け取る
  16. pull
  17. # IPを受け取る
  18. float
  19. persist-key
  20. persist-tun
  21. resolv-retry infinite
  22. nobind
  23. # ログの詳細レベルの指定
  24. verb 3
  25. log /var/log/openvpn-tun.log
  26. log-append /var/log/openvpn-tun.log
  27. keepalive 10 120
  28. replay-window 128
  29. fragment 1200
  30. mssfix

こちらも、*.confとなっていれば起動時に自動で読み込まれるため、複数のサーバーへ接続も可能。

下記ファイルを安全な方法でクライアントにコピーすれば完了。
  1. /etc/openvpn/easy-rsa-hoge/keys/ca.crt
  2. /etc/openvpn/easy-rsa-hoge/keys/client.crt
  3. /etc/openvpn/easy-rsa-hoge/keys/client.key

4・起動

起動確認
サーバー側
  1. $ sudo openvpn --config /etc/openvpn/server.conf

クライアント側
  1. $ sudo openvpn --config /etc/openvpn/client.conf

設定ファイルのlog,log-append行をコメントアウトしないとログが標準出力に出ないので注意。

正常に通信出来たら一度終了し、
  1. $ sudo /etc/init.d/openvpn restart
で起動すればOK


5・MTUとかfragmentとか

私の場合は、クライアントからサーバーまでとりあえず、pingはOK、SSHでも正常に反応するが、NFSでアクセスすると突然フリーズ。
前にPPPoEでもハマったことがあったため、多分MTUが問題じゃないかと思いググってみるとfragmentとかmssfixというオプションに行き着く。
fragmentは指定した長さ以上のらパケットが来たら分割するオプションらしい。
fragmentの値を適当に小さくすれば、フリーズは完治。パフォーマンスは取り合えず動いているので放置。

ddの結果はこんな感じになったため、そこそこ速度は出る模様。
102400+0 records in
102400+0 records out
104857600 bytes (105 MB) copied, 61.1367 s, 1.7 MB/s