* OpenVPNの設定 [#m51a6e22]

OpenVPNは、SSLVPNを実現するソフトウェアです。

本ページは、多くを下記の情報に頼って書いています。より正確な内容をお求めの場合は、原著のほうをご参照ください。
- [[OpenVPN 2.0 Japanese Translation:http://freescitech.net/2/ovpn2_howto_ja.html]]

** 何ができる? [#bb313ced]
具体的に、うちが実現している環境は、以下の通りです。

 外部PC[仮想IP:10.8.0.6] -----> ルータ -----> 内部サーバ[仮想IP:10.8.0.1]

10.8.0.1 に対しては、LAN 環境にいるのと同様にアクセスができます。具体的には、どのポートにも自由に接続できます。


** インストール [#l4d36f03]
まずは、サーバ側に OpenVPN をインストールします。
 # apt-get install openvpn

続いてクライアント側にも OpenVPN をインストールします。うちは Windows でしたので、GUI版クライアントをインストールしました([[ダウンロード:http://openvpn.se/files/install_packages/]])

** 証明書や鍵の生成 [#r150e022]
インストールを終えたら、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|クライアント鍵|

** 設定ファイル [#d1551768]
*** サーバの設定 [#jdffdb23]
まず、サーバの設定を行ないます。"sample-config-files" ディレクトリを探します。見つからなければ、locate コマンドなどで探してください。

そのなかにある server.conf を、適当な場所に移動してください。
 cp server.conf /etc/openvpn/

移動したあとは、編集を行ないます。ca、cert、key、dh を、それぞれ前節で生成したファイルに指定してください。

そして、server 項目で、サーバの VPN 用仮想IPアドレスを指定できますが、&color(red){実際の LAN で使っているプライベートネットワークは指定してはいけません};。ルーティングがおかしくなり、外部から参照がまったくできなくなります。リモートで作業している場合は致命的…。現地で対応しない限り、復旧不可です。

*** クライアントの設定 [#z6cc8871]
続いて、クライアントの設定を行ないます。前節で作成した証明書や鍵を、クライアントPCへコピーしてください。このさい、なるべく安全な経路を使うことが望ましいです。必要なものは、以下の3つです。
- 認証局の証明書 (サーバと共通)
- クライアント証明書
- クライアント鍵

次に、設定ファイルを開きます。"C:\Program Files\OpenVPN\config\client.ovpn" になります。ca、cert、key を、正しいパスで設定してください。
次に、設定ファイルを開きます。client.ovpn を "C:\Program Files\openVPN\sample-config" から "C:\Program Files\OpenVPN\config\" へコピーしてください。そして、client.ovpn を編集します。
- ca、cert、key を、正しいパスで設定してください
- remote my-server-1 を、正しい vpn サーバのアドレスに変更してください

** 起動 [#e0bde9b2]
サーバを起動します。
 # openvpn /etc/openvpn/server.conf &

クライアントを起動します。タスクトレイにあるopenvpnのアイコン (パソコンモニタが2台並んだようなアイコン) をダブルクリックしてください。アイコンが緑色になれば接続成功です。黄色のままの場合は、問題があって、うまく接続できていません。

** トラブルシューティング [#j72488eb]
*** 証明書の作成ミス [#n0b20406]
サーバで以下のようなログで失敗した場合、.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

*** 名前解決ミス [#t9043f6f]
クライアントで、以下のようなログで失敗した場合、hosts ファイルにそのホスト名に対応する IP アドレスが正しく登録されているか確認して下さい。
クライアントで、以下のようなログで失敗した場合、

 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.

上記の例の場合、hosts ファイルに以下を追加します。xx.yy.zz.aa は、VPNサーバのあるグローバルIPアドレスです。
 xx.yy.zz.aa  my-server-1

余談ですが、Windows7 で hosts ファイルを編集するには、メモ帳を管理者権限で実行して、ファイルメニューから辿って開くと良いです。
** ルーティングテーブルなどの設定 [#dda34c74]
外部 PC や内部サーバのルーティングテーブルを設定することで、より自由にアクセスができます。

また、DNS による名前解決を偽装したい場合は、hosts ファイルを使うと便利です。具体的には、以下のように設定します。

 sub.omoshiro-joho.com 10.8.0.1

これにより、sub.omoshiro-joho.com へのアクセスは、素のインターネット経由ではなく、SSLVPN 経由になります。sub.omoshiro-joho.com が LAN 側からのアクセスしか許可しない設定になっているときや、内部 DNS でのみ名前解決されている場合に、有用です。

余談ですが、Windows7 で hosts ファイルを編集するには、メモ帳を管理者権限で実行して、ファイルメニューから辿って開くと良いです。

----
** 履歴 [#u2c24a02]
- 2010/07/13 ぼくぴ クライアント側の内容を追記
- 2009/06/18 ぼくぴ 新規追加

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS