ネットワークエンジニアの皆さん、こんにちは。数々の修羅場をくぐり抜けてくると、「物理的にはリンクアップしているのに、なぜかレイヤー2で激しいブロードキャストストームが起きる」という悪夢のようなインシデントに一度や二度は直面したことがあるはずです。
全二重(Full-Duplex)のイーサネットにおいて、送信ファイバーは生きているのに受信ファイバーだけが折れている、あるいはトランシーバーの片側だけが故障している――いわゆる「単方向リンク障害(Unidirectional Link Failure)」です。このシチュエーションでスパニングツリー(STP)がどうなるか、想像しただけでも冷や汗モノですね。
今回は、STPの盲点を突き、ネットワークを全滅の危機から救う縁の下の力持ち「Loop Guard(ループガード)」について、プロトコルの深淵を覗きながら実務的な設定とデバッグの極意を解説していきましょう。
—
1. なぜ単方向リンク障害はSTPを狂わせるのか?
まずは敵を知ることから始めます。通常、STP(RSTP/MSTP含む)は、スイッチ間で定期的に交換されるBPDU(Bridge Protocol Data Unit)という小さな制御メッセージによってトポロジのループを検知し、冗長経路のポートをブロッキング(Discarding)状態に保ちます。
ここで、非指定ポート(Non-Designated Port:通常はブロッキングされているポート)に着目してください。このポートは、ネイバー(隣接スイッチ)から送信されてくるBPDUを「受信し続ける」ことで、「あぁ、向こうにまだ指定ポート(Designated Port)がいるな。俺は口を塞いで待機していよう」と判断しています。
悲劇のシナリオ
もし、この非指定ポートとネイバーを結ぶリンクで「片方向の断線(受信側だけがダメになる)」が発生したらどうなるでしょうか?
1. 自スイッチの非指定ポートは、ネイバーからのBPDUを一切受信できなくなります。
2. 標準のSTPの仕様では、「BPDUを受信しなくなった = 対向の指定ポートが消滅した(あるいはSTPが停止した)」と解釈します。
3. マックスエイジ(Max Age)タイマーが満了すると、自スイッチは「おっ、もうループの危険は去ったな!」と勘違いします。
4. 非指定ポートをリスニング(Listening)→ラーニング(Learning)→フォワード(Forwarding)状態へと昇格させてしまいます。
5. 送信側はまだ生きている(あるいはレイヤー1のリンク自体はUPしている)ため、ここに致命的なL2ループ(ブロードキャストストーム)が完成します。CPU使用率は一瞬で100%に張り付き、マネジメント網すら応答しなくなるというわけです。
—
2. Loop Guardの仕組み:BPDUが来ないなら「疑え」
この致命的な設計上の弱点を補うために実装されたのが、Cisco等のプライベート拡張(のちに標準化が進んだもの)であるLoop Guardです。
Loop Guardを有効にしたポート(通常は非指定ポートやルートポート)の挙動はシンプルにして極めて堅牢です。
- 通常の挙動: BPDUを受信している間は安心。
- 異常時の挙動: 非指定ポートやルートポートが、突如としてネイバーからのBPDUを受信しなくなった場合、「単方向リンク障害が発生した」と即座に判定します。
- アクション: リンクを物理的に落とすのではなく、STPの状態を強制的に「Loop-Inconsistent(ループ不整合)」状態に落とします。これは実質的にDiscarding(ブロッキング)と同等であり、トラフィックの転送を完全にブロックしてループを防ぎます。
特筆すべきは、障害が復旧して再びBPDUを受信し始めると、自動的にリスニング/ラーニングを経てフォワード状態に復帰するという点です。管理者の介入なしに自己修復するレジリエンスの高さが、この機能の最大の魅力です。
—
3. 実務における設定例(Cisco IOS / IOS-XE)
では、実際のCiscoスイッチにおけるコンフィギュレーションを見ていきましょう。Loop Guardは、グローバルで一括有効化する方法と、個別のインターフェースで有効化する方法があります。
実務では、誤ってすべてのポートに適用して思わぬトラブルを招かないよう、アクセス層からアップリンクに向かう非指定ポートや、コア・ディストリビューション間の冗長リンク(ルートポート候補)に対してピンポイント、あるいはグローバルで有効化しつつエッジポートを除外するアプローチが推奨されます。
グローバル設定の適用例
! グローバルでSTPのループガードをデフォルト有効にする
! (※BPduguardなどとの併用設計に注意してください)
spanning-tree loopguard default
インスタンス・ポート単位での個別設定例
実環境で最も確実なのは、レイヤー2のトランクリンクや、ループの危険性が高いポイントに明示的に設定を入れる方法です。
! コンフィグレーションモードへ移行
configure terminal
! 対象のインターフェースを指定(例: 2台のコアスイッチ間を結ぶトランクポート)
interface GigabitEthernet0/1
description === Uplink to Core Switch A (Loop Guard Enabled) ===
switchport mode trunk
! このポートでLoop Guardを強制有効化
spanning-tree guard loop
! 設定を保存
end
write memory
押さえておくべきポイント:Root Guardとの違い
現場でよく混同されるのが Root Guard(ルートガード) です。
- Root Guard: 「このポートの先から、俺よりプライオリティの高い『謎の勝手なマスター(ルートブリッジ)』が現れるのを防ぎたい」ときに使います(主にアクセスポート向け)。
- Loop Guard: 「対向から届くはずのBPDUが途絶えたときに、単方向障害とみなしてループを防ぎたい」ときに使います(主にバックボーンの非指定ポートやルートポート向け)。
この2つは排他的(同一ポートに同時に設定することはできません)ですので、設計時には十分注意してください。
—
4. 運用・保守・トラブルシューティングの現場知見
Loop Guardが稼働しているネットワークで万が一障害が起きたとき、あるいは意図せずポートがブロックされたときのデバッグ手順を伝授します。
1. 状態の確認コマンド
ポートがLoop-Inconsistent状態に陥っているかどうかは、以下のコマンドで一発で分かります。
# 特定のインターフェースのSTP詳細状態を確認する
show spanning-tree interface GigabitEthernet0/1 detail
出力の注目ポイント:
正常な状態であれば Designated foroo/block... などの表示になりますが、Loop Guardによってブロックされている場合、以下のようなステータスログや表示が現れます。
Port 48 (GigabitEthernet0/1) of VLAN0010 is in loop-inconsistent state
2. syslogの監視
Loop Guardが発動すると、syslogに以下のようなメッセージが送出されます。SIEMや監視ツールのスニペットに必ず組み込んでおくべき重要なアラートです。
%SPANTREE-2-LOOPGUARD_BLOCK:
Loop guard blocking port GigabitEthernet0/1 on VLAN0010.
このログが出たら、「光ファイバーの片側が汚れている、あるいはトランシーバーのレーザーダイオードが寿命を迎えている可能性がある」と疑い、物理層(L1)のレイヤーから調査を開始するのが鉄則です。
—
まとめ
Loop Guardは、普段は地味ながら、L2ネットワークの「最後の防壁」として極めて重要な役割を果たしています。単方向リンク障害は、デュプレックスミスマッチやSFPの片側故障など、現代の高速イーサネット(1G/10G/40G以上)でも稀に発生するリアルの脅威です。
「リンクはアップしているのに通信できない」「なぜか特定のVLANだけブロードキャストストームが起きる」――そんな不可解なトラブルに直面したとき、STPの拡張機能群、特にLoop Guardの概念が頭にスッと浮かぶかどうかが、シニアエンジニアとジュニアエンジニアメンタリティの分かれ道となります。
皆さんのインフラが、今日も堅牢で美しいパケットの海であらんことを。
コメント