【実務・中級編】 STP(Spanning Tree Protocol)のBPDUフレーム構造 – ネットワーク基礎とWebセキュリティ実践ガイド

ネットワークの「静かなる守護神」STP:BPDUを読み解けば、障害の半分は解決する

ネットワークエンジニアとして現場に立っていると、「なんとなくループしてるっぽい」という曖昧な報告を耳にすることがあります。冗長化のためにスイッチを2本繋いだ瞬間、ネットワーク全体が嵐のようなブロードキャストストームに飲み込まれる……。あの冷や汗が出る瞬間を経験したことがある人なら、STP(Spanning Tree Protocol)の重要性は嫌というほど理解しているはずです。

今日は、教科書的な定義をなぞるのではなく、パケットレベルで「何が起きているのか」を深掘りし、実務で役立つ知識としてSTPの核心であるBPDU(Bridge Protocol Data Unit)を紐解いていきましょう。

—

1. BPDUという「共通言語」

STPがループを防げるのは、スイッチ同士がBPDUという名の「生存確認と序列の報告」を交換しているからです。BPDUはL2フレームとして、宛先MACアドレス 01:80:c2:00:00:00(STP専用)に向けて送出されます。

BPDUを構成する重要なフィールド

BPDUの中身は、単なるパケットではありません。ネットワーク全体のトポロジを決定づける「意思決定データ」です。

  • Root Identifier (Root ID): ネットワーク全体の「頂点」とみなすスイッチのID。
  • Root Path Cost: ルートスイッチに到達するまでに必要なコスト。
  • Bridge Identifier (Bridge ID): 自分自身の優先度(Priority)とMACアドレスを結合したもの。
  • Timer Values: Hello Time, Forward Delay, Max Age といった、ネットワークの収束速度を決める心臓部。

現場で一番トラブルになるのは、このPriorityの設定ミスです。デフォルトの 32768 のままだと、たまたまMACアドレスが小さい中古スイッチがネットワークの頂点に君臨し、通信経路が非効率になる「トポロジの逆転」が頻発します。

—

2. 実践:BPDUをコードで「覗き見る」

インフラエンジニアであれば、Wiresharkでパケットキャプチャをするのが常套手段ですが、Pythonで簡易的なパケット解析スクリプトを書いてみるのも、理解を深める近道です。scapy を使えば、BPDUの中身を直感的に扱えます。

from scapy.all import sniff, LLC, SNAP, STP

# STPのBPDUパケットをキャプチャして内容を表示する
def analyze_stp(packet):
    if packet.haslayer(STP):
        stp = packet[STP]
        print(f"--- STP BPDU 検出 ---")
        print(f"Root ID: {stp.rootid}")
        print(f"Root Path Cost: {stp.rootpathcost}")
        print(f"Bridge ID: {stp.bridgeid}")
        print(f"Hello Time: {stp.hellotime}")
        print(f"----------------------")

# 特定のインターフェースでキャプチャ開始
# 実際の環境では管理者権限が必要です
sniff(iface="eth0", filter="ether dst 01:80:c2:00:00:00", prn=analyze_stp, count=5)

このコードを実行すると、スイッチが2秒間隔(デフォルト)で「俺はここだ、ルートはあそこだ」と叫んでいる様子がリアルタイムに可視化されます。

—

3. 実務で「やってはいけない」設定とTips

Web APIのバックエンドやインフラ構築において、STPは「設定して終わり」ではありません。むしろ、境界防御の観点から以下の設定は必須です。

設定例:Edge Port(PortFast)の重要性

サーバーを接続するポートにSTPを有効にしたままにすると、ポートがリンクアップしてから通信可能になるまで、STPのタイマー(Listening/Learning状態)により数十秒のタイムラグが発生します。これはWeb APIのヘルスチェックをタイムアウトさせる原因になります。

Cisco系スイッチでの設定例:

interface GigabitEthernet0/1
 description "Web Server Node"
 # ポートが繋がった瞬間に転送状態にする(STP計算をスキップ)
 spanning-tree portfast
 # BPDUが流れてきたらポートを閉じる(不正なスイッチ接続を防御)
 spanning-tree bpduguard enable

bpduguard を設定しておくことは、ゼロトラストの第一歩です。誰かが勝手にスイッチをデスクの下に持ち込んでループを引き起こすのを、物理層で防ぐことができます。

—

4. 障害対応の勘所:トポロジ計算の罠

もしネットワークが不安定になったら、以下のコマンドで「誰がルートブリッジなのか」を確認してください。

# 現在のSTP状態を確認するコマンド例
show spanning-tree vlan 10

ここで Root ID と Bridge ID が一致しているスイッチが、そのVLANにおける「王様」です。もし予期せぬスイッチが Root ID になっていたら、それは Priority が低すぎるか、トポロジ設計が崩壊しているサインです。

まとめ:ネットワークの安定は「可視化」から

STPはレガシーな技術だと思われがちですが、現代のデータセンターでも、マルチホップの冗長環境では必須の技術です。BPDUというパケットがネットワークを流れる様子をイメージできれば、障害発生時に「どのパスがブロックされているのか」「なぜ通信が切り替わらないのか」を論理的に追跡できます。

「なんとなく繋がっている」状態から、「パケットの挙動を完全に把握している」状態へ。日々の運用でBPDUの値を意識するだけで、あなたのインフラ運用スキルは確実に一段上のレベルへ到達するはずです。

次回の記事では、RSTP (Rapid STP) がどのようにして収束時間を短縮しているのか、その魔法の裏側にあるパケット構造をさらに深掘りしていきます。お楽しみに。

コメント

タイトルとURLをコピーしました