OpenVPN 2.0 Ethernet Bridging 日本語訳
ブリッジングの概要
ルーティングモード vs. ブリッジモードの概要については,FAQを参照されたい.
イーサネットのブリッジは,基本的に,イーサネットのインタフェースと一個以上の仮想TAPインタフェースを結合させ,一つのブリッジインタフェースの下でブリッジングを行うものである.これは,ソフトウェアで物理イーサネットのスイッチングを行うことを意味する.イーサネットブリッジは,ソフトウェア・スイッチの一種と考えることができる.一台のマシンで同じIPサブネットを共有できるように,複数の(物理もしくは仮想の)イーサネットインタフェースをくっつけることができる.
離れた場所にある物理イーサネットNICとOpenVPN駆動のTAPインタフェースをブリッジングすることにより,あたかも同じイーサネットのサブネットに入っているかのように,論理的に双方を結合させることが可能となる.
ブリッジモードのセットアップ
次の例でOpenVPNサーバ側イーサネットブリッジの構築方法を示そう.複数のクライアントがこのブリッジに接続し,それぞれのTAPインタフェースにはサーバのLANに属するIPアドレスが割り当てられるとする.
クライアントIPアドレスの割り当てには二通りのやり方がある:
- server-bridgeを使って,OpenVPNにクライアントIPアドレス空間の管理を委せるか,または
- VPNクライアントにもIPアドレスを振り分けるよう(サーバ)LANのDHCPサーバを設定する.
この例では一つ目のやり方を採用する.すなわち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かによって以下に示す手順に従うこと.
Linux上のブリッジサーバ
まず,パッケージ 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ブリッジは,次の順に起動・終了させることができる.
- bridge-start を実行
- openvpn を実行
- openvpn を終了
- bridge-stop を実行
ここまででブリッジだけに関する設定は完了した.残っているのは,HOWTO を参照して続けられるであろう.
Windows XPのブリッジサーバ
以下の設定は,ブリッジ側に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は起動可能となる.
- ブリッジインタフェースは,仮想ネットワークインタフェースの一種で,一つ以上のイーサネットインタフェース(物理NICまたはVPNトンネリングに使われる仮想的なTAPインタフェース)を結合する.
- イーサネットブリッジを起動させるには,OpenVPN設定の ifconfig 項目ではなく,手動でIPアドレスとサブネットを設定すべきである.なぜなら,TUN/TAPインタフェースと違って,OpenVPNはプログラムでブリッジインタフェースのIPアドレスとネットマスクを設定できないから.
- OpenVPNの設定 dev は,ブリッジインタフェースそのものではなく,ブリッジインタフェースに含まれるTAPインタフェースを指定すべき.
- Windowsにおいては,dev-nodeでブリッジに加えられたTAP-Win32アダプタを指定すること(dev-node 名前は,ネットワーク接続パネルに示されるアダプタの名前を意味する).
- Linux/BSD/Unixにおいては,dev tapについて,ブリッジに加えたTUN/TAPユニットの番号を明示すること.例えば dev tap0.
- OpenVPNをポイントーポイントモードで運用している場合,ifconfigを無視する.クライアント・サーバモードの場合は,サーバ側でserver-bridgeを用いること.
- ブリッジングの際,ブリッジインタフェースのTCP/IP設定は手動で行うべき.Linuxを例に言うと,ifconfigがこのためのコマンドである.Windows XPの場合は,ネットワーク接続パネルにあるブリッジインタフェースのTCP/IPプロパティを設定するとよい(Windows XP以上のネットワーク接続パネルにおいては,ポイント-クリックでブリッジングができるようになっている).
- TAPインタフェースはファイアウォールによって保護されているプライベートなイーサネットインタフェースとのみブリッジングするように注意すること.絶対インターネットに繋ぐイーサネットインタフェースとブリッジングしないように.(そうしないと)セキュリティホールができてしまうから.
- localとremoteに使われるアドレスはブリッジされたサブネットの一部にならない -- さもないとルーティングのループが発生してしまう.
- イーサネットブリッジングを理解するための重要なポイントとして,ブリッジに加えられたネットワークインタフェースは,IPアドレスやネットマスク等の専用設定からなる個別な識別子を失っていることである.ブリッジインタフェースのTCP/IP設定だけが関係している(訳注:原文はrelevent.relevantのtypoと思われる)のである.
- 手動でイーサネットブリッジを設定する際によくある間違いとして,ブリッジインタフェースにIPとネットマスクを割り当てる前に主要イーサネットアダプタをブリッジに加えようとする人がいる.その結果は,主要イーサネットインタフェースが設定を失ったのに,同じ役割を果たすべきのブリッジインタフェースはまだ設定されていないため,イーサネットインタフェースを使うネット接続が切れてしまう.
- 多くの場合において,サーバ側だけに使えるイーサネットブリッジを設定すればよく,クライアント側には設定しなくて済むことが多い.このようにサーバに繋いだら,クライアントはマルチホームマシンとなる.つまり,クライアントは普通のイーサネットインタフェースのほか,OpenVPNサーバに接続したことにより,サーバ側イーサネットインタフェースに繋ぐ新たなTAPインタフェースも持つようになる(サーバ側でclient-to-clientが使われたら,さらに他のクライアントのTAPインタフェースにも繋げられる).
注 -- Windowsにおけるイーサネットブリッジング
Adam PavelecによるこのHOWTOをチェックする.
Windows Notesページはその他の情報を示している.
注 -- Linuxにおけるイーサネットブリッジングとセットアップスクリプト
以下のスクリプトが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