ネットワークブリッジ

提供: ArchWiki
2024年1月11日 (木) 04:05時点におけるKgx (トーク | 投稿記録)による版 (→‎ヒントとテクニック: ブリッジ自体のトラフィックを高速化するを翻訳して追加)
ナビゲーションに移動 検索に移動

関連記事

ブリッジは複数のネットワークセグメントをまとめるのに使われる一種のソフトウェアです。ブリッジは仮想ネットワークスイッチのように動作し、透過的に働きます (他のマシンはブリッジの存在を知る必要がありません)。ブリッジには実際のデバイス (例: eth0) と仮想デバイス (例: tap0) を接続することができます。

この記事では少なくとも一つのイーサネットデバイスを含むブリッジを作成する方法を説明します。QEMU のブリッジモードやソフトウェアベースのアクセスポイントの設定などに役立ちます。

ブリッジの作成

ブリッジを作成する方法は複数存在します。

bridge-utils を使う

このセクションでは (公式リポジトリの) bridge-utils パッケージに含まれている brctl ツールを使ってネットワークブリッジを管理します。オプションの完全な説明は man brctl を見て下さい。

新しいブリッジを作成:

# brctl addbr bridge_name

ブリッジにデバイスを追加 (例: eth0):

# brctl addif bridge_name eth0
ノート: ブリッジにインターフェイスを追加すると、そのインターフェイスは既存の IP アドレスを失います。リモートで接続するのに使っているインターフェイスをブリッジに追加すると、切断されてしまいます。この問題は、ブリッジを作成するスクリプトを作成してシステムの起動時に実行することで回避することができます。

現在のブリッジと接続されているインターフェイスを表示:

$ brctl show

ブリッジデバイスを立ち上げる:

# ip link set up dev bridge_name

ブリッジを削除、先にブリッジを down に設定する必要があります:

# ip link set dev bridge_name down
# brctl delbr bridge_name

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

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 アドレスを持つため、その宛先アドレスをブリッジポートの宛先アドレスに変更する必要があります。

参照