VPSにOpenVPNサーバーを立ててみた
外出先で公共無線LANを使うのは危険が伴うよということで、少しでも安全を確保すべくVPSにOpenVPNのサーバーを立ててみました。
利用したVPSはSasSesの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から接続することがどれくらいあるのかは謎です。