レイヤ2の呪縛:なぜ私たちは今、改めてSTPに向き合うのか
ネットワークエンジニアのキャリアにおいて、もっとも残酷で美しい瞬間は、レイヤ2のループが引き起こす「ブロードキャストストーム」の静かなる暴走を目の当たりにした時だ。
冗長化のために美しく配線されたスイッチドネットワーク。しかし、IEEE 802.1D Spanning Tree Protocol(STP)という「検問」を正しく理解し、設計していなければ、数個のパケットが引き金となり、わずか数秒でリンクの帯域は飽和し、スイッチのCPUは限界を迎え、ネットワーク全体が「沈黙」という名の麻痺に陥る。
現代のデータセンターやエンタープライズネットワークでは、スパニングツリーの亜種であるRSTP (802.1w) やMSTP (802.1s)、さらにはSDNやEVPN-VXLANといったオーバーレイ技術の普及により、クラシックな802.1Dをそのまま意識する機会は減ったかもしれない。しかし、その根底にある「論理的なループフリートポロジを動的に構築する」というアルゴリズムの思想は、今なおすべてのスイッチングASICのシリコンレベルで息づいている。
今回は、パケットの挙動、ブリッジIDの数学的決定プロセス、そして現場で泣きを見ないための実践的なチューニングまで、STPの深淵を解き明かしていこう。
—
1. STPの基本理念とBPDUのパケットレベル解析
STPの本質は、グラフ理論における「最小全域木(Minimum Spanning Tree)」を、中央集権的なコントローラなしに、各スイッチ(ブリッジ)の分散協調によってリアルタイムに計算し続けることだ。
この協調動作の主役となるのが、BPDU (Bridge Protocol Data Unit) である。特にトポロジの維持と計算に使われるのは、Configuration BPDUであり、これはIEEE 802.3のMACフレームに包まれ、マルチキャストアドレスである 01:80:C2:00:00:00(Stap / 802.1D Group MAC)宛てに秒単位で流される。
Configuration BPDUの主要フィールド
パケットアナライザ(Wiresharkなど)で覗いたConfiguration BPDUのペイロードは、以下のような残酷なまでのシンプルさと厳密さを備えている。
- Protocol Identifier: 常に
0x0000(Spanning Tree) - Protocol Version Identifier:
0x00(IEEE 802.1D) - BPDU Type:
0x00(Configuration BPDU) - Flags: Topology Change (TC) や Topology Change Acknowledgment (TCA) フラグ
- Root Identifier (Root Bridge ID): 現在ネットワーク上で「根」と認識されているブリッジのID
- Root Path Cost: ルートブリッジに至るまでの累積パスコスト
- Bridge Identifier (Sender Bridge ID): このBPDUを送信しているスイッチのID
- Port Identifier: 送信元ポートの優先度とポート番号の組み合わせ
- Timers: Hello Time, Max Age, Forward Delay
これらすべての情報は、ある一つの絶対的なルール、すなわち「より優れた(Superiorな)情報を持つ者が勝つ」という厳格な比較演算のために存在している。
—
2. ルートブリッジ選出アルゴリズムの数学的真実
ネットワーク全体で単一の「ルートブリッジ(Root Bridge)」を決めるプロセスは、以下の優先順位(プレフィックスの長い順のようなもの)に基づく比較の連鎖によって行われる。
1. Lowest Root Bridge ID (最小のルートブリッジID)
2. Lowest Path Cost to Root (ルートまでの最小パスコスト)
3. Lowest Sender Bridge ID (最小の送信元ブリッジID)
4. Lowest Sender Port ID (最小の送信元ポートID)
ここでいう Bridge ID (BID) は、合計8バイト(64ビット)のデータ構造だ。
+-------------------------+---------------------------------+
| Priority (2 Bytes) | MAC Address (6 Bytes) |
+-------------------------+---------------------------------+
デフォルトのプライオリティは 32768 (0x8000) であり、ここにVLAN IDが拡張システムID(Extended System ID)として付加される(例:VLAN 10であれば 32768 + 10 = 32778)。
なぜデフォルトのままでは危険なのか?
多くの現場で散見される最大のミスは、コアスイッチやディストリビューションスイッチのプライオリティをデフォルト(32768)のまま放置することだ。STPの選出はMACアドレスの大小という「運任せ」の要素を含んでいるため、中古のスイッチやたまたまMACアドレスが若い低スペックなアクセススイッチがルートブリッジに選ばれてしまうという悲劇が起きる。
結果として、すべてのトラフィックがエッジ側の非力なスイッチを経由するようになり、バックボーンのリンクが完全に遊休化する。ルートブリッジの選出は、ネットワークアーキテクト自身の意思で明示的に静的チューニングされなければならない。
—
3. パスコストの算出とポート役割(Port Role)の決定
ルートブリッジが決定すると、各スイッチは「自分にとってどこがルートへの最短経路か」を計算する。ここで用いられるのがパスコストだ。
IEEE 802.1D(レガシー)と、高速化されたIEEE 802.1t(IEEE 802.1D-2004で改訂)では、リンク速度に対するパスコストの割当基準が異なる。現代のネットワークでは後者の標準コストが使われることが多い。
| リンク速度 | レガシーコスト (802.1D) | 改訂版コスト (802.1t) |
| :— | :— | :— |
| 10 Mbps | 100 | 2,000,000 |
| 100 Mbps | 19 | 200,000 |
| 1 Gbps | 4 | 20,000 |
| 10 Gbps | 2 | 2,000 |
| 100 Gbps | N/A | 200 |
ポートの3つの役割
各ポートは、トポロジ内での位置づけに応じて以下のいずれかの役割(Role)に割り当てられる。
1. Root Port (RP):
- 非ルートブリッジにおいて、ルートブリッジに向かうパスコストが最も低い「最適パス」に接続されているポート。スイッチにつき必ず1つだけ存在する。
2. Designated Port (DP):
- セグメント(リンク)ごとにおいて、ルートブリッジに向けて最も優れたBPDUを送り出す側のポート。セグメントにつき必ず1つだけ存在する。ルートブリッジ上のすべてのポートは必然的にDesignated Portとなる。
3. Blocking Port (Alternate / Backup):
- RPでもDPでもない、ループを防ぐためにトラフィックの送受信が制限(ブロッキング)されたポート。
—
4. 状態遷移のタイムアウトとコンバージェンスの闇
クラシックな802.1Dの最大の弱点は、トポロジ変化時のコンバージェンス(収束)の遅さだ。ポートがブロッキング状態からフォワード状態に遷移する際、以下の厳格なステップを踏む。
1. Disabled / Blocking: パケット転送不可、BPDU受信のみ(20秒:Max Age)
2. Listening: パケット転送不可、MACアドレステーブル学習不可、BPDU送受信(15秒:Forward Delay)
3. Learning: パケット転送不可、MACアドレステーブル学習開始、BPDU送受信(15秒:Forward Delay)
4. Forwarding: 完全なパケット転送と学習
合計で約30秒から50秒という時間がかかる。現代のリアルタイムアプリケーションやVoIP、金融トランザクションにおいて、50秒のブラックアウトはシステム全体の致命傷となり得る。これが、今日802.1Dではなく、P2Pのハンドシェイクにより秒速で収束するRSTP (802.1w) や、マルチプルインスタンスを扱うMSTPが選ばれる理由である。
—
5. 実践:Cisco IOSにおける堅牢なSTP設計とセキュリティ設定
実務において、STPを安全に稼働させるためには、デフォルトの挙動に頼るのではなく、意図しないトポロジの改変を防ぐための「防護壁(ガード機能)」を実装することが極めて重要だ。
以下に、実運用を想定したCisco Catalystスイッチ(IOS)での推奨設定を示す。
! ==========================================
! 1. ルートブリッジの明示的固定 (Primary/Secondary)
! ==========================================
! プライオリティを24576に設定し、ネットワークの根を完全に掌握する
spanning-tree vlan 10,20 root primary
! 万が一のプライマリ障害時に備え、予備機に次点のプライオリティ(28672)を付与
spanning-tree vlan 10,20 root secondary
! ==========================================
! 2. 拡張システムIDの確認とモードの統一
! ==========================================
! モダンなRSTP (Rapid-PVST+) をベースとして採用する
spanning-tree mode rapid-pvst
! ==========================================
! 3. エッジポート(端末接続ポート)の保護
! ==========================================
! サーバやPCが接続されるアクセスポートに対し、PortFastをデフォルト有効化
spanning-tree portfast default
! 万が一、エッジポートから不正なBPDU(他スイッチの接続など)を受信した場合、
! ループやトポロジ汚染を防ぐためにポートを即座にerr-disable(シャットダウン)させる
spanning-tree portfast bpduguard default
! ==========================================
! 4. ルートガード (Root Guard) によるバックボーン保護
! ==========================================
! アップリンク以外のダウンリンクや、他組織との接続境界ポートにおいて、
! 外部からより優れたBPDUを受信し「ルートブリッジの座を奪われる」ことを物理的に阻止する
interface GigabitEthernet0/24
description === Connection to Untrusted Switch or Customer Edge ===
spanning-tree guard root
設定の解説と現場の知見
spanning-tree portfast default: エッジポートがListening/Learningの遅延(30秒)をスキップし、即座にForwarding状態に入るようにする。ただし、この設定を誤ってスイッチ間リンクに入れてしまうと、一瞬でループが発生するため、bpduguardとの併用が絶対条件となる。spanning-tree guard root: 悪意あるユーザー、あるいは設定ミスを持ち込んだ別の管理者が、非常に低いプライオリティ(例:0)を持ったスイッチをネットワークに接続した際、既存のルートブリッジが乗っ取られるのを防ぐ。Root Guardが有効なポートが「勝者」のBPDUを受信すると、ポートの状態をRoot-Inconsistent(実質的なブロッキング)に落とし、ネットワークの崩壊を防ぐ。
—
結びにかえて
スパニングツリープロトコルは、パケットの洪水というレイヤ2の最大の恐怖からネットワークを守るための、極めてエレガントな数理的防壁である。
「とりあえず動くから触らない」のではなく、「なぜこのポートがブロッキングされているのか」「このBPDUのSender IDはどこを指しているのか」をパケットレベルで追跡できるインフラエンジニアこそが、真に信頼性の高い堅牢なネットワークを構築できる。
パケットが流れるその瞬間に思いを馳せ、あなたのデザインするレイヤ2トポロジに完璧な調和をもたらしてほしい。
コメント