高度な STP 機能:PortFast、BPDU Guard、および BPDU フィルタ

    本ページは英語ドキュメントを翻訳したものです。

     


     

    高度な STP 機能:PortFast、BPDU Guard、および BPDU フィルタ高度な STP 機能は、どのシスコ認定レベルの学習においても、最もよく誤解されるトピックの 1 つです。この機能に関して曖昧に記述されていることや、明らかに間違っている情報さえあります。この記事では、PortFast、BPDU Guard、および BPDU フィルタの運用に関して詳しく説明します。

     

    PortFast

     

    PortFast 機能は、ポートが時間内にフォワーディング ステートへと遷移できないために、PC が DHCP アドレスを取得できなくなる状況を克服することを目的として開発されました。これは、STP がリスニング ステートおよびラーニング ステートへと移行していくことが原因であり、それには通常 30 秒かかります。PortFast 機能を使用すると、ポートはリスニング ステートとラーニング ステートをバイパスし、即座にフォワーディング ステートへと移行できるようになります。PortFast の目的は、重要な遷移ステートをスキップすることでポートが STP のコンバージェンスを待機する時間を短縮させることであるため、エンド デバイスに接続するエッジ ポートにのみ設定してください。PortFast が、別のスイッチに接続するインターフェイスで有効になると、STP の一時ループが作成される可能性があります。これはネットワークに支障をきたすおそれもあります。IOS では、PortFast が有効になると、これに関する警告が表示されます。

     

    インターネット上には、PortFast の循環の動作の詳細に関する間違った情報が多く出回っています。最も一般的な誤解の 1 つは、PortFast が実質的に STP を無効化し、ポート上で BPDU の送受信が行われなくなるというものです。これはすべて間違いです。PortFast が有効になったポートは BPDU を送信するだけでなく、実際には PortFast の動作ステータスは、BPDU の受信に依存しています。ポートが BPDU を受信すると、PortFast 機能は無効化されます。では、PortFast の管理ステートと動作ステートの違いをはっきりさせましょう。管理ステートとは、デバイスで設定された内容を指しており、動作ステートとは、機能が実際に有効化または無効化されたかを定義するものです。PortFast を有効にする方法は、大きく分けて 2 つあります。グローバルに設定する方法(spanning-tree portfast default)と、インターフェイスごとに設定する方法(spanning-tree portfast)です。両方のコマンドは、動作中アクセス ポートで PortFast を有効にします。たとえば、トランクをネゴシエートするように管理上設定されたものの、失敗したポートは、アクセス モードで動作します。

     

    コマンド ラインを見てみましょう。PC は Eth0/2 で S1 に接続されています。ポートは dynamic desirable モードに設定され、PortFast はインターフェイス上で設定されています。これが、管理ステートです。S1 は PC とのトランク確立に失敗するため、ポートはアクセス モードに戻り、PortFast が有効になります。これが、動作ステートです。

     

    S1#show run interface eth0/2

    interface Ethernet0/2   

    switchport mode dynamic desirable

    spanning-tree portfast 

     

    S1#show interface eth0/2 switchport                                           

    Name: Et0/2

    Switchport: Enabled

    Administrative Mode: dynamic desirable                                         

    Operational Mode: static access

     

    S1#show spanning-tree interface eth0/2 portfast                               

    VLAN0001            enabled  

     

     

    BPDU については、どうでしょか。まだ、送信されているかどうか見てみましょう。

     

    S1#show spanning-tree interface eth0/2 detail | include BPDU                                     

      BPDU: sent 580, received 0

     

    明らかに、ポートはまだ BPDU を送信しています。STP は、稼働しています。

     

     

    代わりに、ポートにルート スイッチを一時的につなげたらどうなりますか。ポートは BPDU を受信し、PortFast 機能は実質的に無効化されます。

     

    S1#show spanning-tree interface eth0/2 detail | include BPDU

    BPDU: sent 724, received 10   

     

    S1#show spanning-tree interface eth0/2 portfast                               

    VLAN0001            disabled

     

     

    PC は S1 Eth0/2 に再び接続されます。インターフェイスをトランクとして機能するよう明示的に設定すると、どうなるでしょう。PortFast 機能は無効化されます。

     

    S1#show run interface eth0/2

    interface Ethernet0/2               

    switchport trunk encapsulation dot1q                                         

    switchport mode trunk

    spanning-tree portfast 

     

    S1#show interface eth0/2 switchport               

    Name: Et0/2

    Switchport: Enabled

    Administrative Mode: trunk

    Operational Mode: trunk

     

    S1#show spanning-tree interface eth0/2 portfast

    VLAN0001            disabled

     

     

    さらに、PortFast をトランク ポートで有効化するインターフェイス レベル コマンド、spanning-tree portfast trunk があります。このコマンド関する説明は少々曖昧です。ドキュメントでは、「このコマンドは、トランク モードであってもインターフェイスで PortFast を有効化します」と述べた後、「このコマンドでは、PortFast をトランク ポートで設定できます」と説明しています。前半部分は正確です。後半部分は、トランク ポートでのみ PortFast を有効化できると解釈できますが、これは間違いです。実際には不可能です。動作中トランク ポートでのみ PortFast を有効にするコンフィギュレーション コマンドはありません。

     

    S1(config)#interface eth0/2

    S1(config-if)#no spanning-tree portfast

    S1(config-if)#spanning-tree portfast trunk   

     

    S1#show interface eth0/2 switchport

    Name: Et0/2

    Switchport: Enabled

    Administrative Mode: trunk

    Operational Mode: trunk

     

    S1#show spanning-tree interface eth0/2 portfast                               

    VLAN0001            enabled

     

     

    インターフェイスがアクセス モードに変更されても、PortFast はまだ有効です。

     

    S1#show run interface eth0/2

    interface Ethernet0/2

    switchport mode access

    spanning-tree portfast trunk 

     

    S1#show interface eth0/2 switchport       

    Name: Et0/2

    Switchport: Enabled                                                           

    Administrative Mode: static access                     

    Operational Mode: static access   

     

    S1#show spanning-tree interface eth0/2 portfast   

    VLAN0001            enabled

     

     

    STP コンバージェンスが速くなることは、PortFast 機能の主なメリットですが、唯一のメリットではありません。スイッチは、PortFast が有効なポートのリンク ステータスが変更されても、TCN を生成しません。非常に大規模で(フラットな)ネットワークでは、ネットワークのトポロジが絶えず変化し続ける状態になることがあります。これは過度のユニキャスト フラッディングのような大きな問題につながり、ネットワークが著しく遅くなる可能性があります。そのため、PortFast をネットワークに正しく導入することが重要です。

     

     

    BPDU Guard


    BPDU Guard を使用すると、ポートは BPDU を受信しなくなります。ポートが引き続き BPDU を受信する場合は、保護対策としてポートが error-disabled ステートに置かれます。PortFast 機能と同様、BPDU Guard には 2 つの設定オプションがあります。グローバルに設定する方法(spanning-tree portfast bpduguard default)と、インターフェイスごとに設定する方法(spanning-tree bpduguard enable)です。コマンド構文を見るとお分かりかもしれませんが、グローバルに構成する場合、BPDU Guard は PortFast の動作ステートに依存します。PortFast がどのように設定されたかに関係なく、有効でありさえすれば、BPDU Guard は有効になります。インターフェイスごとに設定すると BPDU Guard がポートで無条件に有効化されます。PortFast やアクセス/トランク モードに影響されません。

     

    コマンド ラインから、この動作を見てみましょう。S1 (ルート)および S2 のスイッチは、両端で Eth0/0 に直接接続されています。PortFast が動作中でない限り、グローバル コマンドの効果がないことを確認しましょう。インターフェイスはアクセス モードに設定され、BPDU Guard はグローバルに有効化されており、PortFast は設定されていません。両方のスイッチの設定は同じです。

     

    S2#show interface eth0/0 switchport     

    Name: Et0/0

    Switchport: Enabled                                                         

    Administrative Mode: static access                   

    Operational Mode: static access


    S2#show spanning-tree interface eth0/0 portfast                             

    VLAN0001            disabled


    S2(config)#spanning-tree portfast bpduguard default

    S2#show spanning-tree summary                                                 

    Switch is in pvst mode                                                       

    Root bridge for: none                                                     

    Extended system ID          is enabled                                 

    Portfast Default            is disabled                                       

    PortFast BPDU Guard Default  is enabled

                                           

    ご覧のように、BPDU Guard はグローバルに有効化されています。このコマンド出力だけを見ると間違った結論に達してしまう可能性があります。BPDU 受信後にポートが errdisable 状態になると予想することがあるためです。しかし、BPDU は受信されていますが、ポートはまだ転送しています。PortFast 機能が有効になっていないため、BPDU Guard はポートを errdisable 状態にしません。


    S2#show spanning-tree interface eth0/0 detail | include BPDU                   

      BPDU: sent 0, received 136    

     

    S2#show spanning-tree interface eth0/0 portfast                               

    VLAN0001            disabled

     

    S2#show spanning-tree | begin Interface           

    Interface          Role Sts Cost      Prio.Nbr Type                           

    ------------------- ---- --- --------- -------- ------

    Et0/0              Root FWD 100      128.1    Shr

     


    S1 で PortFast をグローバルに有効化してみましょう。

     

    S1(config)#spanning-tree portfast default

     

    S1#show spanning-tree summary                                                 

    Switch is in pvst mode                                                         

    Root bridge for: VLAN0001                                                     

    Extended system ID          is enabled   

    Portfast Default            is enabled                                       

    PortFast BPDU Guard Default  is enabled                                       

     

    S1#show spanning-tree interface eth0/0 portfast   

    VLAN0001            enabled

     

    S1#show spanning-tree | begin Interface                                   


    Interface          Role Sts Cost      Prio.Nbr Type     

    ------------------- ---- --- --------- -------- ----------

    Et0/0              Desg FWD 100      128.1 Shr Edge       

     


    あら?PortFast 機能が有効化されたのに、ポートはなぜ転送を続けるのでしょうか。なぜログ メッセージがないのでしょうか。答えは通常の STP 運用にあります。スイッチは PVST+ を実行しており、トポロジの変更がない限り、ルート スイッチのみが Hello インターバルごとに BPDU を送信します。S1 がルート スイッチであり、S2 が TCN を送信するようになるイベントが発生しなかったため、S1 は BPDU を受信していません。

     

    S1#show spanning-tree interface eth0/0 detail | include BPDU|Bpdu             

      Bpdu guard is enabled by default                   

      BPDU: sent 631, received 0

     


    S2 で同じコマンドを実行してみましょう。

     

    S2(config)#spanning-tree portfast default

     


    S2 が S1 から BPDU を受信してすぐ、ポートは errdisable 状態になり、コンソールにエラー メッセージが表示されました。


    *Mar  3 11:26:15.503: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Ethernet0/0 with BPDU Guard enabled. Disabling port.

    *Mar  3 11:26:15.503: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/0, putting Et0/0 in err-disable state

    *Mar  3 11:26:16.504: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to down

    *Mar  3 11:26:17.503: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to down

     

    S2#show interface status err-disabled                                         

    Port      Name    Status        Reason      Err-disabled Vlans

    Et0/0              err-disabled  bpduguard

     

     

    errdisable 状態のポートをリカバリするには 2 つの方法があります。shutdown コマンドおよび no shutdown コマンドを使用して手動で再度有効にするか、errdisable recovery cause bpduguard を使用して errdisable 状態の自動リカバリを設定できます。デフォルトのリカバリ間隔は 300 秒ですが、errdisable recovery interval <sec> コマンドを使用して変更できます。


    S2#show errdisable recovery                                                   

    ErrDisable Reason           

    Timer Status                                     

    -----------------            --------------                                   

    arp-inspection              Disabled       nbsp;                                  

    bpduguard                    Enabled                                          

    channel-misconfig (STP)      Disabled                                         


    ---出力を省略---                                       

                                                                                   

    Timer interval: 300 seconds


    Interfaces that will be enabled at the next timeout:                           


    Interface      Errdisable reason      Time left(sec)                         

    ---------      -----------------      --------------                         

    Et0/0                  bpduguard          275



    当然、自動リカバリを使用しても根本原因は解決されません。300 秒後、ポートは再度有効化されますが、有効になるのはルート スイッチから次の BPDU を受信し、また errdisable 状態になるまでの短期間のみです。

     

    では、インターフェイス レベルの BPDU Guard 設定は、動作中の PortFast またはアクセス/トランク ステートと独立していることを実証しましょう。

     

    S2(config)#no spanning-tree portfast default

    S2(config)#no spanning-tree portfast bpduguard default

    S2(config)#interface Eth0/0

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

     

    S2#show spanning-tree interface eth0/0 portfast                               

    VLAN0001            disabled  

     

    S2#show spanning-tree interface eth0/0 detail | include Bpdu|BPDU             

    Bpdu guard is enabled                                                       

    BPDU: sent 0, received 140

     


    最初の BPDU を受信すると、インターフェイスは errdisable 状態になります。

     

    *Mar  3 12:55:33.953: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Et0/0 with BPDU Guard enabled. Disabling port.

    *Mar  3 12:55:33.953: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/0, putting Et0/0 in err-disable state

    *Mar  3 12:55:35.325: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to down

     

    S2#show interface status err-disabled                                         

                                                                               

    Port      Name    Status        Reason      Err-disabled Vlans                     

    Et0/0            err-disabled  bpduguard

     


    BPDU フィルタ

     

    BPDU フィルタにより、指定したポートは BPDU を送受信しなくなります。この機能も同様に、グローバルに設定する方法(spanning-tree portfast bpdufilter default)と、インターフェイスごとに設定する方法(spanning-tree bpdufilter enable)があります。インターフェイス設定は、PortFast 動作ステートおよびアクセス/トランク モードに関係なく、BPDU の送受信を無条件にフィルタリングします。これは、実質 STP を無効にするのと同等です。永久ループが生じやすくなるため非常に危険です。興味深いことに、このコマンドが適用されても IOS は警告メッセージを表示しません。誤ったインターフェイスで PortFast を有効にした場合は(BDPU フィルタほどのリスクはないのに)、IOS では管理者に伝えるべき重要な情報と認識されるようです。

     

    では、実際の運用を見てみましょう。S1(ルート)および S2 のスイッチは 2 つのリンクで接続されています。S2 の Eth0/1 はブロックしています。

     

    S1#show spanning-tree | begin Interface                                       

    Interface          Role Sts Cost      Prio.Nbr Type                           

    ---------------------------------------------------

    Et0/0              Desg FWD 100      128.1    Shr                           

    Et0/1              Desg FWD 100      128.2    Shr       

     

     

    S2#show spanning-tree | begin Interface                                       

    Interface          Role Sts Cost      Prio.Nbr Type                           

    ---------------------------------------------------

    Et0/0              Root FWD 100      128.1    Shr                           

    Et0/1              Altn BLK 100      128.2    Shr     

     

     

    BPDU フィルタを S2 上で有効にするとどうなるでしょうか。

     

    S2(config)#interface range eth0/0 - 1                                                       

    S2(config-if-range)#spanning-tree bpdufilter enable

     

     

    S1#show spanning-tree                                                         

                                                                                   

    VLAN0001                                                                       

      Spanning tree enabled protocol ieee                                         

      Root ID    Priority    32769                                                 

                Address    aabb.cc00.1f00                                       

                This bridge is the root                                           

                Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec         

                                                                                   

      Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)                 

                Address    aabb.cc00.1f00                                       

                Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec         

                Aging Time  300 sec                                               

                                                                                   

    Interface          Role Sts Cost      Prio.Nbr Type                           

    ------------------------------------------------------------------

    Et0/0              Desg FWD 100      128.1    Shr                           

    Et0/1              Desg FWD 100      128.2    Shr                           

     

     

    S2#show spanning-tree                                                         

                                                                                   

    VLAN0001                                                                       

      Spanning tree enabled protocol ieee                                         

      Root ID    Priority    32769                                                 

                Address    aabb.cc00.2000                                       

                This bridge is the root                                           

                Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec         

                                                                                   

      Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)                 

                Address    aabb.cc00.2000                                       

                Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec         

                Aging Time  300 sec                                               

                                                                                   

    Interface          Role Sts Cost      Prio.Nbr Type                           

    ------------------------------------------------------------------

    Et0/0              Desg FWD 100      128.1    Shr                           

    Et0/1              Desg FWD 100      128.2    Shr                         

     

     

    両方のスイッチがルートであると判断し、すべてのインターフェイスが転送しています。BPDU は S2 で送受信されていません。

                                                                                                                                   

    S2#show spanning-tree interface eth0/0 detail | include Bpdu|BPDU             

      Bpdu filter is enabled                                                     

      BPDU: sent 0, received 0

     

    S2#show spanning-tree interface eth0/1 detail | include Bpdu|BPDU             

      Bpdu filter is enabled                                                     

      BPDU: sent 0, received 0

     

     

    帯域幅の利用に注目してださい。パケット数がかなり多くなっています。

     

    S2#show interface eth0/0                                                       

    Ethernet0/0 is up, line protocol is up (connected)                                             

      30 second input rate 12481000 bits/sec, 20262 packets/sec                   

      30 second output rate 12482000 bits/sec, 20264 packets/sec                                                    


    S2#show interface eth0/1                                                       

    Ethernet0/1 is up, line protocol is up (connected)                                             

      30 second input rate 12477000 bits/sec, 20256 packets/sec                   

      30 second output rate 12474000 bits/sec, 20250 packets/sec                   

     


    これは IOL で動作するエミュレート型ラボです。この 2 つのスイッチ以外に、その他のデバイスやトラフィックはありません。この設定は、ネットワークを容易にクラッシュさせることが見て取れます。このコマンドの実行には十分な注意が必要です。

     

    グローバル設定はもう少し複雑です。BPDU Guard 機能と同様に、グローバル BPDU フィルタも、PortFast 動作ステートのインターフェイスで有効になります。グローバル モードでは、スイッチは受信する BPDU をフィルタリングしませんが、送信 BPDU のほとんど(すべてではない)はフィルタリングされます。ポートが起動したら、11 の BPDU が送信されます。BPDU を受け取ると、PortFast および BPDU フィルタ機能は無効になります。

     

    これが実際どのように動作するのか確認しましょう。S1 の両方のインターフェイスが、インターフェイス BPDU フィルタで設定されています。S2 の両方のインターフェイスでは spanning-tree portfast trunk が設定されており、PortFast が必ず動作するように設定されています。また、BPDU フィルタはグローバルに有効になっています。

     

    S1#show spanning-tree interface eth0/0 detail | include Bpdu|BPDU             

      Bpdu filter is enabled                                                     

      BPDU: sent 0, received 0                                                   

                                                                             

    S1#show spanning-tree interface eth0/1 detail | include Bpdu|BPDU             

      Bpdu filter is enabled                                                      

      BPDU: sent 0, received 0

     

     

    S2#show spanning-tree summary                                                 

    Switch is in pvst mode                                                         

    Root bridge for: VLAN0001                                                     

    Extended system ID          is enabled                                       

    Portfast Default            is disabled

    PortFast BPDU Guard Default  is disabled                                       

    Portfast BPDU Filter Default is enabled

     

     

    ポートは、11 の BPDU を送信してから、停止します。

     

    S2#show spanning-tree interface eth0/0 detail | include Bpdu|BPDU             

      Bpdu filter is enabled by default                                           

      BPDU: sent 11, received 0                                                  

     

    S2#show spanning-tree interface eth0/1 detail | include Bpdu|BPDU             

      Bpdu filter is enabled by default                                           

      BPDU: sent 11, received 0

     

     

    インターフェイス BPDU フィルタを S1 で無効にしたとき、S2 がどうなるか見てみましょう。

     

    S1(config)#interface range eth0/0 - 1

    S1(config-if-range)#no spanning-tree bpdufilter enable


    S2#debug spanning-tree events

    *Mar  3 15:01:09.027: STP: VLAN0001 heard root 32769-aabb.cc00.1f00 on Et0/1   

    *Mar  3 15:01:09.027:    supersedes 32769-aabb.cc00.2000                     

    *Mar  3 15:01:09.027: STP: VLAN0001 new root is 32769, aabb.cc00.1f00 on port Et0/1, cost 100 *Mar  3 15:01:09.027: STP: VLAN0001 new root port Et0/0, cost 100             

    *Mar  3 15:01:09.027: STP: VLAN0001 sent Topology Change Notice on Et0/0       

    *Mar  3 15:01:09.027: STP[1]: Generating TC trap for port Ethernet0/1         

    *Mar  3 15:01:09.027: STP: VLAN0001 Et0/1 -> blocking

     


    S2 は、優先順位の高い BPDU を受信するため、実質的に BPDU フィルタを無効にして、通常の STP 運用に戻ります。Eth0/0 はルート ポートになり、Eth0/1 はブロックします。

     

    S2#show spanning-tree | begin Interface                                       

    Interface          Role Sts Cost      Prio.Nbr Type                           

    ---------------------------------------------------

    Et0/0              Root FWD 100      128.1    Shr                           

    Et0/1              Altn BLK 100      128.2    Shr

     

     

    まとめ


    このブログでは、高度な STP 機能について詳しく説明しましたが、大切なポイントをここにまとめます。

    • PortFast は、リスニング ステートおよびラーニング ステートをバイパスして、ポートを直ちにフォワーディング ステートにします。

    • PortFast 対応ポートは、引き続き BPDU を送信します。

    • BPDU を受信すると、PortFast は無効化されます。

    • スイッチは、PortFast が有効化されたポートの状態が変化しても TCN を生成しません。

    • 管理ステートと動作ステートには違いがあります。

    • spanning-tree portfast trunk コマンドはアクセス ポートおよびトランク ポートの両方で PortFast を有効にします。

    • BPDU Guard および BPDU フィルタのグローバル モードは動作中の PortFast に依存します。

    • BPDU Guard および BPDU フィルタのインターフェイス モードは、無条件に動作します。

    • BPDU フィルタを誤って設定するのは、PortFast を誤って設定するよりも危険ですが、IOS では警告メッセージが表示されません。

    • PortFast は、次の BPDU が受信され PortFast が無効化されるまで、最大 2 秒(デフォルトの Hello インターバル)の一時ループを生成する可能性があります。BPDU フィルタは、BPDU をすべて無視するため、永久ループを生成してしまう可能性があります。

    • BPDU が送信される場合と、送信されない場合など、STP の動作を覚えておきましょう。

    CLNBanner