Conoha VPSにOpenVPNを立てる

今回VPNを作るのは通信の安全性を確保するというよりは、物理的に分散した場所にあるマシンをどこからでも管理できるようにしたいという目的になります。

公共のWiFiをより安全に利用する場合は以前自宅に構築したL2TP/IPsecに接続し、各管理したいマシンはOpenVPNでConoHa VPSに接続します。

最初は標準のCentOSでやってみたのですが、構築後の接続がうまくいかないので使い慣れたdebianで環境を構築しています。

以下設定メモ
まずはopenvpnをインストールします。
後で証明書関係をまとめるために一緒にzipもインストールしました。

# sudo apt-get install openvpn zip

インストールが完了したらeasy-rsaのディレクトリに移動して証明書を作成します。

# cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/
# sudo nano -w ./vars

下記の部分を変更しました。

export KEY_COUNTRY="JP"
export KEY_PROVINCE="Saitama"
export KEY_CITY="Kawagoe"
export KEY_ORG="MyConoHa"
export KEY_EMAIL="%メールアドレス%"

varsを実行して各種証明書とキーを作成しますが、以前もrootにならないと動いてくれなかったので一時的にrootになります。
証明書作成時にいくつか質問が出てきますが、varsファイルを編集しているので変更した内容がデフォルト値になっていると思います。

# sudo su
$ . ./vars
$ ./clean-all
$ ./build-ca
$ ./build-key-server conoha
$ ./build-key mac
$ ./build-dh

サーバーの証明書はconohaという名前にし、クライアント用にはmacの他にも6つほど証明書を作成しています。接続するクライアントの数だけ,/build-key hogeを実行しておきます。

証明書の作成が終わったら証明書なんかを/etc/openvpnディレクトリにコピーします。

$ cd keys/
$ cp dh1024.pem /etc/openvpn/
$ cp conoha.crt /etc/openvpn/
$ cp conoha.key /etc/openvpn/
$ cp ca.crt /etc/openvpn/

証明書作りの最後に/etc/openvpnに移動してTLS-AUTHキーを作成します。

$ cd /etc/openvpn/
$ openvpn --genkey --secret ./ta.key

一通り作成が終わったら設定ファイルを用意します。サンプルをコピーしてきて編集すればOK。

$ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ gunzip server.conf.gz
$ nano -w ./server.conf

設定では全ての通信をOpenVPN経由で行うpush "redirect-gateway def1"を設定せず、OpenVPN経由で接続される仮想ネットワーク(今回は192.168.2.0/24)に接続するroute設定をpushさせます。

port 1194
proto udp
dev tun
ca ca.crt
cert conoha.crt
key conoha.key
dh dh1024.pems
erver 192.168.2.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.2.0 255.255.255.0"
client-to-client
keepalive 10 120
tls-auth ta.key 0
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

システムの設定でパケットの転送を許可します。

$ nano -w /etc/sysctl.conf
net.ipv4.ip_forward = 1
$ sysctl -p

次にiptablesで転送の設定をします。

$ iptables -A INPUT -p udp --dport 1194 -j ACCEPT
$ iptables -A INPUT -i tun+ -j ACCEPT
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ iptables -A FORWARD -i tun+ -j ACCEPT
$ iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT
$ iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$ iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
$ iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

作成したコンフィグファイルで正常に起動できるか試します。

$ openvpn --config ./server.conf

これでエラーを出さずに接続待機状態になればOK。Ctrl-Cで終了してデーモンを再起動します。

$ sudo service openvpn restart


続いてクライアント側の用意です。
Macで使用するのでTunnelblikを使用しました。
鍵と証明書はscpなどの適当な方法でサーバーから取得しておきます。
~/Libraryにopenvpnディレクトリを作成してそこに鍵と証明書を配置します。配置ができたらクライアント用の設定ファイルconfig.ovpnを作成します。内容は下記のような感じで。

client
tls-auth ta.key 1
dev tun
proto udp
remote %OpenVPNサーバーのIPアドレス% 1194
ca ca.crt
cert mac.crt
key mac.key
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3

この状態でTunnelblikを起動するとconfig.ovpnをTunnelblikに取り込みつつ必要なファイルを~/Library/openvpn/conoha.tblk/Contents/Resources/に移動して接続の準備が完了します。

Tunnelblikのポップアップで接続をクリックすれば接続・認証を経てVPNが確立すると思います。