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.
¶
¶