このページの目次
スイッチング、ブリッジング、そしてVXLAN
STPによるループ防止からVLANによる分離、そしてVXLANによるレイヤー3横断トンネルへ——レイヤー2ネットワークの進化史は、「ブロードキャストドメインをいかに小さく切り分け、トンネルをいかに遠くまで伸ばすか」という歴史そのものです。MAC学習とSTP収容を理解すれば、データセンターネットワークが現在の姿になった理由が見えてきます。
概要
スイッチはMAC学習によって転送パスを自動構築し、手動設定なしでイーサネットを数千ノード規模に拡張可能にします。Linux bridgeも同様の機能をソフトウェアで実装しています。コンテナやVMはveth pairを介してbridgeに接続され、bridgeがL2転送を担当します。STP/RSTPはループによるブロードキャストストームを防ぎ、VXLANはIPネットワーク上に仮想L2ネットワークを重ね合わせ、4094というVLANの制限を1600万まで拡張します。これらはデータセンターや家庭向けネットワークにおけるL2仮想化の基盤です。
MAC学習: 分散ハッシュマップ
各スイッチはMACアドレステーブル(フィルタリングデータベース)を維持しています。
学習と転送は同時に行われます。フレームを受信すると、まず送信元を学習し(MACテーブルを更新)、次に宛先を調べます。もし宛先が送信元ポートと同じ場合、転送しません(フィルタリングし、ループを防ぐ)。
Linux Bridge
// net/bridge/
// bridgeは本質的に仮想スイッチであり、FDB (Forwarding Database) に MAC→port の対応を保持する
;
bridgeと物理スイッチの違い:
- 物理スイッチ: MACテーブルはハードウェアASICに存在 → ポートごとの超高速検索
- Linux bridge: MACテーブルはハッシュテーブル(ソフトウェア)に存在 → ハードウェアより約10倍遅いが、ソフトウェアスイッチ(<10Gbps)には十分
- Linux bridgeでは
ageing_timeを設定可能:
# MACエイジング時間 (デフォルト300秒):
# FDBの確認:
HairpinとBridge-NF
bridge-nf (ブリッジ上でのnetfilter): iptablesを、bridgeを通過するフレームに対して実行できる。重要なパス (net/bridge/br_netfilter.c):
- NF_BR_PRE_ROUTING: フレームがbridgeポートに刚到着した時点
- NF_BR_FORWARD: フレームが1つのポートから別のポートへ転送される時点
- NF_BR_POST_ROUTING: フレームがbridgeポートから送信される直前
これにより、bridge上でiptablesを使用して透明なファイアウォール/フィルタリング/ログ記録が可能だが、パフォーマンスオーバーヘッドが発生する。
STP (802.1D)
ループの問題: 2つのスイッチ間に2本のケーブルがある場合 → ループ防止メカニズムがない → ブロードキャストフレームが無限ループ → ブロードキャストストーム → ネットワーク全体のパニック。
STPの核心: 生成木上で転送し、冗長リンクは待機状態(ブロック)にする
選挙:
1. ルートブリッジ: 最小ブリッジID (優先度 + MAC)
2. 各非ルートブリッジ: ルートポートを選択 (ルートへの最短パス)
3. 各セグメント: 指定ポートを選択 (このセグメントの転送を担当)
4. それ以外のポート → ブロック (転送せず、BPDUのみ受信)
BPDU (Bridge Protocol Data Unit):
EtherType: 0x0026 (LLC) → DSAP/SSAP=0x42 (STP)
2秒ごとに送信 (ハロータイマー)
STP BPDUの内容:
プロトコルID: 0
バージョン: 0 (STP) または 2 (RSTP)
タイプ: 0 (構成BPDU) または 0x80 (TCN)
フラグ: TC (トポロジー変更) + TCA (トポロジー変更確認)
ルートID: 優先度 (2バイト) + MAC (6バイト)
ルートパスコスト: (4バイト)
ブリッジID: 優先度 + MAC
ポートID: 優先度 (4ビット) + ポート番号 (12ビット)
メッセージ年齢 / 最大年齢 / ハロータイム / フォワードディレイ
収容時間:
STP: 30〜50秒 (リスニング→学習→転送、各段階15秒)
RSTP (802.1w): 1〜3秒 (提案/合意メカニズム)
VXLAN (RFC 7348)
コア要件: データセンターにおけるL2拡張
VLANは12ビットのVIDしか持たないため、4094の分離ドメインしか提供できない。大規模データセンターではこれ以上の分離が必要(マルチテナント分離)。VXLANは24ビットのVNIを提供し、1600万の分離ドメインを実現する。
封装
VXLAN封装:
[外側Ethernet][外側IP][外側UDP宛先ポート=4789][VXLANヘッダ 8バイト][内側Ethernet][内側IP][内側ペイロード]
VXLANヘッダ:
フラグ (1バイト): ビット3 = I (VNI有効), ビット0-2/4-7 = 予約済み
予約済み (3バイト): ゼロ
VNI (3バイト): 仮想ネットワーク識別子 — 24ビット識別子
予約済み (1バイト): ゼロ
なぜUDPを使うか:
- ECMP: ルーターはUDP送信元ポート(エントロピー)に基づいてマルチパス負荷分散が可能
- NAT透過: UDPはNATを通過可能(GRE/IPIPのように特別な処理が必要ない)
- ファイアウォールフレンドリー: 宛先ポート=4789で固定 → ACL設定が容易
VTEP
VTEP (VXLANトンネルエンドポイント):
封装/解封装の接点 (Linux: vxlanデバイス)
作成: ip link add vxlan100 type vxlan id 100 remote 10.0.0.2 dstport 4789 dev eth0
転送ロジック:
1. ローカルVMがフレーム送信 → bridgeがMAC参照 → 宛先MACがローカルにない?
2. MACが別のVTEPにある場合 → FDB参照: MAC→リモートVTEP IP
3. 封装: VXLANヘッダ + 外側IP/UDPを追加 → リモートVTEP IPへルーティング
4. リモート側: vxlanデバイスが受信 → 解封装 → 外側ヘッダを削除 → bridge処理
ARP抑制 (VXLANフラッディングの削減):
VXLANにおけるマルチキャスト/ブロードキャストは全VTEPへ複製される必要がある → 帯域幅の無駄
→ VTEPでのARPプロキシ: ローカルで直接ARP応答 (ネットワークへのフラッディング不要)
→ L2-population: コントロールプレーン (例: Open vSwitch) から MAC→VTEP マッピングを学習
参考文献
- IEEE: 802.1D, 802.1w, 802.1Q
- RFC: 7348 (VXLAN), 7348 付録A (ARP抑制の推奨事項)
- ソースコード:
net/bridge/(bridge + STP),drivers/net/vxlan/(VXLANドライバ) - LWN: "VXLAN and overlay networks in the kernel"
キーワード: MAC学習, FDB, Linux bridge, STP, RSTP, BPDU, VXLAN, VTEP, VNI, ARP抑制, オーバーレイネットワーク