4. STP与二层环路防护

在网络分段体系中,VLAN与子网把广播域切小,但二层转发平面仍然是一张共享的拓扑。只要存在冗余链路,就必须依赖生成树协议(STP)打破环路;而一旦STP收敛异常、边缘端口误接交换机或单向链路出现,环路、广播风暴和MAC表震荡就会跨VLAN扩散,直接破坏分段边界。因此,本章的重点不是“开启STP”,而是围绕MSTP多实例、边缘端口防护、根桥保护、单向链路检测四条主线,构建一套可预测、可收敛、可防护的二层拓扑。

MSTP多实例:让不同VLAN走不同的转发路径

传统PVST+为每个VLAN单独运行一棵生成树,VLAN数量多时BPDU和CPU开销线性增长,且所有VLAN的阻塞端口往往落在同一条链路上,无法做流量分担。MSTP(IEEE 802.1s)把多个VLAN映射到同一个实例(Instance),每个实例独立计算拓扑,既减少协议开销,又支持负载分担。

设计时先规划MST域:同一域内所有交换机必须配置相同的域名、修订级别和VLAN-实例映射表,否则会各自成域,退化为CST互通。典型做法是把接入层VLAN按业务分组,例如VLAN 10/20映射到Instance 1,VLAN 30/40映射到Instance 2,管理VLAN单独放入Instance 0。然后在汇聚层两台交换机上分别指定不同实例的根桥:SW1为Instance 1的根、Instance 2的备份根;SW2反之。这样Instance 1的流量主走SW1上行,Instance 2主走SW2上行,两条上行链路同时被利用。

spanning-tree mode mst
spanning-tree mst configuration
 name CAMPUS-MST
 revision 1
 instance 1 vlan 10, 20
 instance 2 vlan 30, 40
spanning-tree mst 1 root primary
spanning-tree mst 2 root secondary

验证时用 show spanning-tree mst 1 查看根桥和端口角色,确认Instance 1的根在SW1、Instance 2的根在SW2,且每条上行链路上只有一个实例处于转发、另一个处于阻塞或替代。若发现两个实例的阻塞端口落在同一链路,说明根桥优先级或路径开销配置未达到分担效果,需要调整优先级或端口开销。

PortFast与BPDU Guard:边缘端口的第一道闸门

接入层连接终端PC、IP电话、打印机的端口不会形成二层环路,却仍要参与STP收敛。PortFast让这些端口链路up后立即进入转发,跳过监听和学习状态,避免终端等待约30秒才能上网。但PortFast端口一旦误接交换机或集线器,就可能引入BPDU并参与拓扑计算,形成环路。

BPDU Guard解决这个问题:在启用了PortFast的端口上,如果收到BPDU,立即将端口置为err-disabled,阻断环路入口。配置上通常全局开启,让所有PortFast端口自动受保护:

spanning-tree portfast default
spanning-tree portfast bpduguard default
interface GigabitEthernet1/0/10
 switchport mode access
 switchport access vlan 10
 spanning-tree portfast
 spanning-tree bpduguard enable

端口进入err-disabled后,可通过 show interfaces status err-disabled 确认原因,排除误接设备后用 shutdown / no shutdown 恢复,或配置err-disable自动恢复时间。需要注意:连接AP、虚拟化主机或需要透传BPDU的端口不能盲目启用BPDU Guard,应改用BPDU Filter或保持普通STP端口。

Root Guard与Loop Guard:保护根桥与阻断单向链路

Root Guard部署在不应成为根桥的端口上,通常是汇聚层面向接入层的下行端口。当该端口收到优先级更优的BPDU时,Root Guard不会让本机重新选根,而是把端口置为root-inconsistent(阻塞),从而把“外部设备抢根”的影响限制在端口内。它保护的是根桥位置的稳定性,避免接入设备误配置优先级导致全网拓扑翻转。

Loop Guard针对的是另一种隐蔽故障:阻塞端口因单向链路或软件异常不再收到BPDU,STP超时后误以为邻居消失,把端口转为转发,形成环路。Loop Guard在非指定端口上启用后,如果BPDU超时且端口角色为阻塞/替代,就将其置为loop-inconsistent,而不是转为转发。它与UDLD互补:UDLD从物理层检测单向链路,Loop Guard从STP状态机层面兜底。

interface GigabitEthernet1/0/1
 spanning-tree guard root
interface GigabitEthernet1/0/2
 spanning-tree guard loop

UDLD:在物理层发现“能收不能发”的链路

光纤链路中常见一种故障:一端能收到对端光信号,对端却收不到本端,链路状态仍为up。这种单向链路会让STP误判邻居存在,导致阻塞端口错误转发。UDLD(UniDirectional Link Detection)通过周期性发送echo并等待回应来检测双向连通性。普通模式下,UDLD检测到单向链路后会把端口置为err-disabled;激进模式(aggressive)还会在端口长期未收到echo时主动尝试重建邻居关系,适合对收敛要求高的汇聚链路。

udld enable
interface GigabitEthernet1/0/1
 udld port aggressive

部署时建议在汇聚与接入之间的光纤链路上启用UDLD aggressive,在纯电口接入端口上保持默认或关闭,避免误报。用 show udld 查看邻居状态和双向检测结果,确认所有关键上行链路均为Bidirectional。

把防护组合成一张可判断的拓扑

下面这张图把MSTP实例、边缘端口防护、根桥保护和单向链路检测放在同一张拓扑中,便于对照理解各机制的作用位置与判断结果。

MSTP多实例与二层环路防护部署示意 核心层 / 路由边界 VLAN间路由 · 分段网关 汇聚SW1 Instance 1 根桥 Instance 2 备份根 汇聚SW2 Instance 2 根桥 Instance 1 备份根 MSTP域内互联 · 实例负载分担 接入SW3 VLAN 10/20 · Instance 1 接入SW4 VLAN 30/40 · Instance 2 Root Guard Root Guard Loop Guard Loop Guard UDLD UDLD 终端PC PortFast + BPDU Guard IP电话 PortFast + BPDU Guard 无线AP PortFast · 不启用BPDU Guard 服务器 PortFast + BPDU Guard Root Guard:防抢根 Loop Guard:防单向链路误转发 UDLD:物理层双向检测 边缘端口防护

实际排障时,先看MSTP实例的根桥和端口角色是否符合设计,再用 show spanning-tree inconsistentports 检查是否有root-inconsistent或loop-inconsistent端口,用 show interfaces status err-disabled 确认BPDU Guard或UDLD触发的端口,最后结合 show udld 判断单向链路是否已恢复。只有把实例规划、边缘防护、根桥保护和单向检测四者配合起来,分段拓扑才能在冗余条件下保持稳定,VLAN边界才不会被二层环路击穿。