STPは「信頼」の上に成り立つ:ネットワークを死守するセキュリティ機能の深淵
ネットワークエンジニアにとって、STP(Spanning Tree Protocol)は「諸刃の剣」だ。ループを回避して冗長化を実現する救世主である一方で、設定を一つ間違えればネットワーク全体をブラックホールへ叩き落とす爆弾にもなり得る。
今日は、教科書的な「STPとは何か」という話は脇に置き、現場で生き残るために必須の「STPセキュリティ機能」について、泥臭いトラブルシューティングの観点から深掘りしていこう。
—
1. BPDUガード:エッジポートの「門番」
ネットワークの入り口、つまりPCやサーバーが接続される「エッジポート」にSTPを有効にするのは危険だ。悪意のある(あるいは無知な)ユーザーが、勝手にL2スイッチを持ち込んで接続した瞬間、STPのトポロジー計算が走り出し、ネットワークがフラッピングする。
これを防ぐのが BPDUガード だ。エッジポートで BPDU を受信した瞬間、そのポートを即座に err-disable(無効化)する。
Cisco設定例
! エッジポートとして設定し、BPDUガードを有効にする
interface GigabitEthernet0/1
switchport mode access
spanning-tree portfast ! 接続時に即座にForwardingにする
spanning-tree bpduguard enable ! BPDUを受け取ったらポートを殺す
現場のTips: err-disable されたポートは、管理者が手動で shutdown / no shutdown を打つか、自動復旧タイマーを設定しない限り死んだままだ。監視システムには必ず SNMP Trap を飛ばし、「誰かが変なスイッチを繋いだ」というアラートを検知できるようにしておくこと。
—
2. ルートガード:ネットワークの「秩序」を守る
STPの頂点、Root Bridge が予期せず変わってしまうと、トラフィックの流れが激変し、広範囲で通信断が発生する。特に、ダウンリンク配下のスイッチで「俺がルートになる!」と主張するスイッチが現れたら最悪だ。
ルートガード は、特定のポートで「ルートブリッジ候補となるような質の良いBPDU」の受信を拒否する。
Cisco設定例
! コアスイッチへのアップリンク以外の、ダウンリンク側に適用するのが鉄則
interface GigabitEthernet0/24
spanning-tree guard root
これを設定しておけば、もし配下のスイッチが誤って優先度を高く設定していても、そのポートは root-inconsistent 状態になり、トポロジーへの影響を物理的に遮断できる。
—
3. ルートガード vs BPDUフィルタ
混同しやすいのが BPDUフィルタ だ。これは「BPDUを送りもしないし、受け取ったふりもしない」という、STPの存在そのものを隠蔽する機能だ。
絶対に使ってはいけないケース:
L2スイッチ同士の接続に BPDUフィルタ を入れると、ループが発生しても検知できず、ネットワークは瞬時に崩壊する。「STPが邪魔だから止めよう」という安易な判断は、ネットワークエンジニアとして最もやってはいけないことだ。
—
4. ループガードとUDLD:見えない敵との戦い
物理的なループは防げても、厄介なのが「単一方向リンク障害(Unidirectional Link)」だ。光ファイバーの片系が断線し、送信はできるが受信ができない場合、STPは BPDU を受信できなくなり、ループがないと誤認して Forwarding 状態に移行してしまう。
これを防ぐのが ループガード と UDLD(Unidirectional Link Detection)だ。
UDLDの設定(Cisco)
UDLDは「お互いに相手が見えているか」をレイヤー2で確認する。
! グローバル設定で有効化(推奨)
udld enable aggressive
! インターフェース単位で確認
interface TenGigabitEthernet0/1
udld port aggressive
aggressive モードを使うと、通信が遮断された際にポートを強制的に err-disable に追い込める。これが最も安全な「逃げ」だ。
—
5. 運用現場でのデバッグ・Tips
インフラエンジニアとして、トラブル時にまず叩くべきコマンドを整理しておこう。
! どのポートがどの状態かを確認する黄金のコマンド
show spanning-tree detail | include from|is executing
! err-disableされた原因を特定する
show interfaces status err-disabled
Pythonによる自動監視のヒント
最近のインフラ運用では、Netmiko を使って全スイッチのSTP状態を定期的にチェックするスクリプトを組むのが常識だ。
from netmiko import ConnectHandler
# 複数台のスイッチからSTPのルートブリッジ情報を収集する
device = {"device_type": "cisco_ios", "host": "192.168.1.1", ...}
with ConnectHandler(**device) as net_connect:
output = net_connect.send_command("show spanning-tree root")
if "This bridge is the root" not in output:
print("警告: 予期せぬルートブリッジが検出されました!")
—
最後に:プロトコルは「疑う」ことから始まる
STPのセキュリティ機能は、単なる「設定値」ではない。それは、ネットワークの安定という「信頼」を守るための最後の砦だ。
現場でトラブルが起きたとき、盲目的にコマンドを打つのではなく、「今、このポートでBPDUがどう流れているべきか?」をパケットレベルで想像してほしい。フレームが流れる物理配線を脳内でトレースする力こそが、我々ネットワークスペシャリストの真の武器になる。
次にスイッチの設定を投入するときは、ぜひこの記事のことを思い出してほしい。その「一手間」が、深夜の緊急呼び出しを回避する唯一の手段になるのだから。
コメント