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