Layer 2 Pro · 第 2 課

STP 深入Rapid PVST+(快速每 VLAN 生成樹)與 BPDU Guard(BPDU 防護)

客廳牆上多接了一部舊 Switch,為什麼全屋的流量都改道經過它?

主角:八爪、阿麥、小比閱讀時間約 20 分鐘

建議先讀:小故事 7「Spanning Tree」、小故事 6「Trunk 與 802.1Q」

1. 情境動畫

按「下一步」逐步看。這一課由小故事 7 的三部 Switch(交換器)開始,它們用 STP(生成樹協定)解開了環路:S1 是 Root Bridge(根橋),S3 通往 S2 的 Port 被 Blocked(阻斷)。

序幕:溫習一下

第 1 步/共 9 步

三部 Switch 的樹

還記得小故事 7 嗎?三部 Switch 圍成一個圈。STP(生成樹協定)選了 S1 做 Root Bridge(根橋),S3 往 S2 的 Port 暫停轉發,圈就解開了。

動畫文字版(全部步驟)
  1. 序幕:溫習一下
  2. 三部 Switch 的樹 八爪:還記得小故事 7 嗎?三部 Switch 圍成一個圈。STP(生成樹協定)選了 S1 做 Root Bridge(根橋),S3 往 S2 的 Port 暫停轉發,圈就解開了。
    • 詳細內容:網絡小故事 7「八爪的迷路風暴」
  3. 其實是抽籤 八爪:不過 S1 為什麼當選?三部 Switch 的優先值都是預設的 32768,加上 VLAN 10,全部是 32778。最後只能比 MAC Address(硬體位址),S1 的 …:A1 剛好最小。這其實是抽籤!
  4. 第一幕:客廳來了新朋友
  5. 牆身插座多了一部 Switch 阿麥:表哥帶來一部舊 Switch,隨手插進客廳的牆身插座,即 S2 的 Gi0/5。它以前在公司做核心 Switch,優先值早已調低到 4096。
  6. 「我的 Bridge ID 最小!」 八爪:S4 一接上就發出 BPDU(橋接協定資料單元):Bridge ID 是 4096 + 10 = 4106。我們三個核對一下,32778 比 4106 大,真的輸了。
  7. 樹根搬到客廳 八爪:整棵樹以 S4 為中心重新計算:S2 的 Root Port 變成 Gi0/5,S1 要經 S2 才到得了樹根,S3 往 S1 的那條線反而變成後備。
  8. 繞遠路 小比:我由書房的 Access Point 出發,要去 S1 那邊的家中 Router。以前經 S3 → S1 一步就到,現在要繞經客廳的 S2!而且 S4 一被拔走,全屋又要重新計算一次。
  9. 第二幕:修好網絡
  10. BPDU Guard 關門 八爪:牆身插座只應該接電腦。在 S2 的 Gi0/5 開啟 BPDU Guard(BPDU 防護):這個 Port 一收到 BPDU,就立即把它變成 err-disabled(錯誤停用)。
  11. 正式指定樹根 八爪:再用 root primary 把 S1 的優先值設成 24576,用 root secondary 把 S2 設成 28672。以後樹根由我們決定,不再抽籤。
  12. PortFast:一插上就上網 阿麥:最後,接我和電視的 Port 開啟 PortFast(快速連接埠)。我開機後幾乎立即可以上網,不用再等大約 30 秒。

2. 任務簡報

發生了什麼事?

阿麥的表哥帶來一部舊 Switch,我們叫它 S4。他隨手把它插進客廳的牆身網絡插座。S4 以前在公司當核心 Switch,優先值早已被調低到 4096,而且接網線的 Port 同樣屬於 VLAN(虛擬區域網絡)10,即家人區。

S4 一接上,就不停發出 BPDU(橋接協定資料單元),宣稱「我的 Bridge ID 最小」。其他 Switch 核對後同意,於是:

  • S4 成為新的 Root Bridge。
  • 全屋的「樹」以 S4 為中心重新計算,連 S1 往外的流量也要繞經客廳。
  • 以後 S4 一關機或被拔走,全屋又要重新計算一次,網絡會斷斷續續。

小故事 7 裡,S1 當選 Root Bridge 其實是「抽籤」的結果:大家的優先值都是預設的 32768,只是 S1 的 MAC Address(硬體位址)剛好最小。任何一部 MAC Address 更小、或者優先值更低的 Switch 接進來,都可以搶走樹根。

拓撲圖

拓撲圖:S1 在上方,經 Gi0/1 連到左下的 S2,經 Gi0/2 連到右下的 S3;S2 和 S3 之間以各自的 Gi0/2 相連。S2 的 Gi0/3 接阿麥、Gi0/4 接電視、Gi0/5 接客廳牆身插座,插座接著冒牌 Switch S4。S3 的 Gi0/3 接書房的 Access Point。所有網線都是 1 Gbps,Path Cost 為 4。

Switch MAC Address Cisco 寫法 原本的優先值 Port
S1(核心) 00:00:5E:00:53:A1 0000.5e00.53a1 32768 Gi0/1 → S2、Gi0/2 → S3、Gi0/3 → 家中 Router
S2(客廳) 00:00:5E:00:53:A2 0000.5e00.53a2 32768 Gi0/1 → S1、Gi0/2 → S3、Gi0/3 → 阿麥、Gi0/4 → 電視、Gi0/5 → 牆身插座
S3(書房) 00:00:5E:00:53:A3 0000.5e00.53a3 32768 Gi0/1 → S1、Gi0/2 → S2、Gi0/3 → Access Point(無線基地台)
S4(冒牌) 00:00:5E:00:53:A0 0000.5e00.53a0 4096 接到 S2 的 Gi0/5

Cisco 設備把 MAC Address 寫成三組、每組四個十六進制數字,中間用點分隔。00:00:5E:00:53:A1 和 0000.5e00.53a1 是同一個地址,只是寫法不同。

「Gi0/1」是 GigabitEthernet0/1 的簡寫,即第 1 個 1 Gbps Port(連接埠)。所有 Switch 之間的網線都是 1 Gbps,Path Cost(路徑成本)為 4。為了簡單,這一課每條 Switch 之間的連線都當成一條網線;下一課才把 S1 和 S3 之間捆成兩條。

今課目標

  1. 看懂 show spanning-tree 的輸出,找出誰是 Root Bridge、每個 Port 擔任什麼角色。
  2. 用 BPDU Guard(BPDU 防護)把接終端裝置的 Port 保護好,阻止冒牌 Switch。
  3. 正式指定 S1 為 Root Bridge、S2 為後備,不再靠 MAC Address「抽籤」。
  4. 用 PortFast(快速連接埠)讓電腦一插上網線就可以上網。

3. 原理深入

Bridge ID 的真正樣子

小故事說 Bridge ID(橋接器識別碼)=優先值+MAC Address。在今天的 Switch 上,它其實有 8 個位元組(64 位元):

Bridge ID 結構圖:總長 64 位元。最左 4 位元是 Bridge Priority(可設定的優先值),接著 12 位元是 Extended System ID(VLAN 號碼),最後 48 位元是 MAC Address。例子:優先值 24576 加 VLAN 10,合共 24586,再加上 MAC Address 0000.5e00.53a1。

  • Bridge Priority(優先值)只剩 4 位元,所以只可以設成 4096 的倍數:0、4096、8192……61440,共 16 個選擇。
  • Extended System ID(擴充系統識別碼)佔 12 位元,自動填上 VLAN 號碼。這個設計來自 IEEE 802.1t,讓每個 VLAN 都有自己的 Bridge ID。

所以在 VLAN 10,預設的 Bridge ID 優先值部分是 32768 + 10 = 32778。在 show 輸出裡看到 32778、24586 這類「奇怪」數字,就是這個原因。

STP 家族:誰是誰?

名稱 標準 樹的數目 恢復速度
STP IEEE 802.1D 全個網絡一棵 30 至 50 秒
PVST+(每 VLAN 生成樹) Cisco 專有 每個 VLAN 一棵 30 至 50 秒
RSTP(快速生成樹協定) IEEE 802.1w(2001 年),後來併入 802.1D-2004 全個網絡一棵 通常幾秒內
Rapid PVST+ Cisco 專有 每個 VLAN 一棵 RSTP 通常幾秒內
MST(多重生成樹) IEEE 802.1s,後來併入 802.1Q 幾個 VLAN 共用一棵,數目自訂 通常幾秒內

「每個 VLAN 一棵樹」有個好處:VLAN 10 可以用 S1 做樹根,VLAN 20 可以用 S2 做樹根,兩條上行線各自分擔一部分流量。代價是 VLAN 越多,Switch 要計算的樹越多。這一課用 Cisco Switch 最常見的 Rapid PVST+,只看 VLAN 10 那棵樹。

RSTP 的 Port Role(連接埠角色)

小故事的 Blocked Port,在 RSTP 裡分得更細:

角色 在 show 裡寫成 意思
Root Port(根連接埠) Root 通往 Root Bridge 最近的 Port,每部非樹根 Switch 只有一個
Designated Port(指定連接埠) Desg 每條網線上負責轉送的一端
Alternate Port(替代連接埠) Altn 另一條通往 Root Bridge 的後備路;Root Port 斷了,它可以立即頂上
Backup Port(備份連接埠) Back 同一部 Switch 有兩個 Port 接在同一個網段上時的後備,今天很少見

RSTP 的 Port State(連接埠狀態)

傳統 STP 有五個狀態,RSTP 簡化成三個:

RSTP 狀態 對應的傳統狀態 學 MAC Address? 轉送 Frame(訊框)?
Discarding(丟棄) Disabled、Blocking、Listening 否 否
Learning(學習) Learning 是 否
Forwarding(轉發) Forwarding 是 是

Cisco 的 show spanning-tree 在 Rapid PVST+ 下仍然把 Discarding 寫成 BLK,所以看到 Altn BLK 不用奇怪。

RSTP 為什麼快?

  1. 每部 Switch 自己發 BPDU,每 2 秒一次(Hello Time)。連續 3 次收不到鄰居的 BPDU(約 6 秒),就當鄰居已經不在;網線直接斷開更是立即知道。
  2. Alternate Port 早已準備好。 Root Port 一斷,Alternate Port 立即升級為新的 Root Port,不用重新聆聽和學習。
  3. Proposal/Agreement(提議/同意)交握。 在 Point-to-Point(點對點)連線上,兩部 Switch 直接互相確認「你這邊安全嗎?」,確認後 Port 立即轉發,不用等計時器。

Edge Port(邊緣連接埠)與 PortFast

接電腦、電視、打印機的 Port 叫 Edge Port,因為那一端不會再有 Switch。問題是:電腦不會回覆 Proposal,Switch 只好慢慢等,由 Discarding 經 Learning 到 Forwarding,前後約 30 秒。阿麥的電腦開機後,DHCP(動態主機設定協定)可能等得不耐煩而逾時,拿不到 IP Address(網絡位址)。

在 Cisco Switch 上開啟 PortFast,就等於告訴 Switch:「這是 Edge Port。」效果有兩個:

  • 網線一插上,Port 立即進入 Forwarding。
  • 這個 Port 上落時,不會觸發 Topology Change(拓撲變更)。否則每次有人開關電腦,全網的 Switch 都要清走一部分 MAC Address Table(MAC 位址表),重新 Flooding(泛洪)。

保護 STP:四種 Guard 和 Filter

PortFast 有個危險:如果有人在 Edge Port 接上 Switch,Port 仍然立即轉發,有機會短暫形成環路,甚至像 S4 一樣搶走樹根。所以要配合保護功能:

功能 放在哪裡 收到 BPDU 時怎樣做 恢復方法
BPDU Guard(BPDU 防護) 接終端裝置的 Edge Port 立即把 Port 變成 err-disabled(錯誤停用),完全關閉 手動 shutdown/no shutdown,或設定自動恢復
Root Guard(根防護) 接下游 Switch、而樹根不應在那邊的 Designated Port 只在收到「更好」的 BPDU(想搶樹根)時,把 Port 變成 root-inconsistent,暫停轉送 對方停止發出更好的 BPDU 後自動恢復
Loop Guard(環路防護) Root Port 和 Alternate Port 如果突然收不到 BPDU(例如單向網線故障),不會貿然轉發,而是變成 loop-inconsistent 再收到 BPDU 後自動恢復
BPDU Filter(BPDU 過濾) 很少用 停止收發 BPDU —

BPDU Filter 等於令 Port 對 STP「又聾又啞」,用錯地方會造成真正的環路。CCNA 要求認識它,但實際工作中要非常小心。

這一課的冒牌 Switch 接在 Edge Port 上,最適合用 BPDU Guard。

Path Cost 的兩套數值

網線速度 Short(802.1D-1998) Long(802.1t)
100 Mbps 19 200 000
1 Gbps 4 20 000
10 Gbps 2 2 000
100 Gbps — 200

很多 Cisco Switch 預設用 Short,但部分新型號預設用 Long。同一個網絡內的 Switch 一定要用同一套,否則大家計算出來的「遠近」會不一致。本課一律用 Short,1 Gbps = 4。

4. 設定步驟

以下指令以 Cisco IOS 為例。其他廠牌(例如 Juniper、Aruba、華為)的寫法不同,但要設定的東西一樣:Root Bridge、Edge Port 和 BPDU 保護。

第 1 步:三部 Switch 都用 Rapid PVST+

S1# configure terminal
S1(config)# spanning-tree mode rapid-pvst      ! 很多新型號已是預設
S1(config)# end

S2 和 S3 做同樣的設定。模式不一致時,Rapid PVST+ 仍然可以和舊式 PVST+ 溝通,但那一段會退回舊的慢速做法。

第 2 步:在 Edge Port 開啟 BPDU Guard

先處理冒牌 Switch。在 S2 的牆身插座 Port 開啟 BPDU Guard:

S2# configure terminal
S2(config)# interface gi0/5
S2(config-if)# spanning-tree bpduguard enable
%SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port GigabitEthernet0/5 with BPDU Guard enabled. Disabling port.
%PM-4-ERR_DISABLE: bpduguard error detected on Gi0/5, putting Gi0/5 in err-disable state

S4 仍然接著,下一個 BPDU 一到,Port 就被關掉。這正是我們想要的。

第 3 步:正式指定 Root Bridge 和後備

S1(config)# spanning-tree vlan 10 root primary      ! 通常設成 24576
S2(config)# spanning-tree vlan 10 root secondary    ! 設成 28672

root primary 和 root secondary 是 Cisco 的「巨集」指令,它們只是幫你計算並寫入優先值。在 show running-config 裡,你看到的會是:

spanning-tree vlan 10 priority 24576

你也可以直接寫 spanning-tree vlan 10 priority 24576,效果一樣,而且數值更可預計。

第 4 步:為其他 Edge Port 開啟 PortFast

S2(config)# interface range gi0/3 - 4
S2(config-if-range)# 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

Switch 會印出警告,提醒你這個 Port 只可以接單一部終端裝置。

懶人設定:全部 PortFast Port 自動有 BPDU Guard

S2(config)# spanning-tree portfast bpduguard default

這一行令所有開了 PortFast 的 Port 自動啟用 BPDU Guard,不用逐個 Port 設定。很多公司把它列為標準設定。

5. 驗證結果

修好之前:S1 看到的世界

S1# show spanning-tree vlan 10

VLAN0010
  Spanning tree enabled protocol rstp
  Root ID    Priority    4106
             Address     0000.5e00.53a0
             Cost        8
             Port        1 (GigabitEthernet0/1)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32778  (priority 32768 sys-id-ext 10)
             Address     0000.5e00.53a1

讀法:

  • protocol rstp:這棵樹用 RSTP 計算,即 Rapid PVST+。
  • Root ID 是「我認為的樹根」,Bridge ID 是「我自己」。兩者不同,所以 S1 不是樹根。
  • 樹根的優先值是 4106 = 4096 + VLAN 10,地址 0000.5e00.53a0,正是冒牌的 S4。
  • Cost 8:由 S1 到樹根要走兩段 1 Gbps 網線(4 + 4)。
  • Port 1:S1 的 Root Port 是 Gi0/1,即往 S2 的那條線。

修好之後:S1 成為樹根

S1# show spanning-tree vlan 10

VLAN0010
  Spanning tree enabled protocol rstp
  Root ID    Priority    24586
             Address     0000.5e00.53a1
             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     0000.5e00.53a1
             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
Gi0/3               Desg FWD 4         128.3    P2p

Root Bridge 的所有 Port 都是 Desg FWD。

S3:找出 Alternate Port

S3# show spanning-tree vlan 10
(上半部省略)
Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/1               Root FWD 4         128.1    P2p
Gi0/2               Altn BLK 4         128.2    P2p
Gi0/3               Desg FWD 4         128.3    P2p

表格每一欄的意思:

欄位 意思
Role Port Role:Root、Desg、Altn、Back
Sts 狀態:FWD(Forwarding)、BLK(Discarding)、LRN(Learning)
Cost 這個 Port 自己的 Path Cost
Prio.Nbr Port Priority(連接埠優先值,預設 128)和 Port 編號,打和時用來比較
Type P2p 是 Point-to-Point;Edge 表示開了 PortFast;Shr 是 Shared(半雙工,例如接 Hub(集線器))

S3 通往 S2 的 Gi0/2 是 Altn BLK:S2 和 S3 去樹根的成本一樣(都是 4),但 S2 的 Bridge ID(28682)比 S3(32778)小,所以 S2 那一端當選 Designated Port。

S2:看 Edge Port 和 err-disabled

S2# show spanning-tree vlan 10
(上半部省略)
Gi0/1               Root FWD 4         128.1    P2p
Gi0/2               Desg FWD 4         128.2    P2p
Gi0/3               Desg FWD 4         128.3    P2p Edge
Gi0/4               Desg FWD 4         128.4    P2p Edge

S2# show interfaces status
Port      Name               Status       Vlan       Duplex  Speed Type
Gi0/3     amai-pc            connected    10         a-full  a-1000 10/100/1000BaseTX
Gi0/5     living-room-wall   err-disabled 10         auto    auto   10/100/1000BaseTX

Gi0/5 已經不在 STP 表內,因為它被關掉了;show interfaces status 顯示它是 err-disabled。

6. CLI Lab

輪到你了!下面是一個模擬終端機,S1、S2、S3 由你控制,冒牌的 S4 已經接在客廳。模擬器會按 Bridge ID 和 Path Cost 真正計算結果,所以用不同的次序設定,也會看到相應的變化,包括常見的錯誤。

CLI Lab

趕走冒牌 Root Bridge

S4 已經接在客廳的牆身插座,搶走了 Root Bridge 的位置。登入 S1、S2、S3,按任務清單逐步修好整個網絡。


      

輸入指令後按 Enter。可用縮寫(例如 sh span vl 10)、? 看可用指令、↑/↓ 翻查剛才的指令。

7. 疑難排解

症狀 可能原因 檢查指令 修正
Root Bridge 不是你想要的那部 Switch 沒有設定優先值,或者有優先值更低的 Switch 接入 show spanning-tree vlan 10,看 Root ID 的 Address 用 root primary 或 priority 指定樹根;在 Edge Port 開 BPDU Guard
電腦插上網線後要等約 30 秒才可以上網 Edge Port 沒有開 PortFast show spanning-tree,Type 欄沒有 Edge spanning-tree portfast
某個 Port 突然「死了」,燈號熄滅 BPDU Guard 偵測到 BPDU,Port 變成 err-disabled show interfaces status、show logging 先找出並拔走接錯的 Switch,再 shutdown、no shutdown
用了 root primary,優先值卻變成 20480、16384 甚至 0 當時已經有一部優先值低於 24576 的 Switch 做樹根,巨集會設成比它再低 4096 show running-config、show spanning-tree 先處理那部 Switch,再用 priority 寫入確定的數值
設了優先值 25000,Switch 不接受 優先值必須是 4096 的倍數 看錯誤訊息 改用 24576 或 28672 等數值
Switch 之間的上行線被關掉 把 BPDU Guard 開在連接自己 Switch 的 Port 上 show interfaces status 取消該 Port 的 BPDU Guard,再重新啟用 Port

讓 err-disabled 自動恢復

如果不想每次都人手重啟 Port,可以設定自動恢復:

S2(config)# errdisable recovery cause bpduguard
S2(config)# errdisable recovery interval 300      ! 秒,預設也是 300

不過冒牌 Switch 仍然接著的話,Port 每 5 分鐘恢復一次,又立即被關掉。自動恢復只是方便,找出源頭才是真正的修正。

8. 常見誤解

  • 「Root Bridge 應該選最新、最快的 Switch,STP 會自動做到。」 不會。STP 只比較 Bridge ID,完全不理會 Switch 的型號和速度。不設定優先值,樹根可能落在一部角落裡的舊 Switch。
  • 「BPDU Guard 會把 Port 暫停一會兒,之後自動恢復。」 預設不會。err-disabled 的 Port 會一直關閉,直至管理員處理,或者設定了 errdisable recovery。會自動恢復的是 Root Guard 和 Loop Guard。
  • 「PortFast 會關掉那個 Port 的 STP。」 不會。PortFast 只是跳過等待;Port 仍然會發出 BPDU,也會處理收到的 BPDU。在 Cisco Switch 上,Edge Port 收到 BPDU 後會失去 Edge 身份,變回普通 Port,所以才需要 BPDU Guard 做第二道保護。
  • 「root primary 一定設成 24576。」 不一定。當時的樹根如果已經低於 24576,它會設成更低的數值,見疑難排解。
  • 「Altn BLK 的 Port 什麼都不做。」 它不轉送一般 Frame,但會繼續收 BPDU,隨時準備接替 Root Port。
  • 動畫和 Lab 簡化了時間。 在真實網絡,BPDU Guard 通常在一兩秒內就把 Port 關掉;RSTP 重新計算也很快,但不同型號和網絡大小會有分別。

9. 小測驗

第 1 題,共 5 題一部 Switch 用預設設定,在 VLAN 20 的 show spanning-tree 裡,Bridge ID 的 Priority 會顯示什麼?
第 2 題,共 5 題S3 的輸出顯示 Gi0/1 是 Root FWD,Gi0/2 是 Altn BLK。如果 Gi0/1 的網線斷了,在 Rapid PVST+ 下最可能發生什麼?
第 3 題,共 5 題現時 Root Bridge 的優先值是 8192。你在另一部 Switch 輸入 spanning-tree vlan 10 root primary,它的優先值會變成多少?
第 4 題,共 5 題會議室的牆身插座只應該接手提電腦。怎樣確保有人在那裡接上 Switch 時,Port 會立即被關掉?
第 5 題,共 5 題阿麥的電腦插上網線後,要等大約 30 秒才拿到 IP Address。show spanning-tree 顯示那個 Port 的 Type 是 P2p。最適合的修正是什麼?

10. 重點筆記

  • Bridge ID 的優先值部分=Bridge Priority(4096 的倍數)+ Extended System ID(VLAN 號碼),所以 VLAN 10 的預設值是 32778。
  • Rapid PVST+ 是「每個 VLAN 一棵 RSTP 樹」;RSTP 的 Port Role 有 Root、Designated、Alternate、Backup,狀態只有 Discarding、Learning、Forwarding。
  • 一定要正式指定 Root Bridge(root primary/secondary 或 priority),不要讓 MAC Address「抽籤」。
  • 接終端裝置的 Port 開 PortFast,並配合 BPDU Guard;收到 BPDU 的 Port 會變成 err-disabled,要找出源頭後才重新啟用。
  • 讀 show spanning-tree:先比較 Root ID 和 Bridge ID,再看每個 Port 的 Role、Sts 和 Type。

下一站

S1 和 S3 之間只有一條網線,而 S3 通往 S2 的後備線平時只能休息。下一課,八爪會把兩條網線捆成一條邏輯連線,STP 會把它們當成一個 Port 看待:。