前書き
FreeBSD 8.0-RELEASE 向けに説明しています。
FreeBSD 6.x-RELEASE 以前向けの説明は OpenVPN install (old version) を御覧下さい。
ただし OpenVPN の設定内容がかなり間違ってるので、設定内容については当ページの設定ファイルを御覧頂いた方がよいかもしれません。
ブリッジモードとルーティングモード
OpenVPN は「ブリッジモード」と「ルーティングモード」の 2種類がある。
今回はこのうち「ブリッジモード」を使用して、OpenVPN サーバー側にあるネットワーク上の PC 全てにアクセスできるような環境を構築してみた。
SoftEther ユーザー向け:ブリッジモードについて
SoftEther ユーザー向け限定の話になるが、OpenVPN でブリッジモードを構築する際は、SoftEther のような仮想 NIC でローカルのブリッジに接続する必要はない。
これは、OpenVPN をブリッジモードで動作させた場合は、ブリッジも自分自身をブリッジに接続するためである。
カーネルコンフィギュレーション

TAP デバイスとブリッジデバイスを使用するため、カーネルモジュールのロードが必要となる。
下記コマンドにて if_tap と if_bridge をロードする。

# kldload if_tap
# kldload if_bridge

ロードしたら再起動時に自動的にロードするように、/boot/loader.conf に下記 2行を追記する。

if_bridge_load="YES"
if_tap_load="YES"
サーバーへのインストール
ソースのダウンロード
http://openvpn.net/ からソースをダウンロードして展開。
今回は 2.1 系を使用する。
ビルド
いつも通りのビルド方法で。
% ./configure --disable-lzo --prefix=/usr/local/openvpn
% make
# make install
クライアントへのインストール
バイナリのダウンロード
OpenVPN.JP にて Vista 系でも使える Windows GUI 版がダウンロードできる。
インストール
インストーラーを実行してインストールする。
証明書/鍵の作成と各マシンへの配付
ブリッジで複数クライアントの接続を行う場合は証明書/鍵が必要となるので、これらを自力で作成する。
作成用スクリプトは OpenVPN のソースディレクトリ配下 (easy-rsa ディレクトリ) にあらかじめ用意されているのでこれを使用する。
スクリプトの修正
vars スクリプト内の変数及びちょっとした修正を行う。
easy-rsa スクリプト群はどうも vars スクリプトの環境変数を上手く引き継げないようなので、これも合わせて修正。

まずは /(OpenVPN ソースディレクトリ)/easy-rsa/ に移動しておく。
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY=***
export KEY_PROVINCE=***
export KEY_CITY=***
export KEY_ORG=***
export KEY_EMAIL=***

$1 ←これを追加
最後の方にある KEY_* はデフォルトでも良いし自分で好きな値に書き換えても良い。
最終行の $1 は、vars スクリプトで環境変数が設定された後にスクリプトを呼び出すための処置。
ルート CA 認証局の開設
まずは証明書に署名を行うためのルート CA 認証局を開設する。
一度きりの実行でよい。
# ./vars "./clean-all"
# ./vars "./build-ca"
"Organizational Unit Name" は空のまま。
"Common Name" はなんでも良いが、今回は "OpenVPN-CA" という文字列を使用した。
サーバー証明書/鍵の作成
サーバーで使用する証明書と鍵を作成する。
一度きりの実行でよい。
# ./vars "./build-key-server server"
"Organizational Unit Name" は空のまま。
"Common Name" は "server" とした。
"A challenge password" は空のまま。
"An optional company name" は空のまま。
"Sign the certificate?" (サインしても良いか?) には "y"。
"1 out of 1 certificate requests certified, commit?" (1/1証明書要求を確認したが良いか?) には "y"。
DH (Diffie-Hellman) パラメータファイルの作成
サーバーで使用する "DH パラメータ" ファイルを作成する。
一度きりの実行でよい。
# ./vars "./build-dh"
マシンパワーに左右されるほどの時間がかかるのでのんびりお待ち下さい。
といっても PentiumIII 800MHz で数分だが。
クライアント証明書/鍵の作成
クライアントで使用する証明書と鍵を作成する。
クライアント単位で個別の証明書が必要なので、クライアントが増えたらこの操作を行うこと。
# ./vars "./build-key client1"
"Organizational Unit Name" は空のまま。
"Common Name" は "client1" とした。名前は何でもよいので証明書ファイル名の名前を指定するとよい。
"A challenge password" は空のまま。
"An optional company name" は空のまま。
"Sign the certificate?" (サインしても良いか?) には "y"。
"1 out of 1 certificate requests certified, commit?" (1/1証明書要求を確認したが良いか?) には "y"。
各マシンへの配付
証明書/鍵が出来たら、ファイルをそれぞれのマシンへ配付する。
OpenVPN クライアントへ配付
OpenVPN インストールディレクトリ配下にある config ディレクトリに置くと良い。
  • クライアント証明書 (client*.crt)
  • クライアント鍵 (client*.key)
  • ルート CA 証明書 (ca.crt)
client*.crt と crient*.key は、1台につき 1ペアで配付すること。
例えば OpenVPN クライアントが 3台あるならば、OpenVPN クライアント 1台目には client1.*、同 2台目には client2.* というふうに配付する。
OpenVPN サーバーへ保存
今回は始めに作成した /usr/local/openvpn/keys/ ディレクトリに置く。
  • サーバー証明書 (server.crt)
  • サーバー鍵 (server.key)
  • ルート CA 証明書 (ca.crt)
  • DH パラメータ (dh*.pem)
余ったファイルは削除せずに保存しておくこと。
設定ファイルの準備
設定ファイルはサーバー用とクライアント用を用意する。
サーバー用は OpenVPN サーバーの /usr/local/openvpn/etc/ にコピーする。
クライアント用は OpenVPN インストールディレクトリ配下の config にコピーする。
ブリッジ生成スクリプトの作成
Bridge Up 用と Bridge Down 用スクリプトの 2種類を作成する。
ファイルは /usr/local/openvpn/sbin/ に置く。
起動スクリプトの作成
スタートアップ用スクリプトを作成する。
これを /usr/local/etc/rc.d/ に置く。
OpenVPN サーバーの起動とクライアントからの接続

まずは手動で起動してみる。

# /usr/local/openvpn/sbin/ --config /usr/local/openvpn/etc/bridge.conf
デーモンで起動せずフロントエンドで起動するので、エラーを吐いていないかを確認。
エラーを吐いているなら適時修正する。

エラーを吐いていないならば、

を確認する。
ちなみに tap デバイスに IP アドレスは必要ない。
# ifconfig -a
tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
         ether 00:bd:12:11:69:00
         inet 0.0.0.0 netmask 0xff000000 broadcast 0.255.255.255
         Opened by PID ****
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
         ether 5e:5b:4b:b4:c6:fd
         inet 192.168.1.253 netmask 0xffffff00 broadcast 192.168.1.255
         id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
         maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
         root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
         member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                 ifmaxaddr 0 port 3 priority 128 path cost 2000000
         member: re0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                 ifmaxaddr 0 port 1 priority 128 path cost 200000
※一部省略

確認が出来たら CTRL+C で強制終了し、tap デバイスが DOWN しているか、及びブリッジが削除されているかを確認する。

# ifconfig -a
tap0: flags=8802 metric 0 mtu 1500
         ether 00:bd:12:11:69:00
※一部省略

正常に起動できたことが確認できたら起動スクリプトで起動させる。

OpenVPN サーバーが起動したら今度は OpenVPN クライアントの接続テストを行う。
今回は Windows 用クライアントで説明をする。
タスクトレイに入っているアイコンを右クリック→ "Connect"、もしくはアイコンのダブルクリックで接続を行う。
接続が完了したら "client is now connected." と出るが、これが出ても安心は出来ず、DHCP から IP アドレスが配付されていない可能性もあるので確認を行うこと。

C:\>ipconfig
Ethernet adapter OVPN:
   接続固有の DNS サフィックス . . . :
   説明. . . . . . . . . . . . . . . : TAP-Win32 Adapter V9
   物理アドレス. . . . . . . . . . . : 00-FF-EB-13-87-40
   DHCP 有効 . . . . . . . . . . . . : はい
   自動構成有効. . . . . . . . . . . : はい
   IPv4 アドレス . . . . . . . . . . : 192.168.1.100(優先)
   サブネット マスク . . . . . . . . : 255.255.255.0
   リース取得. . . . . . . . . . . . : 2010年7月4日 2:05:44
   リースの有効期限. . . . . . . . . : 2011年7月4日 2:05:44
   デフォルト ゲートウェイ . . . . . :
   DHCP サーバー . . . . . . . . . . : 192.168.1.0
   DNS サーバー. . . . . . . . . . . : 192.168.1.10
   プライマリ WINS サーバー. . . . . : 192.168.1.10
   NetBIOS over TCP/IP . . . . . . . : 有効
この状態で OpenVPN クライアントと OpenVPN サーバー両方からお互いのネットワーク上に居る PC に対して ping を打ってみる。
ping が届かない場合は、ルーティングのチェック (通るべき所を通らなかったり、通るべきではないところを通ったりしていないか) と、OpenVPN NIC と tap デバイスに IP アドレスが割り当てられているかを確認する。

あとは NET VIEW コマンドで相手の PC 群が見えるかどうか、共有ディレクトリにアクセスできるかなどを確認して完了となる。
もしデフォルトで OpenVPN 経由の通信を行いたいのであれば、クライアント側で redirect-gateway def1 を設定するか、もしくはサーバー側で push "redirect-gateway def1" を設定すればよい。
OpenVPN for Windows 利用時の注意
redirect-gateway def1 で接続している際、nslookup の DNS が OpenVPN の接続先にある DNS ではなくローカルで指定された DNS を見に行くようになっているが、これは Windows の nslookup の仕様で、nslookup はバインドされているインターフェイスの順序で一番上にあるインターフェイスの DNS 設定を参照するという仕様のため。
解決方法は
http://support.microsoft.com/kb/311218
を参照のこと。
OpenVPN for PocketPC

OpenVPN for PocketPC を au IS02 (同 docomo T-01B) で使えたので簡単に説明する。

使用したバージョンは 2.1.0。

設定ファイルは client.conf をそのまま使える。
ただし鍵の場所は client.conf に記述している注意事項に沿ってフルパスを指定する。

OpenVPN Manager は頻繁に使用しないのであればリソース節約のためにも手動起動の方が良い。
下図は OpenVPN Manager (Connection) を起動した際の各ペインの情報をキャプチャしたものとなる。

Settings Settings2 TAP VPN

変更したのは Settings の "Try to ping servers on connect" のチェックを外しただけとなる。

接続は Menu の中にある ovpn ファイルの名前 (今回は client) をタップする。

Start

するとしばらくして TAP ペインのアダプタのステータスが "in use" になり、ネットワーク接続アイコンが接続状態 (←→) になるので、 その状態が OpenVPN 鯖と接続された状態となる。

Connected

この後ブラウザで REMOTE_ADDR を見られるようなサイトで OpenVPN 鯖から接続していることになっているかを必ず確認する。

切断方法は少しややこしく、一旦 WindowsMobile の Today まで戻らなければならない。
NX!UI のメニューバー右端の「田」→「設定」→ステータスバーの「田」→「WindowsMobile へ」
で Today に戻れるので、最下段にある小さなアイコンを見つける。

connected icon

黄緑色は接続中を示しているので、このアイコンをなんとかタップする。
すると下図のようにメニューが出るので「Signal stop all」をタップする。

stop menu

するとアイコンが黒くなり、上の方のネットワーク接続アイコンが消えるので、この状態が切断状態となる。

Stopped

なお、再接続を行う場合は Today まで降りてきて小さなアイコンをタップし接続を行わなければならないので、切断した後はもう一度アイコンをタップして Exit で終了させておいた方がよい。
こうすると NX!UI のアイコンで Manager ウィンドウを参照することが出来る。

おまけ
OpenVPN クライアントで "Routing and Remote Access" サービスを起動し、OpenVPN クライアントが属するネットワークの PC で OpenVPN クライアントをゲートウェイに設定すると、OpenVPN クライアントではない PC からも OpenVPN サーバー側の PC などにアクセスできる。
戻り側のルーティングも必要なので、OpenVPN サーバー側のアクセス対象 PC でもルーティングを切っておかなければならないことに注意。