ネットワークブリッジ
ブリッジは複数のネットワークセグメントをまとめるのに使われる一種のソフトウェアです。ブリッジは仮想ネットワークスイッチのように動作し、透過的に働きます (他のマシンはブリッジの存在を知る必要がありません)。ブリッジには実際のデバイス (例: eth0
) と仮想デバイス (例: tap0
) を接続することができます。
この記事では少なくとも一つのイーサネットデバイスを含むブリッジを作成する方法を説明します。QEMU のブリッジモードやソフトウェアベースのアクセスポイントの設定などに役立ちます。
ブリッジの作成
ブリッジを作成する方法は複数存在します。
iproute2 を使う
このセクションでは (base メタパッケージに含まれている) iproute2 パッケージの ip ツールを使ってネットワークブリッジを管理します。
新しいブリッジを作成して状態を up に変更:
# ip link add name bridge_name type bridge # ip link set dev bridge_name up
ブリッジにインターフェイス (例: eth0) を追加するには、まずインターフェイスをプロミスキャスモードに設定して立ち上げておく必要があります:
# ip link set dev eth0 promisc on # ip link set dev eth0 up
インターフェイスの master を bridge_name
に設定することでブリッジにインターフェイスを追加します:
# ip link set dev eth0 master bridge_name
既存のブリッジと関連付けられたインターフェイスを表示するには、bridge ユーティリティを使って下さい (iproute2 に含まれています)。詳しくは man bridge
を参照。
# bridge link show
ブリッジを削除するときは、最初に全てのインターフェイスを削除します。プロミスキャスモードをオフにして down に設定してから元の状態に戻してください。
# ip link set eth0 promisc off # ip link set eth0 down # ip link set dev eth0 nomaster
ブリッジを空にしたら、削除することができます:
# ip link delete bridge_name type bridge
メインネットワークインターフェースの追加
これをリモートサーバーで実行しており、メイン ネットワークインターフェイス (例: eth0
) をブリッジに追加する計画がある場合は、まず現在のネットワークステータスをメモします:
$ ip address show eth0 $ ip route show dev eth0
この例の関連情報は次のとおりです:
- 添付されている IP アドレス
eth0
:10.2.3.4/8
- デフォルトゲートウェイ:
10.0.0.1
- ブリッジネーム:
br0
ブリッジの初期設定:
# ip link add name br0 type bridge # ip link set dev br0 up # ip address add 10.2.3.4/8 dev br0 # ip route append default via 10.0.0.1 dev br0
次に、これらのコマンドを続けて実行します。これらをスクリプトファイルに配置して、スクリプトを実行することをお勧めします:
# ip link set eth0 master br0 # ip address del 10.2.3.4/8 dev eth0
説明:
eth0
がブリッジに追加されると、ルーティングには使われなくなります。{ic|br0}} がその代わりになるので、IP が必要です、デフォルトルートがアタッチされている必要があります。- インターフェイスを
br0
に追加する前にeth0
の IP アドレスを削除することはできません。 - しかし、
eth0
上の IP アドレスを素早く削除する必要があります。 - Linux は同じルーティングテーブル上に 2 つのデフォルトルートを持つことができません。
eth0
の IP アドレスが削除されると、それに接続されていたデフォルトルートも自動的に削除されます。
bridge-utils を使う
このセクションでは (公式リポジトリの) bridge-utils パッケージに含まれている brctl ツールを使ってネットワークブリッジを管理します。オプションの完全な説明は man brctl
を見て下さい。
新しいブリッジを作成:
# brctl addbr bridge_name
ブリッジにデバイスを追加 (例: eth0
):
# brctl addif bridge_name eth0
現在のブリッジと接続されているインターフェイスを表示:
$ brctl show
ブリッジデバイスを立ち上げる:
# ip link set up dev bridge_name
ブリッジを削除、先にブリッジを down に設定する必要があります:
# ip link set dev bridge_name down # brctl delbr bridge_name
メインネットワークインターフェースの追加
まず、現在のネットワーク状態を記録します:
$ ip address show eth0 $ ip route show dev eth0
この例の関連情報は次のとおりです:
- 添付されている IP アドレス
eth0
:10.2.3.4/8
- デフォルトゲートウェイ:
10.0.0.1
- ブリッジネーム:
br0
ブリッジの初期設定:
# brctl addbr br0 # ip address add 10.2.3.4/8 dev br0 # ip link set dev br0 up
次に、これらのコマンドを続けて実行します。これらをスクリプトファイルに配置して、スクリプトを実行することをお勧めします。
# brctl addif br0 eth0 # ip address del 10.2.3.4/8 dev eth0
netctl を使う
netctl でブリッジ接続を見て下さい。
systemd-networkd を使う
systemd-networkd#ブリッジインターフェイス を見て下さい。
NetworkManager を使う
Gnome の NetworkManager がブリッジを作成することができますが、ブリッジへの自動接続はいまのところ行いません。Network Settings を開いて、Bridge タイプのインターフェイスを新しく追加し、新しいブリッジ接続を追加して、ブリッジに接続するデバイスの MAC アドレスを選択してください。
接続するデバイスの UUID を確認 (デフォルトでは "bridge0 slave 1" という名前になっています):
$ nmcli connection
接続を有効化:
$ nmcli con up <UUID>
ブリッジに追加したデバイスが NetworkManager のデフォルトインターフェイスとして自動的に接続される場合、Network Settings の歯車をクリックして、"Identity" の "Connect automatically" のチェックを外すことで無効化できます。
IP アドレスを割り当てる
ブリッジが完全に設定されていれば、IP アドレスを割り当てることができます:
iproute2 を使用する場合
# ip addr add dev bridge_name 192.168.66.66/24
NetworkManager を使用する場合
目的のアドレスを指定します:
# nmcli connection modify Connection ipv4.addresses desired_IP
DNS サーバーをセットアップします (これにより、変更を適用した後にページを読み込めなくなることも回避されます):
# nmcli connection modify Connection ipv4.dns DNS_server
IP アドレスを静的に設定します:
# nmcli connection modify Connection ipv4.method manual
変更を適用します:
# nmcli connection up Connection
ヒントとテクニック
ブリッジ上の無線インターフェイス
ブリッジに無線インターフェイスを追加するには、まずアクセスポイントに無線インターフェイスを指定するか、または hostapd でアクセスポイントを起動する必要があります。そうしないとブリッジに無線インターフェイスは追加されません。
Debian wiki の Bridging with a wireless NIC も参照。
ブリッジ自体のトラフィックを高速化する
状況によっては、ブリッジはブリッジボックスとして機能するだけでなく、他のホストと通信することもできます。ブリッジポートに到着し、ブリッジ ボックス自体を宛先とするパケットは、デフォルトで、論理ブリッジポートを入力デバイスとして iptables INPUT チェーンに入ります。これらのパケットは、ネットワークコードによって 2 回キューに入れられます。1 回目は、ネットワークデバイスによって受信された後にキューに入れられます。 2 回目は、ブリッジコードが宛先 MAC アドレスを調べて、それがローカル宛のパケットであると判断した場合、フレームを上位のプロトコルスタックに渡します。[1]
ローカル宛先のパケットを 1 回だけキューに入れる方法は、ブルートテーブルの BROUTING チェーンでパケットをブルートすることです。br0 には IP アドレスがあり、br0 のブリッジポートには IP アドレスが無い場合。次のルールを使用すると、ローカルに送信されるすべてのトラフィックが 1 回だけキューに入れられるようになります:
# ebtables -t broute -A BROUTING -d $MAC_OF_BR0 -p ipv4 -j redirect --redirect-target DROP
ブリッジからの応答は br0 デバイス経由で送信されるため (ルーティングテーブルが正しく、すべてのトラフィックが br0 経由で送信されると仮定します)、パケットが 2 回キューに入れられることによるパフォーマンスの低下がなく、すべてが正常に動作し続けます。
ブリッジポートの MAC アドレスはブリッジデバイスの MAC アドレスと必ずしも一致しないため、リダイレクトターゲットが必要になります。ブリッジ ボックス宛てのパケットはブリッジ br0 の宛先 MAC アドレスと同じ宛先 MAC アドレスを持つため、その宛先アドレスをブリッジポートの宛先アドレスに変更する必要があります。
トラブルシューティング
ブリッジ設定後にネットワークが動作しない
ブリッジに追加されたインターフェイス (例: eth1
) からすべての IP アドレスとルートを削除し、代わりにこれらのパラメータをブリッジに設定すると役立つ場合があります。
まず、eth1
に対して dhcpcd インスタンスが実行されていないことを確認してください。実行されていない場合、削除されたアドレスが再割り当てされる可能性があります。
eth1
インターフェースからアドレスとルートを削除します:
# ip addr del address dev eth1 # ip route del address dev eth1
ここで、以前に設定したブリッジの IP アドレスとルートを設定する必要があります。これは通常、このインターフェイスの DHCP クライアントを開始することによって行われます。それ以外の場合は、ネットワーク設定 を参照して手動設定を行ってください。
ブリッジ設定後、ホストされたサーバーでネットワークが動作しない
ブリッジの MAC アドレスは、サーバーが通常使用するネットワークカードの MAC アドレスと必ずしも同じではないため、サーバープロバイダーがブリッジから送信されるトラフィックをドロップし、ブリッジング時に接続が失われる可能性があります (サーバーのイーサネットインターフェイスなど)。したがって、ホストされているサーバーでは、イーサネットインターフェイスの MAC アドレスのクローンを作成するようにブリッジを設定することが必要になる場合があります。
通常接続に接続後、ブリッジ接続に接続できない
Network Manager アプレットで、通常のイーサネット/ワイヤレス接続 (ブリッジスレーブ接続ではない) があり、最初にそれに接続し、次にブリッジ接続に接続しようとすると (最初に通常の接続から切断するかどうかに関係なく)、接続できません。何らかの理由で、自動接続チェックボックスが有効になっている場合でも、ブリッジスレーブ接続 (ネットワーク アプレットにリストされていない) はアクティブになりません。
回避策は、ターミナル経由で手動でアクティブ化することです:
nmcli connection up br1\ slave\ 1
その後、すぐにブリッジ接続が機能します。