SoftEtherからOpenVPNに乗り換える(ブリッジ編)
SoftEtherのライセンスがどうにも使いにくいのでOpenVPNに移行することにした。
要件としては、自宅LAN内のLinuxマシンをVPNサーバにし(Windowsでも同じ設定が可能)、外出先でノートPC(WindowsXP)を使用する時はVPN経由で自宅のLANに接続する。その際、実NICとサーバを結ぶトンネル以外のパケット(Webの観覧など)はすべて自宅のLAN(VPN)に流す。イメージとしては、トンネルをLANケーブルとして自宅のハブ(VPNサーバ)に接続する感じである。1度VPNを経由し自宅のルータから再びインターネットに出る分ネットワークのパフォーマンスは落ちるが、外部のマシンには自宅で使用しているISPのIPしか見えないため、外出先の機関名(ホスト名からばれやすい)などを隠すことが出来る。
インストールと基本的な設定はOpenVPN 2.0 HOWTOを参照すれば簡単に行える。気をつけるべきことはdev tapを使用することである。これはSoftEtherで言えば仮想ハブと仮想NICを1つに纏めたものに近い。このtapとサーバの実NICをブリッジすることで、SoftEtherのローカルブリッジ接続と同等のことを行うことが出来る。LAN上のハブ(の概念)をそのままVPNに持ち込むのなら、この方法が最適だ。
dev tapを使用した場合、server-bridgeの設定を行う必要がある。設定できる値はそれぞれ次の意味を持つ。
srever-bridge gateway mask pool_ip_start pool_ip_end
ゲートウェイとマスクは普段サーバが使用しているIPを使用すればよい。プールIPはクライアントがサーバに接続した際に使用されるIPの範囲なので適当に振っておく。
server-bridge 192.168.1.1 255.255.255.0 192.168.1.100 192.168.1.199
サーバ側のOpenVPNの設定で気をつける点はこれぐらいである。
OpenVPN自体はtapの追加しか行わないので、実NICとのブリッジは自力で行う必要がある。とはいえ、親切にもOpenVPNにそのためのスクリプトが付属しているので(/usr/share/openvpn-x.x/sample-script/bridge-*)、それを実行するだけで良い。CentOS4.2の場合、brctlコマンドが見つからないと言われるかもしれないが、yum install bridge-utils
などしてインストールすれば解決する。
上記のスクリプトは次のタイミングで実行する必要がある。
- run bridge-start
- run openvpn
- stop openvpn
- run bridge-stop
これを毎回手動で行うのは面倒だが良い解決策がある。/etc/init.d/openvpnを確認するとデーモンを立ち上げる前に「openvpn-startup」、デーモン終了後に「openvpn-shutdown」というスクリプトを実行しているのが分かる。rpmでインストールした場合これらのファイルは存在しないので、bridge-startとbridge-stopをそれぞれ配備してしまえばよい(/etc/openvpn内にシンボリックリンクを張るのが良いだろう)。これにより、ブリッジを操作するスクリプトがデーモンの起動・終了に合わせて自動的に呼び出されることになる。
サーバ側の設定はこれで完了なので、次はクライアント側の設定を行う。WindowsでOpenVPNを使用する場合はGUIインターフェース付きの「OpenVPN GUI for Windows」をインストールすると操作がしやすいだろう。設定自体は先ほどのHOWTOの通りに行えばほぼ完了である。
1つだけ気をつける点はredirect-gateway def1の1行を追加して、LAN(VPN)内のゲートウェイをデフォルトゲートウェイとして使用するように設定することだ。この設定により、自宅のVPNサーバ当てのパケット、つまりトンネルの維持に使用するパケットだけを実NICのゲートウェイから流し、それ以外のインターネット宛てのパケットは自宅LAN経由で流れるようにルーティングテーブルが変更される。この1行がないとVPN宛てのパケット以外は実NICに設定されたゲートウェイから流れてしまい、身元の隠蔽が出来なくなってしまうので注意が必要だ。なお、SoftEtherと違い、ルーティングメトリックの設定も自動で行ってくれるので、Tapデバイス(仮想NIC)のメトリック設定は「自動」にしておいても問題ない。
以上の設定でVPN上の仮想的なハブに接続することが出来る。それほど面倒ではない手順なので、1つ1つ手順を確認しながら確実に行うと良いだろう。