OpenVPN¶
- OpenVPNに関する簡易構築メモです。
- インターネットを介した異なるネットワークをSSL暗号化して
 同じセグメントに属させます。(ローカルネット扱いにします)
- そのため、ネットワークセグメントが送受信ともに同じ場合は面倒で
 IPマスカレード設定をしなければいけません。
 (自宅192.168.0.1 <=> データセンター192.168.0.10 などの場合)
- これにより、管理者以外は使わないようなポートを閉じたまま、
 そのポートを使わないと出来ない管理などを内部から行うことが出来ます。
 (SSHでの踏み台と違い、操作端末自体が相手のネットワークに介入します)
前提条件¶
- 今回はepelリポジトリを使用します。
 PHP5.2のインストール に構築メモがありますので参考に。
- OpenSSLのインストールが必須になります。今回は省略します。
インストール¶
- epelからインストールします。# yum --enablerepo=epel install openvpn 
鍵生成¶
準備¶
- 鍵生成プログラムをコピーします。# cd /etc/openvpn/ # cp -Rp /usr/share/openvpn/easy-rsa/ . # chmod a+x easy-rsa/2.0/* 
- 鍵生成プログラムの設定ファイルを編集します。(一番下)# cd easy-rsa/2.0/ # vi vars # ------------------------------------------------------ # 変更箇所のみ記載 export KEY_COUNTRY="JP" export KEY_PROVINCE="CA" export KEY_CITY="Tokyo" export KEY_ORG="example.co.jp" export KEY_EMAIL="postmaster@example.co.jp" 
- 設定ファイルを読み込ませて、環境変数を定義します。
 実行時、追加でスクリプトの実行を要求される場合があるので
 指示に従い実行します。(察するに、サンプル鍵の削除)source vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/2.0/keys # ./clean-all 
CA証明書の作成¶
- CA証明書、秘密鍵の作成、配置
 (要求内容は環境変数で定義したので、デフォ値ENTERでいい)# ./build-ca writing new private key to 'ca.key' # ls keys/ ca.crt ca.key index.txt serial # cp -p keys/ca.crt /etc/openvpn/ 
サーバ証明書の作成¶
- サーバ証明書、秘密鍵の作成、配置
 (先ほどと同じだが、最後に2回応答があるので注意)# ./build-key-server server Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries # cp -p keys/server.key /etc/openvpn/ # cp -p keys/server.crt /etc/openvpn/ 
DHの作成¶
- 次のスクリプトを実行し、生成したファイルを配置します。# ./build-dh # cp -p keys/dh1024.pem /etc/openvpn/ 
証明書廃止リストの作成¶
- 次のスクリプトを実行し、生成したファイルを配置します。
 (サーバ証明書の挙動と同様)# build-key dmy Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries 
- 次のファイルの箇所をコメントアウトします。(一番下)# vi ./openssl.conf # ------------------------------------------------------ # 変更箇所のみ記載 #[ pkcs11_section ] #engine_id = pkcs11 #dynamic_path = /usr/lib/engines/engine_pkcs11.so #MODULE_PATH = $ENV::PKCS11_MODULE_PATH #PIN = $ENV::PKCS11_PIN #init = 0 
- 次のコマンドを実行し、ファイルを配置します。# ./revoke-full dmy # cp -p keys/crl.pem /etc/openvpn/ 
- TLS認証鍵を生成、配置します。# openvpn --genkey --secret /etc/openvpn/ta.key 
- 以上で鍵の設定は完了です。
 
OpenVPNの設定¶
- サンプル設定ファイルのコピー、編集
 (本当はtcpにしたいんだけど、体験上iptablesのルールが面倒みたい)# cp -p /usr/share/doc/openvpn-2.1.4/sample-config-files/server.conf /etc/openvpn/ # vi /etc/openvpn/server.conf # ------------------------------------------------------ # 有効な設定のみ記載 port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key # This file should be kept secret dh dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 192.168.34.0 255.255.255.0" keepalive 10 120 tls-auth ta.key 0 # This file is secret comp-lzo user nobody group nobody persist-key persist-tun status openvpn-status.log log-append openvpn.log verb 3 management localhost 7505 crl-verify crl.pem 
起動スクリプトの設定¶
- 次のファイルを設定する# vi /etc.init.d/openvpn # ------------------------------------------------------ # 変更箇所のみ記載 echo 1 > /proc/sys/net/ipv4/ip_forward 
- ルーティングを追加する(gw=自分のアドレスの行が追加されていること)# echo "any net 10.8.0.0 netmask 255.255.255.0 gw 192.168.34.n" >> /etc/sysconfig/static-routes # service network reload # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.8.0.0 192.168.34.n 255.255.255.0 UG 0 0 0 eth0 0.0.0.0 192.168.34.254 0.0.0.0 UG 0 0 0 eth0 
 
ログローテーション設定¶
- 設定ファイルの作成# vi /etc/logrotate.d/openvpn # ------------------------------------------------------ /var/log/openvpn.log { missingok notifempty sharedscripts postrotate /etc/rc.d/init.d/openvpn restart 2>&1 > /dev/null || true endscript }
 
起動設定¶
- 正常に起動すれば、起動設定を行う。# service openvpn start openvpn を起動中: [ OK ] [root@schatte openvpn]# chkconfig openvpn on [root@schatte openvpn]# chkconfig --list openvpn openvpn 0:off 1:off 2:on 3:on 4:on 5:on 6:off 
 
- 実際に利用するにはクライアントの構築が必要。
- 以上。
 
補足¶
クライアント証明書を破棄する。¶
- クライアント証明書の破棄、パスフレーズを忘れたなどでの作り直しの際
 (一端破棄しなければならない)に使用する。
- 次のコマンドを実行する
 (環境変数読み込み時の警告は無視する)# cd /etc/openvpn/easy-rsa/2.0/ # source vars # ./revoke-full client1 
- 廃止した証明書リストを更新する# cp -p keys/crl.pem /etc/openvpn/ 
- これで、この鍵を用いたVPN接続が出来なくなる。
- 同じ名前で別の鍵を再作成することが可能になる。
管理インタフェースの使い方¶
- 管理インタフェースで接続中のクライアントリストを表示する。# telnet localhost 7505 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. >INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info status 
- 管理インタフェースでクライアントを強制切断する。(上記の続き) kill clientname(statusで表示されるクライアント証明書の名前) 
- 管理インタフェースを終了する。(上記の続き) exit Connection closed by foreign host. 
¶
¶