VPSにOpenVPNサーバーを立ててみた

外出先で公共無線LANを使うのは危険が伴うよということで、少しでも安全を確保すべくVPSOpenVPNのサーバーを立ててみました。
利用したVPSSasSesのOsukiniサーバー Air 10です。現在キャンペーン価格でとても利用しやすくなっています。


設定以下メモ
なにはなくてもOpenVPNのインストールです。OSはdebian 64bitを利用しているのでaptでインストールです。

# apt-get install openvpn


サンプルファイルが/usr/share/doc/openvpn/examples/easy-rsa/2.0/に入っているので、移動して証明書の初期設定ファイルvarsを編集します。

# cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/
# nano -w vars
export KEY_COUNTRY="JP"
export KEY_PROVINCE="Saitama"
export KEY_CITY="Kawagoe"
export KEY_ORG="MyCA"
export KEY_EMAIL="%メールアドレス%"


続いて認証局の鍵を作成しますが、sudoで実行してもうまくできなかったのでsudo su(rootのパスワードをロックしているのでsuだけではrootになれない)してrootで作業しました。

# . ./vars
# ./clean-all
# ./build-ca

ここでOpenSSLが入っていないと怒られるかもしれないので、OpenSSLが入っていなければaptでインストールします。
OpenSSLが必要ならaptの依存関係に入れてあってもよくね? と思うのですが、なんらかの事情でもあるんですかね。
鍵の作成時にいくつか質問が出てきますが、varsを設定しているのでデフォルトのままEnterを押せば問題ないはずです。


次にサーバー用の鍵、クライアントの鍵、DiffieHellman、TLS-AUTH HMAC 共有鍵を作成します。クライアントはノートパソコン用とスマホ用に2つ作成しています。

# ./build-key-server server
# ./build-key client1
# ./build-key client2
# ./build-dh
# openvpn --genkey --secret ./ta.key


サンプルから設定ファイルをコピーしてきます。ついでに鍵ファイルもコピーしておきましょう。

# cp dh1042.pem /etc/openvpn
# cp server.crt /etc/openvpn
# cp server.key /etc/openvpn
# cp ca.crt /etc/openvpn
# cp ta.key /etc/openvpn
# cd /usr/share/doc/openvpn/examples/sample-config-files/
# gunzip server.conf.gz
# cp server.conf /etc/openvpn


/etc/openvpnに移動して設定ファイルを編集します。

# cd /etc/openvpn
# nano -w server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key 
dh dh1024.pem
server 192.168.2.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1"
push "dhcp-option DNS 163.43.128.4"
push "dhcp-option DNS 163.43.128.8"
client-to-client
keepalive 10 120
tls-auth ta.key 0
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

push "redirect-gateway def1"で全ての通信をVPN経由で行うように設定しています。


今度はサーバー内でIPv4をフォワードする為の設定と、iptablesで外部からOpenVPNの使用するポートに接続する等の設定後OpenVPNを再起動してサーバー側の設定は完了です。

# nano -w /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
# 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
# /etc/init.d/openvpn restart


続いてクライアント側の用意です。
今回はWindows7がクライアントになるのでOpenVPNのダウンロードページからopenvpn-install-2.3.1-I005-i686.exeをダウンロードしてインストールします。
鍵や設定ファイルの格納用フォルダを適当に作成してSCPなどで必要な鍵ファイルをクライアント側に落とし込みます。

C:>mkdir c:\openvpn
C:>cd c:\openvpn
C:\openvpn>dir /b
ca.crt
client1.crt
client1.key
ta.key


クライアント側の設定ファイルを作成してclient.ovpn等の名称で同じフォルダに入れておきます。

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


接続を行うには管理者権限でコマンドプロンプトを動かして

C:\openvpn>openvpn --config client.ovpn

とコマンドを実行すれば接続が開始されます。
はき出される文字列が「Initialization Sequence Completed」で終わっていれば接続成功です。
確認くんなどで接続元のIPアドレスVPNサーバーのIPアドレスになっていればVPS経由で接続されているということになるはずです。


当初OpenVPNの設定だけを終わらせてクライアントから接続をしてしまい、サーバー経由でインターネットに出ることができませんでした。sysctlの設定を忘れていましたね。
これで公共無線LANから接続してもそれなりにセキュリティが確保できるはず。ちゃんと暗号化されてるかちょっと心配ですけどねー。
そもそも公共無線LANから接続することがどれくらいあるのかは謎です。