OpenVPNのtapブリッジングでDHCPを使う場合のTips

最終的には面倒になって投げ出したのだが、何かの役に立つかもしれないのでメモしておく

OpenVPN2.xでtapデバイスをブリッジして使う場合、仮想的にL2でVPN先に接続されていることになる。そのため原理的には、DHCPも接続先のネットワークにすでに存在するネイティブなDHCPサーバを利用できるのであるが、実際のところ面倒な問題がついて回る。そのためOpenVPNの標準はOpenVPN自体がDHCP的な機能を提供し、VPN経由で接続するクライアントには独自にIPを払い出している。今回はサーバ側にLinux(Centos5.5)、クライアント側にMacOS10.5のTunnelblickを利用した環境での手順となる。ネイティブDHCPを利用する場合、クライアントの環境が比較的重要になるのでほかの環境では異なる結果になる可能性がある。

まず、ネイティブDHCPを利用するために、OpenVPNサーバのDHCP機能をオフにする必要がある。bridge-server構文を利用している場合はコメントアウトし、以下の行を付け足す。

mode server
tls-server

次に、念のためdhcpdをリスタートする。OpenVPNがbr0を作る前にdhcpdがスタートしてる場合、dhcpdがbr0でListenしないことがある。dhcpd側であらかじめ設定してあれば必要ないかもしれない。

クライアント側の設定ファイルは特に変更する必要がない。ただし、Mac OSXのTunnelblickをクライアントとして利用している場合、tapデバイスのDHCPが自動で有効にならないためTunnelblickの起動スクリプトに細工をする必要がある。以下のIssueが詳しい。

具体的には、/Applications/Tunnelblick.app/Contents/Resources/client.up.tunnelblick.shの先頭らへんに次の1行を追加する。

/usr/sbin/ipconfig set tap0 DHCP

これで自動的にDHCPが有効になり、ネイティブDHCPサーバからIPを取ってこれるようになる。down側のスクリプトにもipconfig top0 NONEを足した方がいいのかもしれないが、どうせすぐDevice自体が削除されるので必要性は薄いと思われる。

さて、単にVPNに接続するのであればこれで問題なくネイティブDHCPが利用できるのだが、パケットを全てVPN経由に流すためにredirect-gatewayを設定すると問題が発生する。

通常、クライアント側の設定ファイルにredirect-gateway def1と書いておけばOpenVPNが自動でルーティングテーブルを調整してくれるのだが、ネイティブDHCPを併用した場合、DHCPクライアントがさらにルーティングテーブルを上書きしてしまい、ルーティングが壊れてしまう。このため、何らかの手段でDHCPクライアントによるルーティングテーブルの編集を阻止しなければならない。私はこの時点で面倒になったので(そこまでしてネイティブDHCPを使わなければいけない理由もない)、諦めてしまった。

というわけで、redirect-gatewayを用いずに単にVPNに接続したいのであれば、ネイティブDHCPを利用するのは難しくない。しかし、デフォルトゲートウェイをリダイレクトしたい場合は、何かしらの手段でルーティングテーブルを上手く調整する必要があるため注意が必要である。