OpenVPNは、SSLVPNを実現するソフトウェアです。
本ページは、多くを下記の情報に頼って書いています。より正確な内容をお求めの場合は、原著のほうをご参照ください。
具体的に、うちが実現している環境は、以下の通りです。
外部PC[仮想IP:10.8.0.6] -----> ルータ -----> 内部サーバ[仮想IP:10.8.0.1]
10.8.0.1 に対しては、LAN 環境にいるのと同様にアクセスができます。具体的には、どのポートにも自由に接続できます。
まずは、サーバ側に OpenVPN をインストールします。
# apt-get install openvpn
続いてクライアント側にも OpenVPN をインストールします。うちは Windows でしたので、GUI版クライアントをインストールしました(ダウンロード)
インストールを終えたら、VPN に必要な証明書や鍵の用意を行います。この作業は、openvpn に添付されているスクリプトを使うと、便利です。"easy-rsa" というディレクトリがあるので、それを "/etc/openvpn" などへコピーしてください。もし、見つからない場合は、locate コマンドなどで探してみてください。
続いて、鍵の生成を行ないます。"easy-rsa" ディレクトリへ移動します。
cd /etc/openvpn/easy-rsa
vars ファイルを開いて、KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL の値を入れてください。いずれの項目も空欄にしないように注意してください。
# . ./vars NOTE: when you run ./clean-all...
vars を実行して、環境変数の設定を行ないます。"NOTE:" とメッセージを出力しますが、これは正常です。(恥ずかしながら、これがエラーメッセージであると勘違いして、少しハマリました)
# ./clean-all
keys ディレクトリが生成されます。
# ./build-ca
このスクリプトは対話式で、認証局の証明書と鍵を生成します。ほとんどの項目にデフォルト値が入っていますが、CommonName は手動で入れる必要があります。
続いて、サーバの証明書と鍵を生成します。
# ./build-key-server server
基本的に、./build-ca と同じ流れで進みますが、最後に2回質問があるので、そこはきちんと [Y] を入力して、Return してください。何も入力しないで Return すると、作成に失敗します。
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n]
続いて、クライアントの証明書と鍵を作成します。複数のクライアントが必要な場合は、"client2", "client3" というように、適宜増やしてください。
# ./build-key client1
次に、鍵共有のための DH の設定を行ないます。サーバクライアント間で実際の暗号鍵を受け渡しするさいの、暗号経路を作るさいに利用するものです。
# ./build-dh
少し時間がかかります。うちの環境では、2分程度でした。
以上の処理により、easy-rsa/keys ディレクトリ配下に、必要な鍵と証明書ができています。
ca.crt | 認証局の証明書 |
ca.key | 認証局の鍵 |
dh.pem | DH パラメータ |
server.crt | サーバ証明書 |
server.key | サーバ鍵 |
client.crt | クライアント証明書 |
client.key | クライアント鍵 |
まず、サーバの設定を行ないます。"sample-config-files" ディレクトリを探します。見つからなければ、locate コマンドなどで探してください。
そのなかにある server.conf を、適当な場所に移動してください。
cp server.conf /etc/openvpn/
移動したあとは、編集を行ないます。ca、cert、key、dh を、それぞれ前節で生成したファイルに指定してください。
そして、server 項目で、サーバの VPN 用仮想IPアドレスを指定できますが、実際の LAN で使っているプライベートネットワークは指定してはいけません。ルーティングがおかしくなり、外部から参照がまったくできなくなります。リモートで作業している場合は致命的…。現地で対応しない限り、復旧不可です。
続いて、クライアントの設定を行ないます。前節で作成した証明書や鍵を、クライアントPCへコピーしてください。このさい、なるべく安全な経路を使うことが望ましいです。必要なものは、以下の3つです。
次に、設定ファイルを開きます。client.ovpn を "C:\Program Files\openVPN\sample-config" から "C:\Program Files\OpenVPN\config\" へコピーしてください。そして、client.ovpn を編集します。
サーバを起動します。
# openvpn /etc/openvpn/server.conf &
クライアントを起動します。タスクトレイにあるopenvpnのアイコン (パソコンモニタが2台並んだようなアイコン) をダブルクリックしてください。アイコンが緑色になれば接続成功です。黄色のままの場合は、問題があって、うまく接続できていません。
サーバで以下のようなログで失敗した場合、.crt ファイルがサイズ0 になっていないか確認してください。crt ファイル生成のときに、最後のほうの質問で [y/n] を正しく答えていないと、下記のような失敗が起きます。
Wed Jun 3 21:48:47 2009 OpenVPN 2.0.9 i486-pc-linux-gnu [SSL] [LZO] [EPOLL] built on Jun 11 2008 Wed Jun 3 21:48:47 2009 Diffie-Hellman initialized with 1024 bit key Wed Jun 3 21:48:47 2009 Cannot load certificate file /etc/openvpn/easy-rsa/keys/server.crt: error:0906D06C:PEM routines:PEM_read_bio:no start line: error:140AD009:SSL routines:SSL_CTX_use_certificate_file:PEM lib Wed Jun 3 21:48:47 2009 Exiting
クライアントで、以下のようなログで失敗した場合、
Tue Jul 13 08:33:43 2010 RESOLVE: Cannot resolve host address: my-server-1: [NO_DATA] The requested name is valid but does not have an IP address.
外部 PC や内部サーバのルーティングテーブルを設定することで、より自由にアクセスができます。
また、DNS による名前解決を偽装したい場合は、hosts ファイルを使うと便利です。具体的には、以下のように設定します。
sub.omoshiro-joho.com 10.8.0.1
これにより、sub.omoshiro-joho.com へのアクセスは、素のインターネット経由ではなく、SSLVPN 経由になります。sub.omoshiro-joho.com が LAN 側からのアクセスしか許可しない設定になっているときや、内部 DNS でのみ名前解決されている場合に、有用です。
余談ですが、Windows7 で hosts ファイルを編集するには、メモ帳を管理者権限で実行して、ファイルメニューから辿って開くと良いです。