STP拡張機能:BPDUガードの仕組みと設定方法
BPDUガードは、スパニングツリープロトコル(STP)の安全性を高めるために用いられる機能です。特にPortFastが設定されたポートで有効にすることで、予期しないスイッチ接続やループの発生を未然に防ぐ役割を持ちます。
PortFastの前提は「PCやサーバのような末端機器が接続されること」です。しかし、もしそのポートに別のスイッチを接続してしまうと、BPDU(ブリッジプロトコルデータユニット)が流れ込み、意図しないSTPの動作が発生する可能性があります。そこでBPDUガードを有効にしておけば、BPDUを受信した瞬間に該当ポートをerror-disabled状態にし、安全を確保できるのです。
BPDUガードの適用範囲
BPDUガードは、ポート単位でもスイッチ全体(グローバル)でも有効化できます。両者の違いを整理すると次のようになります。
| 設定方法 | 適用範囲 |
|---|---|
| ポート単位で有効化 | 該当ポートに必ずBPDUガードが働く。PortFastの有無に関係なく適用される。 |
| グローバルで有効化 | スイッチ全体でPortFastが設定されたポートにのみBPDUガードが働く。 |
試験では「グローバル有効化ではPortFastが条件になる」という点が問われやすいので要注意です。
BPDUガードの設定コマンド
ポート単位で設定する場合は次のように入力します。
(config-if)# spanning-tree bpduguard enable
スイッチ全体で有効化する場合は次のようになります。
(config)# spanning-tree portfast bpduguard default
BPDUガードが動作したときの挙動
もしBPDUガードが有効なポートにスイッチを接続すると、次のようなログが出力され、そのポートは自動的にerr-disable状態に移行します。
%SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Fa0/1 with BPDU Guard enabled. Disabling port.
%PM-4-ERR_DISABLE: bpduguard error detected on Fa0/1, putting Fa0/1 in err-disable state
err-disableになったポートは、そのままでは通信できません。復旧させる方法は2つあります。
- 手動で
shutdownとno shutdownを入力する - 自動復旧を設定しておく
自動復旧を使う場合の設定例は次の通りです。
(config)# errdisable recovery cause bpduguard
この設定により、デフォルトでは300秒ごとにポートが復旧を試みるようになります。
STP拡張機能:BPDUフィルタリングの仕組みと設定方法
BPDUフィルタリングは、スパニングツリーに関連する制御フレーム(BPDU)の送受信を制御する機能です。特にPortFastが設定されたポートに対して使われることが多く、通常はPCやサーバなどの末端機器にBPDUが流れ込むのを防ぐ目的で導入されます。
PCやサーバはSTPに参加しませんから、BPDUを受け取っても意味はありません。むしろ、余計なフレームを送るだけ通信負荷になるので、BPDUフィルタリングによってBPDUの送信を止め、受信したBPDUは破棄する仕組みになっています。
ただし、この機能は扱いに注意が必要です。なぜなら、BPDUのやり取りが完全に止まると、ポートがSTPに参加しなくなり、思わぬループ発生のリスクを招く可能性があるからです。そのため、BPDUガードが推奨される一方で、BPDUフィルタリングは基本的には非推奨とされています。
BPDUフィルタリングの適用範囲と挙動
BPDUフィルタリングは「ポート単位」と「グローバル」の2種類の設定方法があり、それぞれ動作が異なります。試験でも出題されやすい部分なので整理して覚えておきましょう。
| 設定方法 | 動作の特徴 |
|---|---|
| ポート単位で有効化 | PortFastの有無に関係なく、そのポートではBPDUの送受信が完全に停止。事実上、そのポートでSTPが無効化される。 |
| グローバルで有効化 | PortFastが有効なポートのみBPDUフィルタリングが適用される。最初はBPDU送信を停止するが、もしBPDUを受信した場合はPortFastが解除され、通常のSTP動作に戻る。 |
この違いが理解できていないと混乱しやすいため、「グローバル設定では受信したBPDUによって動作が切り替わる」というポイントを必ず押さえておきましょう。
BPDUフィルタリングの設定コマンド
ポート単位で設定する場合のコマンドは次の通りです。
(config-if)# spanning-tree bpdufilter enable
スイッチ全体で有効化する場合は次のように入力します。
(config)# spanning-tree portfast bpdufilter default
実務における利用シーンと注意点
BPDUガードは「ループ防止」に直結するため推奨されますが、BPDUフィルタリングは誤用するとループを助長する危険があります。そのため、通常は推奨されません。
それでも利用されるケースとしては、「STPを完全に無効化はしたくないが、特定のポートからBPDUを送信させたくない」というような特殊な環境です。例えば、外部の管理対象外ネットワークに接続するポートなどが該当します。
STP拡張機能:ルートガードの仕組みと設定方法
ルートガードは、スパニングツリーにおいて意図しないスイッチがルートブリッジになるのを防ぐための機能です。通常、STPではBPDUの情報を比較し、ブリッジIDが最も小さいスイッチがルートブリッジに選ばれます。しかし、ネットワークに新しくスイッチが追加されたり、設定ミスで優先度の低いスイッチが接続されたりすると、ルートブリッジが書き換わってしまい、既存のトポロジーが変化する危険があります。
このような場合、STPの再収束が起こり、一時的な通信断が発生することがあります。業務システムではこうした瞬断でも大きな影響を及ぼすため、ルートブリッジの位置を強制的に固定したい場面ではルートガードが有効に働きます。
ルートガードの動作イメージ
ルートガードを設定したポートが「より優先度の高いBPDU(上位BPDU)」を受信した場合、そのポートは自動的にroot-inconsistent状態に移行します。
この状態ではフレーム転送が止まり、そのポート経由でルートブリッジが書き換わるのを防止します。
そして、不正なBPDUの受信が止まれば、自動的にroot-inconsistent状態から復帰し、通常のポートとして再び利用可能になります。
ルートガードの設定方法
ルートガードはポート単位でのみ設定できます。グローバルでの一括設定はできないため、管理していない機器や外部スイッチと接続される可能性があるポートに個別で適用します。
設定コマンドは次の通りです。
(config-if)# spanning-tree guard root
ルートガードの状態確認
ルートガードによってroot-inconsistent状態に入ったポートは、次のコマンドで確認できます。
# show spanning-tree inconsistentports
ログ出力の例
ルートガードによってポートがブロックされた場合、次のようなメッセージが出力されます。
%SPANTREE-2-ROOTGUARD_BLOCK: Root guard blocking port FastEthernet0/3 on VLAN0001
STP拡張機能:ループガードの仕組みと設定方法
ループガードは、スパニングツリーの冗長構成においてBPDUが受信されなくなったときに誤ってポートが転送状態になるのを防ぐ機能です。もしループガードがなければ、ブロッキング中のポートが「BPDUが届かない=接続先が消えた」と誤認し、指定ポート(DP)へ移行してフォワーディング状態になってしまうことがあります。これが発生すると、冗長パスにおいてブロックされるポートが一切なくなり、結果としてL2ループが起きてしまいます。
特に、単一方向リンク障害やSTPプロセスの異常停止といったケースでは、この問題が発生しやすいため、ループガードを導入することで安全性を高めることができます。
ループガードの動作イメージ
ループガードを有効にしていると、本来BPDUを受信すべき代替ポートやルートポートでBPDUが届かなくなった場合、そのポートはloop-inconsistent状態に移行します。この状態ではフォワーディングに移行しないため、意図しないL2ループが防止されます。
さらに、再びBPDUが受信できるようになれば、自動的にloop-inconsistent状態から復旧し、通常のSTP動作に戻ります。つまり、手動で復旧作業を行う必要がなく、STPの安定性を保ちながら運用できます。
ここで押さえておきたいのは、ループガードはerr-disableを発生させないという点です。BPDUガードとの違いを混同しやすいため、試験では要注意です。
ループガードの設定方法
ループガードはグローバル単位でもポート単位でも設定できます。推奨はグローバルでの有効化で、スイッチ全体に一括適用することで最大の効果を発揮します。
グローバルでの設定例:
(config)# spanning-tree loopguard default
ポート単位での設定例:
(config-if)# spanning-tree guard loop
また、ルートガードとループガードは排他的であり、同じポートに両方の機能を同時に設定することはできません。この点も試験で問われやすいので覚えておきましょう。
ループガードの状態確認
ループガードによってloop-inconsistent状態になったポートは、次のコマンドで確認できます。
# show spanning-tree inconsistentports
ログ出力の例
ループガードが働いてポートをブロックした場合:
%SPANTREE-2-LOOPGUARD_BLOCK: Loop guard blocking port FastEthernet0/1 on VLAN0010
ループガードのブロッキングが解除された場合:
%SPANTREE-2-LOOPGUARD_UNBLOCK: Loop guard unblocking port FastEthernet0/1 on VLAN0010