iPhoneでOpenVPNを使うために、サーバーの設定、証明書・鍵の作成・設定、iPhoneを設定するところまで行ったので、そのメモ。
なお、本稿の初稿は2013年4月6日(土)。同じドメイン内の別のURLで公開していたが、Webサイトの全面的な再編とリニューアルに伴って、本ブログ側に転載する。以下、初稿時のままで掲載。
外出先から自宅にVPN接続するため、PPTPサーバー内蔵のブロードバンドルーターを用いてきました。VPNを使いたくなる用途はかなりあります。自宅へのリモートアクセス、公衆無線LAN使用時のセキュリティ確保(公衆無線LANでの暗号は強固とは限らないので)、その他いろいろです。お手軽便利に使えてきたものの、いかんせんVPNのプロトコルとしてPPTPは決して堅牢なものとはいえず、いつもその点が気がかりでした。代替用としてL2TP/IPsecサーバーを自宅のLinuxサーバーにインストールしようとしたものの、難解すぎて挫折していました。L2TP/IPsecサーバー機能を内蔵したルーター(ヤマハのRTX-810とか)の購入を検討したこともあったものの、価格その他で購入に踏み切れずにいました。
iOS用のOpenVPN接続ソフト「OpenVPN Connect」が開発されて、AppleのApp Storeからダウンロードできるようになったという話を聞いて、OpenVPNをLinuxサーバーにインストールして試してみたところ、L2TP/IPsecサーバー構築に挑んだ時の苦労はなんだったのだろうというほど、ラクにインストール・設定ができました。セキュリティはL2TP/IPsecと同等以上、インストールは簡単、iPhoneでも使える、使わない手はありません。
iPhone, iPodTouch, iPad, iPad miniからOpenVPN接続できる、考えるだけでワクワクします。OpenVPNのサーバー設定からiPhoneでの設定までの手順を備忘録としてまとめます。なおこの接続ソフトはApple公認のものなので、JailBreak(脱獄)は不要です。
ちなみに、LinuxサーバーにはぷらっとホームのOpenBlocksを使っています。ファンレス、ディスクレスで堅牢なので、この手のサーバー運用にはぴったりです。
【インストール環境】
以下のようなインストール環境・前提条件で、インストールと設定を行います。
- サーバー1台に対して、クライアント1台がリモートアクセスする環境を想定。
- Webブラウズを含む、すべてのパケットがVPNを経由するようにする。
- サーバーOSは、Debian GNU Linux 6.0
- サーバー背後のLAN環境は192.168.0.0/24とする。
- ネットワーク環境に応じて使い分けできるよう、接続方法を2種類用意する。
- VPNサーバーはルーティングモード(TUNデバイス)で動作させる。
OpenVPNでは、デフォルトでUDPプロトコル1194番を使います。このポートだけでもかまわないものの、ネットワーク環境に応じて使い分けができるよう、接続方法(VPNトンネル)を2種類用意することとし、ひとつはデフォルトのUDPプロトコル1194番、もうひとつはTCPプロトコル443番(httpsで使われているポート)を使うこととします。httpsはインターネット利用の上で必須なサービスであり、ポートをふさがれるなどの理由でパケットが通らない可能性は低いと考えられます。(接続方法を2種類用意するものの、証明書を共用しているだめ、2種類同時に使うことはできません。)
【サーバーへのインストールと設定】
以下のような流れで、LinuxサーバーにOpenVPNをインストールし、設定していきます。なおサーバーOSはDebian GNU Linux 6.0です。これ以外のLinuxでは、インストールのコマンド、およびルーティング設定時のディレクトリ、ファイル名、コマンド名が若干違うかもしれません。
- OpenVPNソフトのインストール
- 証明書・鍵の作成と配置
- OpenVPNの設定
- ルーティングと自動起動の設定
- ファイアーウォール設定変更
- OpenVPN起動
まずOpenVPNをインストールします。Linuxのソフトウェアは最新の状態に更新されているものとします。(aptitude update; aptitude safe-upgrade;)
# aptitude install openvpn
次に、証明書と鍵の作成と配置を行います。認証局(CA)とその鍵、サーバー証明書とその鍵、クライアント証明書とその鍵、DHパラメータ、TLS認証鍵、合計8個作成します。
# cd /etc/openvpn # cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa # cd /etc/openvpn/easy-rsa # source ./vars # ./clean-all # ./build-ca マスタCA証明書とその鍵が./keys内にできる。(ca.crtとca.key) # ./build-key-server server サーバー証明書とその鍵が./keys内にできる。(この場合はserver.crtとserver.key) 途中でchallenge passwordを聞かれるので、適当に入力します。(このパスワードは実際のVPN接続時には使いません。) なお引数のserverは、server以外でもかまいません。(後述のOpenVPNの設定ファイルを修正する必要が生じますが。) # ./build-key client1 クライアント証明書とその鍵が./keys内にできる。(この場合はclient1.crtとclient1.key) 途中でchallenge passwordを聞かれるので、適当に入力します。(このパスワードは実際のVPN接続時には使いません。) なお引数のclient1は、client1以外でもかまいません。(後述のOpenVPNの設定ファイルを修正する必要が生じますが。) # ./build-dh DH(Diffie Hellman)パラメータが./keys内にできる。(dh1024.pem) このコマンドは実行完了まで多少時間がかかります。 # openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key TLS認証鍵が./keys内にできる。(ta.key)
■サーバー側に配置する証明書・鍵 下記ファイルを/etc/openvpn内にコピーし、chmodコマンドでパーミッションを設定する。(カッコ内はパーミッション) ca.crt (644) server.crt (644) server.key (600) dh1024.pem (644) ta.key (600) ■クライアント側で必要な証明書・鍵 下記ファイルをもとに、ovpnプロファイルを作ります。詳細は後述します。 ca.crt client1.crt client1.key ta.key なお、ca.keyは証明書に署名する時にだけ必要なので、特に配置する必要はありません。 /etc/openvpn/easy-rsa/keys内にある証明書・鍵はUSBメモリなど安全な場所(他からアクセスできない環境)に保管しましょう。保管したら、/etc/openvpn/easy-rsa/keys内は空にして大丈夫です。
次に、OpenVPNサーバーの設定ファイルを編集します。/etc/openvpn/server.confを元に必要な箇所を修正します。なお、2種類の接続方法を準備するため、設定ファイルも2種類(server-tun0.confとserver-tun1.conf)用意し、/etc/openvpn内に保存します。なお2種類の接続方法(2種類のトンネル)を用意する場合、ポート番号、サブネットアドレスを別々にする必要があるので、そのように設定します。
# cd /etc/openvpn # cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn # gunzip ./server.conf.gz # chmod 644 server.conf # cp server.conf server-tun0.conf # cp server.conf server-tun1.conf # mv server.conf server.conf.backup
■server-tun0.confの設定内容 port 1194 proto udp dev tun0 ca ca.crt cert server.crt key server.key dh dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp0.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 192.168.0.1" keepalive 10 120 tls-auth ta.key 0 cipher AES-256-CBC user nobody group nogroup persist-key persist-tun status openvpn-status.log verb 3
■server-tun1.confの設定内容 port 443 proto tcp dev tun1 ca ca.crt cert server.crt key server.key dh dh1024.pem server 10.8.1.0 255.255.255.0 ifconfig-pool-persist ipp0.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 192.168.0.1" keepalive 10 120 tls-auth ta.key 0 cipher AES-256-CBC user nobody group nogroup persist-key persist-tun status openvpn-status.log verb 3
次にルーティングの設定を行います。ここまでの設定だけだと、クライアントからOpenVPNサーバーに接続することはできても、そこから外へ出て行けないため、Webブラウズなどができません。
■IPv4パケットの転送設定 # vi /etc/sysctl.conf (net.ipv4.ip_forward=1の行を有効化する。) # sysctl -p /etc/sysctl.conf # cat /proc/sys/net/ipv4/ip_forward (1と表示されれば、OK) ■iptablesの設定 インターフェース名がeth0の場合は下記のようになります。 (インターフェース名は、route -nコマンドで確認可能。) iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 -j MASQUERADE OS起動時に設定されるようにするには、/etc/network/interfaces内に上記2行を追加します。 (post-up /sbin/iptables ...といった書き方になると思います。) ■OS起動時のOpenVPN自動起動 /etc/network/if-up.d/openvpn内に下記行を追加します。 $OPENVPN start /etc/network/if-down.d/openvpn内に下記行を追加します。 $OPENVPN stop
次にファイアーウォールの設定を変更し、UDPプロトコル1194番およびTCPプロトコル443番宛のパケットを通すようにします。ファイアーウォールの設定はさまざまと思いますので、詳細はここでは割愛します。OpenVPNサーバーの設定は以上です。OpenVPNを起動します。
# /etc/init.d/openvpn start
【iPhoneの設定】
以下のような流れで、iPhoneを設定していきます。最初にAppleのApp Storeから「OpenVPN Connect」をダウンロードし、インストールしておいてください。
- ovpnプロファイルの作成
- ovpnプロファイルのiPhoneへのコピー
- ovpnプロファイルのインポート
- iPhoneで実際に接続する
クライアントのiPhoneに証明書や鍵をインポートするために、ovpnプロファイルを作成します。ovpnプロファイルそのものはテキストファイルで、その構造には2種類あります。ひとつは証明書や鍵を別個のファイルとして持つ構造、もうひとつは証明書や鍵すべてをひとつのovpnプロファイルに入れ込んでしまう構造です。ここではひとつのovpnプロファイルに証明書や鍵すべてを入れ込む構造をとることとします。証明書や鍵ファイルそのものはバイナリファイルではなくテキストファイルなので、簡単にコピペ可能です。
ovpnプロファイルを作成したら、拡張子ovpnのファイル名で保存します。
■UDPプロトコル1194番での接続用(tun0)ovpnプロファイル XXX.XXX.XXX.XXXにはOpenVPNサーバーのIPアドレスを入れてください。 tls-client key-direction 1 remote XXX.XXX.XXX.XXX cipher AES-256-CBC port 1194 proto udp---- ca.crt内の中身を丸ごとここにコピペする。 ---- ---- client1.crt内の中身を丸ごとここにコピペする。 ---- ---- client1.key内の中身を丸ごとここにコピペする。 ---- ---- ta.key内の中身を丸ごとここにコピペする。 ----
■TCPプロトコル443番での接続用(tun1)ovpnプロファイル XXX.XXX.XXX.XXXにはOpenVPNサーバーのIPアドレスを入れてください。 tls-client key-direction 1 remote XXX.XXX.XXX.XXX cipher AES-256-CBC port 443 proto tcp---- ca.crt内の中身を丸ごとここにコピペする。 ---- ---- client1.crt内の中身を丸ごとここにコピペする。 ---- ---- client1.key内の中身を丸ごとここにコピペする。 ---- ---- ta.key内の中身を丸ごとここにコピペする。 ----
次にovpnプロファイルをiPhoneにiTunes経由でコピーします。iTunesでOpenVPN Connectにファイルをコピーする箇所があるので、そこにコピーします。(これについては他にもキャプチャ画面付で解説しているサイトがあるので、詳細は割愛します。)ovpnプロファイルをiPhoneにコピーしたら、iPhoneでOpenVPN Connectを起動します。するとインポートしたプロファイルが表示されるので、+ボタンを押してインポートします。
プロファイルのインポートが完了すると、OpenVPN接続が可能です。Disconnectedの下のスイッチを動かすと、接続します。表示がConnectedになり、緑色ランプが表示され、画面上部にVPNマークが表示されます。
iPadにも入れてみました。手順はiPhoneの場合と同様です。