UTF-8 Encoding, 2006-05-23 -- 05-31, 趙 亮, 京都大学情報学研究科
ルーティングモード vs. ブリッジモードの概要については,FAQを参照されたい.
イーサネットのブリッジは,基本的に,イーサネットのインタフェースと一個以上の仮想TAPインタフェースを結合させ,一つのブリッジインタフェースの下でブリッジングを行うものである.これは,ソフトウェアで物理イーサネットのスイッチングを行うことを意味する.イーサネットブリッジは,ソフトウェア・スイッチの一種と考えることができる.一台のマシンで同じIPサブネットを共有できるように,複数の(物理もしくは仮想の)イーサネットインタフェースをくっつけることができる.
離れた場所にある物理イーサネットNICとOpenVPN駆動のTAPインタフェースをブリッジングすることにより,あたかも同じイーサネットのサブネットに入っているかのように,論理的に双方を結合させることが可能となる.
次の例でOpenVPNサーバ側イーサネットブリッジの構築方法を示そう.複数のクライアントがこのブリッジに接続し,それぞれのTAPインタフェースにはサーバのLANに属するIPアドレスが割り当てられるとする.
クライアントIPアドレスの割り当てには二通りのやり方がある:
この例では一つ目のやり方を採用する.すなわちOpenVPNサーバがLANサブネットの一部のアドレス空間を管理している.ただしこの空間は,(存在している場合)DHCPサーバの管理範囲と別である.なおこの二通りのやり方に対して,より詳細な説明は FAQ 項目 に説明している.
我々の例においては,次のようなブリッジ設定を用いる:
設定 | bridge-start パラメータ | 値 |
イーサネットのインタフェース | eth | eth0 |
ローカルIPアドレス | ip | 192.168.8.4 |
ローカルネットマスク | eth_netmask | 255.255.255.0 |
ローカルブロードキャストアドレス | eth_broadcast | 192.168.8.255 |
VPNクライアントのアドレス空間 | 192.168.8.128 -- 192.168.8.254 | |
仮想ブリッジインタフェース | br | br0 |
仮想TAPインタフェース | tap | tap0 |
第一ステップとして,まず HOWTO の"初めてのVPNを起動させテストする"までの節に従って行うこと.次は,LinuxかWindowsかによって以下に示す手順に従うこと.
まず,パッケージ bridge-utils がインストールされているを確認しよう.
それから下記のスクリプト bridge-start を修正しよう.パラメータ br, tap, eth, eth_ip, eth_netmask, と eth_broadcast をブリッジしたい物理イーサネットインタフェースに合わせて記入する.注意:ファイアウォールによってインターネットから保護されているプライベートなインタフェースを使用すること.記入に必要な情報は,Linuxの ifconfig コマンドで知ることができる.
ここでスクリプト bridge-start を実行する.このスクリプトは,永久な tap0 インタフェースを作ってアクティブなイーサネットインタフェースとブリッジをする.
次に,OpenVPNサーバ設定ファイル をブリッジを行うよう修正する.
dev tunの行をコメントアウトし,代わりに次の一行を用いる:
dev tap0
serverで始まる行をコメントアウトし,代わりに以下を用いる:
server-bridge 192.168.8.4 255.255.255.0 192.168.8.128 192.168.8.254
新しく作った tap0 と br0 インタフェースをパケットが自由に流せるように Linux ファイアウォールを設定する.
iptables -A INPUT -i tap0 -j ACCEPT iptables -A INPUT -i br0 -j ACCEPT iptables -A FORWARD -i br0 -j ACCEPT
OpenVPNブリッジは,次の順に起動・終了させることができる.
ここまででブリッジだけに関する設定は完了した.残っているのは,HOWTO を参照して続けられるであろう.
以下の設定は,ブリッジ側にWindows XP以上が必要である.私が知る限り,Windows 2000はブリッジを作ることができない.でも,クライアントとしてブリッジ・ネットワークに参加することはできる.その時,OpenVPN接続のもう片方は,LinuxまたはWindows XPマシンによってブリッジを作ればよい.
OpenVPNは,Windowsにインストールされた時に,自動的にTAP-Win32アダプタを一つ作る.デフォルトで"ローカルエリア接続2"みたいな名前になっているが,コントロールパネル,ネットワーク接続に行って,"tap-bridge"に改名しておこう.
それから,tap-bridge とイーサネットアダプタをマウスで選択して,右クリックしブリッジ接続を選ぶ.これにより,コントロールパネルに新たな ブリッジアダプタ アイコンが出るはず.
このブリッジアダプタに対して,TCP/IPプロパティを,IP 192.168.8.4,サブネットマスク 255.255.255.0 のように設定しておく.
次に,OpenVPNサーバ設定ファイルを編集してブリッジモードを有効にする.
dev tunの行をコメントアウトし,代わりに以下を用いる:
dev tap dev-node tap-bridge
serverで始まる行をコメントアウトし,代わりに以下を用いる.
server-bridge 192.168.8.4 255.255.255.0 192.168.8.128 192.168.8.254
XP SP2を使っている場合は,コントロールパネルのファイアウォールを開いて,ブリッジとTAPアダプタに対してフィルタリングを無効にしておく.
ここまででブリッジだけに関する設定は完了した.残っているのは,HOWTO を参照して続けられるであろう.
サンプルOpenVPNクライアント設定ファイルをベースにし,dev tunの行をコメントアウトし,代わりに以下を用いるとよい.
dev tap
最後に,クライアントの設定はサーバの設定との整合性を確認しよう.特に proto(udpかtcpか)をチェックすること.また,comp-lzoとfragmentは,使っているなら,クライアントとサーバの両方に出ていることも確認しよう.
イーサネットブリッジを設定する際に一番最初にやることは,イーサネットブリッジを作ること -- つまり,他のイーサネットインタフェース,物理NICのような実在のものやTAPインタフェースのような仮想のものを収納する仮想ネットワークインタフェースのこと.イーサネットブリッジインタフェースは,OpenVPNの起動前に設定しておかなければならない.
イーサネットブリッジインタフェースを作る汎用的なやり方はない -- 各OSはそれぞれ自分のやり方をしている(下の例を参照).
一旦ブリッジインタフェースが作られ,さらに適切なイーサネットインタフェースも追加されたら,OpenVPNは起動可能となる.
Adam PavelecによるこのHOWTOをチェックする.
Windows Notesページはその他の情報を示している.
以下のスクリプトがLinux上でブリッジを起動・停止させるものである.因みにOpenVPNパッケージ(tarballファイル)のsample-scriptsサブディレクトリーの下にもある.
sample-scripts/bridge-start |
#!/bin/bash ########################################### # Linux上でイーサネットブリッジを起動させる # 依存性: bridge-utils ########################################### # ブリッジインタフェース br="br0" # ブリッジしたいTAPインタフェースのリスト # 例えば tap="tap0 tap1 tap2" tap="tap0" # 上記のTAPインタフェースとブリッジしたい物理イーサネットインタフェース eth="eth0" eth_ip="192.168.8.4" eth_netmask="255.255.255.0" eth_broadcast="192.168.8.255" for t in $tap; do openvpn --mktun --dev $t done brctl addbr $br brctl addif $br $eth for t in $tap; do brctl addif $br $t done for t in $tap; do ifconfig $t 0.0.0.0 promisc up done ifconfig $eth 0.0.0.0 promisc up ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
sample-scripts/bridge-stop |
#!/bin/bash ####################################### # Linuxのイーサネットブリッジを解体する ####################################### # ブリッジインタフェース br="br0" # ブリッジに入っているTAPインタフェースのリスト tap="tap0" ifconfig $br down brctl delbr $br for t in $tap; do openvpn --rmtun --dev $t done