なぜスパニングツリープロトコルが必要か

冗長性を確保するために、スイッチ間を複数の経路で接続する構成はよく行われます。しかし、L2ネットワークでは、ループ状の経路が存在すると、同じフレームが延々と転送され続けるブロードキャストストームなどの深刻な障害が発生してしまいます。

STP(Spanning Tree Protocol)は、冗長な物理リンクを保ったまま、論理的にはループの無いツリー状の経路だけを使って通信させる仕組みです。一部のリンクを意図的に「使わない状態(ブロック)」にしておき、既存の経路に障害が発生した場合にだけ、その予備の経路を自動的に使い始めるように働きます。

CCNA 200-301で扱われるのは、Cisco独自の実装であるRapid PVST+(Rapid Per-VLAN Spanning Tree Plus)です。これは、IEEE 802.1w(RSTP:Rapid Spanning Tree Protocol)をベースに、VLANごとに個別のスパニングツリーインスタンスを持てるようにCiscoが拡張したものです。

STPの有効化・無効化

多くのCatalystスイッチでは、STP自体は既定で有効になっていますが、動作モードは既定で従来のPVST+になっている場合があります。Rapid PVST+を使うには、明示的にモードを切り替える必要があります。

Switch(config)# spanning-tree mode rapid-pvst

VLANごとにSTPを無効化する(あえてループ防止を行わない)ことも可能ですが、意図しないループが発生する危険性が高いため、通常は行いません。

Switch(config)# no spanning-tree vlan 10

no spanning-tree vlan 10でVLAN 10のSTPを無効化し、spanning-tree vlan 10(noを外して再入力)で再び有効化できます。

ルートブリッジの選出

STPでは、ネットワーク内のスイッチの中から、ツリー構造の頂点となるルートブリッジ(root bridge)を1台選出します。すべての経路の判断は、このルートブリッジからの距離を基準に行われます。

選出の基準:ブリッジID

ルートブリッジは、各スイッチが持つブリッジID(拡張システムIDを含むブリッジプライオリティ+MACアドレス)のうち、最も小さい値を持つスイッチが選ばれます。Rapid PVST+では、拡張システムIDとしてVLAN IDがブリッジプライオリティ部に加算されます。

  • まずブリッジプライオリティ(設定上の初期値は32768)を比較し、最も小さいスイッチが優先されます。
  • プライオリティが同じ場合は、MACアドレスが最も小さいスイッチが選ばれます。

MACアドレスによるタイブレークに任せてしまうと、たまたま製造時期が古く性能の低いスイッチがルートブリッジに選ばれてしまう可能性があるため、実運用では管理者が意図的にプライオリティを操作して、性能の高い中核スイッチをルートブリッジに指定することが一般的です。

ルートプライマリ・セカンダリの設定

Cisco IOSには、ブリッジプライオリティを手動で計算しなくても、簡単にルートブリッジを指定できるマクロコマンドが用意されています。

Switch(config)# spanning-tree vlan 10 root primary
Switch(config)# spanning-tree vlan 10 root secondary
  • root primary:通常はそのVLANにおけるブリッジプライオリティを24576に設定します。既存のルートブリッジのプライオリティが24576以下の場合は、既存ルートより4096低い値を自動計算して設定します。
  • root secondary:ブリッジプライオリティを28672に設定します。プライマリのルートブリッジに障害が発生した場合に備えた、予備のルートブリッジという位置づけです。

root primary/root secondaryはあくまで簡易マクロです。root primaryは、現在選出されているルートブリッジのプライオリティを基準に、それより低い4096刻みの値を自動計算して設定してくれる点が、直接priorityコマンドを使う場合との違いです。ブリッジプライオリティを24576に直接指定する場合は、次のコマンドを使用します。

Switch(config)# spanning-tree vlan 10 priority 24576

ブリッジプライオリティは、0〜61440の範囲で、4096刻みの値しか指定できません(4096、8192、12288…のように、4096の倍数のみ)。

設定の確認

現在のルートブリッジや、各ポートのロール・ステートは、show spanning-tree vlanコマンドで確認できます。

Switch# show spanning-tree vlan 10

VLAN0010
  Spanning tree enabled protocol rstp
  Root ID    Priority    24586
             Address     ec44.7631.3880
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    24586  (priority 24576 sys-id-ext 10)
             Address     ec44.7631.3880
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time  300 sec

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Gi0/1            Desg FWD 4         128.1    P2p
Gi0/2            Desg FWD 4         128.2    P2p

Root IDのThis bridge is the rootという表示から、このスイッチ自身がルートブリッジであることが分かります。Bridge IDのプライオリティが24586(root primaryで設定した24576にVLAN 10のsys-id-extが加算された値)になっている点からも、root primaryの設定が反映されていることを確認できます。Interfaceの一覧では、各ポートのロール(Desg=指定ポート等)とステート(FWD=フォワーディング等)が確認できます。

個別のVLANではなく、スイッチ全体でSTPがどのモードで動作しているか、どのVLANのルートブリッジになっているかを一覧で素早く確認したい場合は、show spanning-tree summaryを使います。

Switch# show spanning-tree summary
Switch is in rapid-pvst mode
Root bridge for: VLAN0010
EtherChannel misconfig guard is enabled
Extended system ID is enabled
Portfast Default is disabled
PortFast BPDU Guard Default is disabled
Portfast BPDU Filter Default is disabled
Loopguard Default is disabled
UplinkFast is disabled
BackboneFast is disabled
Pathcost method used is short

Name                   Blocking Listening Learning Forwarding STP Active
---------------------- -------- --------- -------- ---------- ----------
VLAN0010                      0         0        0          2          2
---------------------- -------- --------- -------- ---------- ----------
1 vlan                         0         0        0          2          2

Switch is in rapid-pvst modeの行で動作モードがRapid PVST+であること、Root bridge for: VLAN0010の行でどのVLANのルートブリッジになっているかが分かります。VLANごとの詳細なポート単位の情報を見たいときはshow spanning-tree vlan 10、スイッチ全体のモード・ルートブリッジ状況・各種保護機能のグローバルデフォルト設定を素早く把握したいときはshow spanning-tree summary、というように目的に応じて使い分けます。

ポートロール(役割)

STPは、各スイッチの各ポートに、次のいずれかの役割を割り当てます。

  • ルートポート(root port):ルートブリッジへ到達するための、最もコストの低い経路にあたるポートです。ルートブリッジ以外の各スイッチには、必ず1つだけ存在します。
  • 指定ポート(designated port):特定のLANセグメントにおいて、ルートブリッジへの最良経路を提供するポートです。セグメントごとに1つ選ばれます。
  • 代替ポート(alternate port):ルートポートに障害が発生した場合の予備経路となるポートです。通常はブロックされた状態です。
  • バックアップポート(backup port):指定ポートの予備経路となるポートです(同一セグメントへの複数リンクがある場合等)。
  • 無効ポート(disabled port):管理上シャットダウンされ、スパニングツリーに参加していないポートです。

通常の動作では、ルートポートと指定ポートだけがフレームを転送し、代替ポート・バックアップポートは待機状態(ブロック)となります。

ポートステート(状態)

Rapid PVST+(RSTP)では、フレームの取り扱い方に応じて、各ポートが次の3つの状態のいずれかを取ります。従来の802.1D STPにあった5つの状態(無効・ブロッキング・リスニング・ラーニング・フォワーディング)のうち、無効・ブロッキング・リスニングの3つが、Rapid PVST+ではディスカーディング(discarding)という1つの状態に統合されています。

  • ディスカーディング(discarding):ユーザーデータフレームを転送せず、MACアドレステーブルへの学習も行いません。ただし、BPDUは受信・処理します。
  • ラーニング(learning):フレームを転送はしませんが、受信したフレームからMACアドレステーブルへの学習を開始します。
  • フォワーディング(forwarding):フレームの転送と、MACアドレステーブルへの学習の両方を行う、通常の動作状態です。

PortFastとBPDUガード・BPDUフィルタ

PortFast

PC等の末端の機器だけが接続されるアクセスポートでは、そのポートの先に別のスイッチがつながっていることは想定されないため、STPの通常の収束処理(ディスカーディング・ラーニングを経てフォワーディングに至るまでの遅延)を待つ必要がありません。PortFastを設定すると、そのポートはこの遅延をスキップし、リンクアップ後すぐにフォワーディング状態へ移行します。

Switch(config-if)# spanning-tree portfast

BPDUガード

PortFastを設定したポートは、本来スイッチが接続されることを想定していません。しかし、誤ってそこにスイッチやハブが接続され、BPDU(Bridge Protocol Data Unit、STPの制御メッセージ)を受信してしまうと、意図しないループが発生する恐れがあります。BPDUガードは、PortFastが設定されたポートでBPDUを受信した場合に、そのポートをerrdisable状態(強制的にシャットダウン)にすることで、この事態を防ぎます。errdisable状態になったポートは、通常は管理者による手動での復旧作業が必要ですが、自動復旧を設定することもできます。

Switch(config-if)# spanning-tree bpduguard enable

インターフェイス単位でこのコマンドを設定すると、PortFastの設定有無にかかわらず、そのポートでBPDUを受信した時点でerrdisable状態になります。すべてのPortFast対象ポートに一括で適用したい場合は、グローバルコンフィギュレーションモードでspanning-tree portfast bpduguard defaultを設定する方法もあり、この場合はPortFastが有効なポートにのみBPDUガードが自動的に適用されます。

BPDUフィルタ

BPDUフィルタは、対象のポートでBPDUの送受信そのものを行わなくする機能です。BPDUガードのように「受信したら遮断する」のではなく、そもそもBPDUをやり取りしないようにする点が異なります。設定を誤ると、本来検知すべきループをSTPが検知できなくなり、かえってループを引き起こす危険性があるため、BPDUガードに比べて慎重な使用が求められますグローバル設定でのBPDUフィルタは、PortFastが有効なポートでBPDUを一度でも受信すると、そのポートのPortFast・BPDUフィルタが自動的に無効化される、より安全な動作をしますが、インターフェイス単位で明示的に設定した場合は、この自動無効化が働かない点に注意が必要です。[1]。

Switch(config-if)# spanning-tree bpdufilter enable

BPDUガードと同様、インターフェイス単位でこのコマンドを設定すると、PortFastの設定有無にかかわらず、そのポートでのBPDU送受信そのものが行われなくなります。

ルートガードとループガード

PortFast・BPDUガード・BPDUフィルタが主にアクセスポート(末端機器向け)を対象とするのに対し、ルートガードとループガードは、主にスイッチ間のリンク(トランクポート等)を対象とする保護機能です。

ルートガード

意図しないスイッチが、より優れたBPDUを送信してルートブリッジの座を奪おうとする状況を防ぎます。ルートガードが設定されたポートで、現在のルートブリッジより優れたBPDUを受信すると、そのポートはroot-inconsistent(ルート不整合)状態となり、フォワーディングを停止します。これにより、管理者が意図した場所にルートブリッジの位置を固定できます。

Switch(config-if)# spanning-tree guard root

ルートブリッジへ向かうポートには設定せず、本来ルートブリッジが存在すべきでない方向の下流側ポートや、意図しないスイッチが接続され得る境界のポート等に設定するのが一般的です。

ループガード

正常に稼働していたルートポート・代替ポートが、何らかの理由(片方向リンク障害等)でBPDUを受信できなくなった場合、本来はブロックされているべきポートが誤ってフォワーディング状態に遷移し、ループを引き起こす恐れがあります。ループガードは、こうした状況を検知すると、そのポートをloop-inconsistent(ループ不整合)状態にしてフォワーディングを防ぎます。

Switch(config-if)# spanning-tree guard loop

ルートガードが「悪意・誤設定によるルートブリッジの乗っ取り」を防ぐのに対し、ループガードは「リンク障害によるBPDU受信断」を原因とするループを防ぐ、という保護対象の違いがあります。

ガード機能で不整合状態になっているポートの確認

ルートガード・ループガードによって現在root-inconsistent状態またはloop-inconsistent状態になっているポートがあるかどうかは、show spanning-tree inconsistentportsで一覧確認できます。

Switch# show spanning-tree inconsistentports

Name                 Interface              Inconsistency
-------------------- ---------------------- ------------------
VLAN0010             GigabitEthernet0/3     Root Inconsistent

該当ポートが無ければ、このコマンドの実行結果は空(見出し行のみ)になります。フォワーディングしないポートが見つかった際、まずこのコマンドで「ガード機能によって意図的にブロックされているのか」を切り分けるのが実務上の定石です。


補足

  1. グローバル設定でのBPDUフィルタは、PortFastが有効なポートでBPDUを一度でも受信すると、そのポートのPortFast・BPDUフィルタが自動的に無効化される、より安全な動作をしますが、インターフェイス単位で明示的に設定した場合は、この自動無効化が働かない点に注意が必要です。 ↩