[CISCO IOS] Spanning-treeのベストプラクティスを考える

# 1. はじめに
オプションがたくさんあって複雑なSTPの設定方法をまとめます。

# 2. 前提
使うのはRPVST (Rapid Per-Vlan Spanning-Tree)。

# 3. 設定方法

RPVSTの有効化：

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

Primary/Secondryブリッジの設定：
　1系スイッチに対して

```
(config)#spanning-tree vlan 1-4094 priority 0
```

　2系スイッチに対して

```
(config)#spanning-tree vlan 1-4094 priority 4096
```

BPDU Guardの有効化：

```
(config)#spanning-tree portfast bpduguard default
```

Portfastの設定：
　アクセスリンクに対して

```
tc0001(config-if)#spanning-tree portfast
```

　トランクリンクに対して

```
tc0001(config-if)#spanning-tree portfast trunk
```

# 4. 解説

## 4-1. RPVSTの有効化
デフォルトではRPVSTではなくPVSTが有効になっていますので、RPVSTに変更します。

```
tc0001#show spanning-tree

VLAN0001
  Spanning tree enabled protocol ieee
（以下省略）

tc0001#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
tc0001(config)#spanning-tree mode rapid-pvst
tc0001(config)#end
tc0001#show spanning-tree

VLAN0001
  Spanning tree enabled protocol rstp
（以下省略）
```

たまに`no spanning-tree`という悪魔のコマンドを使ってSTPを切っているスイッチがありますが、スイッチがシングル構成であっても絶対に辞めましょう。人はケーブルがあると空きポートに挿したくなる生き物なのです。STPを有効にすることによるデメリットはありません。

## 4-2. Primary/Secondaryブリッジの設定
上位スイッチが2台ある環境では1系をprimary、2系をsecondaryに設定しましょう。まずはCisco推奨の`root primary`というオプションを使ってみます。

```
tc0001#show spanning-tree
VLAN0001
  Spanning tree enabled protocol rstp
  Root ID    Priority    32769
             Address     0015.6256.6300
             Cost        19
             Port        25 (FastEthernet1/0/23)
（以下省略）
tc0001#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
tc0001(config)#spanning-tree vlan 1-4094 root primary
tc0001(config)#end
tc0001#show spanning-tree

VLAN0001
  Spanning tree enabled protocol rstp
  Root ID    Priority    24577
             Address     0016.4779.5500
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
（以下省略）
```

```
tc0002#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
tc0002(config)#spanning-tree vlan 1-4094 root secondary
tc0002(config)#end
tc0002#show spanning-tree
（以下省略）
  Bridge ID  Priority    28673  (priority 28672 sys-id-ext 1)
             Address     0015.6256.6300
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time 300
```

Priorityが24576に変更されました。ちょっと中途半端で、納得のいかない数字です。既に他のブリッジにpriorityが設定してある時に`primary`オプションを設定するとどうなるかやってみましょう。2系スイッチにPriority 8192を設定した状態から始めます。

```
tc0001#show spanning-tree

VLAN0001
  Spanning tree enabled protocol rstp
  Root ID    Priority    8193
             Address     0015.6256.6300
             Cost        19
             Port        26 (FastEthernet1/0/24)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
（省略）
tc0001#configure terminal
tc0001(config)#spanning-tree vlan 1-4094 root primary
tc0001(config)#end
tc0001#show spanning-tree

VLAN0001
  Spanning tree enabled protocol rstp
  Root ID    Priority    4097
             Address     0016.4779.5500
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
（省略）
```

今度はpriorityが4096になりました。これはどういうことでしょうか？　show runで設定を確認してみます。

```
tc0001#show running-config | include priority
spanning-tree vlan 1 priority 4096
spanning-tree vlan 2-4094 priority 24576
tc0001#
```

`root primary`という設定を入れたはずなのに、vlan 1のpriorityが4096に、それ以外が24576に設定されています。どうやら、`root primary`はコマンドが発効された瞬間にroot bridgeのpriorityを見て、それを上回るように設定されるようですね。2系スイッチのpriorityを0に設定した状態でコマンドを入れると失敗します。

```
tc0001(config)#spanning-tree vlan 1-4094 root primary
% Failed to make the bridge root for vlan 1
% It may be possible to make the bridge root by setting the priority
% for some (or all) of these instances to zero.
```

これはciscoの推奨コマンドではありますが、設計とは呼べないですね。priorityは定数で設定しましょう。実際にループ構成を取る設計だと、1系コアスイッチ、2系コアスイッチ、各アクセススイッチの順でpriorityが高くなっていく必要があります。1系には0を、2系には4096を設定しましょう。

```
tc0001(config)#spanning-tree vlan 1-4094 priority 0
tc0002(config)#spanning-tree vlan 1-4094 priority 4096
```

## 4-3. BPDU Guardの有効化とPortfast

Portfastはインターフェースに設定し、対象のポートでLink upが発生した際に、ListeningとLearningのプロセスをスキップして速やかにForwarding状態に移行させるコマンドです。STPとは関係のないサーバ、PC、ルータ等が接続されるポートで使用します。

STPでBLK状態のportに対して誤ってportfastを入れるとどうなるでしょうか？　Fa1/0/23とFa1/0/24を接続して、2系のスイッチのFa1/0/24がBLKになった状態から始めます。

```
tc0002#show spanning-tree
（省略）

Interface        Role Sts Cost      Prio.Nbr Type
---------------- ---- --- --------- -------- --------------------------------
Fa1/0/23         Root FWD 19        128.25   P2p
Fa1/0/24         Altn BLK 19        128.26   P2p

tc0002#debug spanning-tree events
Spanning Tree event debugging is on
tc0002#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
tc0002(config)#interface FastEthernet 1/0/24
tc0002(config-if)#spanning-tree portfast
%Warning: portfast should only be enabled on ports connected to a single
 host. Connecting hubs, concentrators, switches, bridges, etc... to this
 interface  when portfast is enabled, can cause temporary bridging loops.
 Use with CAUTION

%Portfast has been configured on FastEthernet1/0/24 but will only
 have effect when the interface is in a non-trunking mode.
tc0002(config-if)#end

...
...
```

何も起きませんでしたね。Portfastの細かい検証は別の回に再度やろうと思います。

BPDU Guardは機器全体に設定します。Portfastに設定されたポートに対してBPDUが飛んできた時、つまり設計とは異なる機器が接続されてしまった時に、そのポートを強制的にdisableにします。
BPDU GuardはPortfastの弱点を補完するコマンドで、デメリットも無いため必ず設定しましょう。

```
tc0001#show spanning-tree summary
（略）
PortFast BPDU Guard Default  is disabled
（略）
tc0001#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
tc0001(config)#spanning-tree portfast bpduguard default
tc0001(config)#end
tc0001#show spanning-tree summary
（略）
PortFast BPDU Guard Default  is enabled
```

# 4. おわりに

やはり分量が多くなってしまいました。次回もstp編です。