ネットワークの「静かなる殺人者」を仕留める:Loop Guardによる単方向リンク障害対策
ネットワークエンジニアとして現場に長くいると、何度か「物理層はUpしているのに、なぜか通信が全滅する」という悪夢のようなトラブルに遭遇するはずだ。いわゆる「単方向リンク障害(Unidirectional Link Failure)」だ。
特に光ファイバー環境では、送信側(TX)は生きているのに受信側(RX)だけが断線するという、L2/L3の論理的な世界からは見えない「幽霊」のような障害が稀に発生する。この時、スイッチがBPDUの受信を止めた結果、STP(Spanning Tree Protocol)が「あ、ルートブリッジへのパスが消えたから、俺がルートにならなきゃ(あるいはブロック解除しなきゃ)」と勘違いし、即座にループを生成してネットワークを崩壊させる。
今日は、この「静かなる殺人者」を封じ込めるための最強の守護神、Loop Guardについて、現場の知見を交えて深掘りしていく。
—
1. なぜ「単方向障害」でループするのか?
STPの基本原則は「BPDUを受け取れなくなったら、そのポートはもはや安全ではない」というものだ。通常、BPDUの受信が途絶えると、Max Ageタイマーを経てポートがフォワーディング(転送)状態に遷移する。
しかし、単方向障害では「送信はできるが受信はできない」状態に陥る。対向のスイッチはBPDUを送り続けているのに、こちらのスイッチには届かない。結果、STPアルゴリズムは「リンクが復旧した」と誤認し、本来ブロックすべきポートをフォワーディング状態へ引きずり出してしまう。これが、ネットワーク全体をダウンさせるブロードキャストストームの引き金だ。
Loop Guardの役割
Loop Guardは、BPDUの受信が途絶えたポートを、通常の「フォワーディング」ではなく「ループ不整合(Loop-inconsistent)」という特別な状態に追い込む。これにより、万が一BPDUが来なくなっても、そのポートでのフレーム転送を強制的に遮断し、ループの発生を物理的に阻止する。
—
2. 実践:Cisco CatalystにおけるLoop Guard設定
理論を語るだけでは現場は救えない。実際に機器にどう設定するか、その作法を見ていこう。
! インターフェース単位でLoop Guardを有効化する
interface GigabitEthernet0/1
description Uplink_to_Core_Switch
! Loop Guardの設定(グローバルでのSTP Guard設定と併用することが多い)
spanning-tree guard loop
! 補足:対向機器がBPDUを送信しないポートには設定してはいけない。
! 設定ミスは即通信断に繋がるため、適用ポートの選定は慎重に行うこと。
現場のTips:なぜ「Unidirectional Link Detection (UDLD)」と違うのか?
よく混同されるのが UDLD だ。
- Loop Guard: BPDUという「L2制御フレーム」の受信状態を監視する。
- UDLD: 専用のHelloパケットを交換し、レイヤ1/2の双方向性を物理的に確認する。
両者は補完関係にある。理想は UDLD aggressive mode を有効にしつつ、STPの安全性確保のために Loop Guard を併用することだ。
—
3. Web APIエンジニアへ:インフラの「ヘルスチェック」に例えると
Web APIの世界に馴染みがあるなら、これを「サービスヘルスチェックの失敗」と捉えてほしい。
Loop Guard は、ロードバランサーがバックエンドのAPIサーバーに対して行う Health Check と同じ概念だ。APIサーバーが 503 Service Unavailable を返しているのに、LBが「まだ生きているはずだ」と判断してリクエストを送り続けたらどうなるか? サービスは崩壊する。
Loop Guard は、ネットワークのスイッチに対して「BPDUが来ないなら、そのポートは死んでいると見なせ」という厳格なポリシーを強制するものだ。
—
4. トラブルシューティングの定石
もしネットワークが不安定になり、「特定のポートが Loop-inconsistent になっている」とログが出たら、以下のフローでデバッグしてほしい。
1. 物理層の疑い: まず show interface status でエラーカウンタ(CRCエラーやInput Errors)を確認する。光ファイバーなら、モジュールの光量(show interface transceiver)を真っ先に疑う。
2. BPDUの確認: show spanning-tree interface <id> detail で、最後にBPDUを受け取った時刻を確認する。
3. Pythonで監視を自動化する:
もし大量のスイッチを運用しているなら、Netmiko等を使って定期的にログや状態をスクレイピングする仕組みを持つべきだ。
from netmiko import ConnectHandler
# 現場で使う簡易監視スクリプトのイメージ
device = {'device_type': 'cisco_ios', 'host': '192.168.1.1', 'username': 'admin', 'password': 'password'}
def check_loop_guard():
with ConnectHandler(**device) as net_connect:
output = net_connect.send_command("show spanning-tree summary")
if "inconsistent" in output:
print("ALERT: Loop-inconsistent ports detected!")
# ここでSlack通知などをトリガーする
—
最後に:ネットワークは「疑う」ことから始まる
ネットワークの安定稼働は、機器を信頼することではなく「機器はいつか必ずおかしな挙動をする」という前提で設計することから始まる。Loop Guard は、そのための堅牢な防御壁の一つだ。
RFC 9266(BPDU保護に関する議論等)のような仕様書を読み込むのも大切だが、現場で「なぜこのポートは転送をやめたのか?」と問い続ける姿勢こそが、真のネットワークスペシャリストへの道である。
次回は、この「単方向リンク」をより積極的に検知するための UDLD の深層について語ろうと思う。それでは、健闘を祈る。
コメント