STP根桥选举异常排障
参考:H3C 生成树保护机制配置指导 + Cisco STP Root Guard Configuration Guide
开头(真实故障场景)
某物流公司IT群里,每周二下午两点半准时炸一次:
“VPN断了!” “仓库WMS系统登不上!” “又是那个5分钟!”
IT运维老王查了一个月:交换机没坏,线路没问题,UPS供电正常。最诡异的是——只在周二下午两点半,准时断5分钟,然后自动恢复。
他查日志、查配置、查巡检记录,终于在第4周的周二下午,趁断网的5分钟里敲了一条命令:
<HUAWEI> display stp brief
一眼看到——核心交换机的端口角色全变了。原本应该是 DESI(指定端口)的上行口变成了 ROOT(根端口),而根桥不在核心交换机上了。
根桥跑到哪去了?跑到一台接入层的小交换机上了。
为什么每周二下午准时发生?因为每周二下午两点半,核心机房做例行巡检,巡检时重启了一次核心交换机——重启的30秒里,STP重新选举根桥,而那台接入层交换机的优先级碰巧比核心交换机高,根桥就漂过去了。核心交换机重启完成后,STP又要30秒收敛,业务在这期间中断。
断网的根因不是设备故障,是STP根桥选举配置不当。
今天这篇排障日记,就带你从现象到根因,用华为交换机的原生命令,完整排查一次STP根桥选举异常。
一、先搞懂STP根桥选举:网络里的"班长"是怎么选的
STP(生成树协议)的核心思路是:在网络中选一个"班长"(根桥),所有交换机到班长的最短路径就是活跃路径,其余冗余链路被阻塞——这样既防环路,又保留备份。
根桥的选举规则很简单——比"桥ID"(Bridge ID),谁小谁当班长。
桥ID = 优先级 + MAC地址,两部分拼在一起比较。先比优先级(越小越优),优先级相同再比MAC地址(越小越优)。
华为交换机默认优先级是 32768。如果你不手动指定,STP就自动按MAC地址选根桥——谁的MAC地址最小,谁就是根桥。
问题来了:MAC地址小不代表它适合当根桥。一台老旧的接入层交换机可能MAC地址特别小,但它性能差、位置偏——如果它当选根桥,所有流量都要绕道经过它,这就是"次优路径",轻则延迟增大,重则带宽打满、业务中断。
一句话记住:根桥必须在核心交换机上,不能让STP自己选——必须手动指定。
二、排查四步法:从"谁在当班长"到"为什么会换班长"
第一步:查当前根桥是谁——确认"班长有没有被换"
<HUAWEI> display stp
重点看这几个字段:
-------[CIST Global Info][Mode MSTP]-------
CIST Bridge :32768.0819-xxxx-xxxx
CIST Root/ERPC :0.000f-xxxx-yyyy / 200200
CIST RegRoot/IRPC :32768.0819-xxxx-xxxx / 0
CIST RootPortId :128.25
关键判断:
- CIST Root:这是当前网络的根桥。看前面的数字——如果是
0开头,说明有人优先级设成了0;如果是32768开头,说明默认优先级。 - CIST Bridge:这是本机自己的桥ID。
- CIST RootPortId:如果这个值不是
0.0,说明本机不是根桥——根桥的RootPortId一定是0.0(因为它不需要根端口)。
排障第一步:如果核心交换机的
CIST RootPortId不是0.0,根桥就不在核心交换机上——这就是问题所在。
更直观的命令:
<HUAWEI> display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet0/0/1 ROOT FORWARDING NONE
0 GigabitEthernet0/0/2 DESI FORWARDING NONE
0 GigabitEthernet0/0/3 ALTE DISCARDING NONE
核心交换机如果有端口角色是 ROOT(根端口),说明它在向别的交换机"学习"根桥信息——它自己不是根桥。正常情况下,核心交换机的所有端口都应该是 DESI(指定端口)。
第二步:对比根桥ID——找出"新班长"是谁
知道根桥不在核心交换机上后,需要找出它到底在哪。
<HUAWEI> display stp
看 CIST Root 字段的值,比如 4096.0478-aaaa-bbbb。其中:
4096是根桥的优先级——说明这个设备的优先级被设成了40960478-aaaa-bbbb是根桥的MAC地址
拿着这个MAC地址,去全网交换机上逐一排查:
<HUAWEI> display stp
在每台交换机上对比 CIST Bridge 字段的MAC地址,跟根桥MAC一致的那台,就是"新班长"。
实际工程中更高效的方式:直接登录各接入层交换机,看谁的
CIST RootPortId是0.0,那台就是根桥。
第三步:查STP历史变更——看"换班长"是什么时候发生的
华为交换机支持查看STP拓扑变更历史:
<HUAWEI> display stp history
输出会列出最近的拓扑变更事件,包括变更时间和原因。如果你看到某个时间点有拓扑变更记录,跟业务中断的时间吻合——就找到了触发时间点。
更直接的,看日志:
<HUAWEI> display logbuffer | include STP
查找类似以下的告警:
%%01MSTP/4/TOPOCHANGE(l)[x]:MSTP process 0 has a topology change.
每次拓扑变更都会产生这条日志。如果变更时间跟"每周二下午两点半"吻合——锁定。
第四步:查异常端口——确认保护机制有没有生效
<HUAWEI> display stp abnormal-interface
MSTID Interface Status Reason
0 GigabitEthernet0/0/2 DISCARDING ROOT-Protected
0 GigabitEthernet0/0/5 DISCARDING LOOP-Protected
Reason列的含义:
| Reason | 含义 | 触发场景 |
|---|---|---|
ROOT-Protected |
根保护生效 | 端口收到优先级更高的BPDU,根桥地位受威胁 |
LOOP-Protected |
环路保护生效 | 端口长时间没收到BPDU,可能单向链路 |
LOOP-Detected |
环路检测生效 | 端口收到自己发出的BPDU,本机成环 |
BPDU-Protected |
BPDU保护生效 | 边缘端口收到BPDU,有非法设备接入 |
如果
ROOT-Protected出现在核心交换机的端口上——说明已经配了根保护,根桥确实受到了"篡位"威胁,但被保护机制挡住了。如果没有配置根保护,根桥就直接被抢走了,你连这条日志都看不到。
三、根因分析:根桥为什么会被抢走
根桥被"篡位"的场景,在工程中非常常见,通常有以下几种原因:
原因一:核心交换机重启,STP重新选举
这是本案例的根因。核心交换机每周二例行巡检重启,重启的30秒内,STP失去根桥,全网重新选举。如果接入层某台交换机的默认优先级碰巧比核心交换机低(MAC地址更小),它就被选为新根桥。核心交换机重启完成后,STP又要约30秒收敛(从Listening到Learning到Forwarding),业务在这期间中断。
原因二:新设备接入,优先级配置不当
运维人员在网络中临时接入了一台交换机(比如从别的项目借来的),这台设备的优先级被设成了0或4096——比核心交换机高。接入后,STP感知到更优的BPDU,根桥自动迁移到这台临时设备上。临时设备撤走后,根桥又迁移回来——整个过程网络中断两次。
原因三:优先级忘记配置,让STP自动选举
有些工程师只开了 stp enable,没指定根桥优先级,让STP按MAC地址自动选举。如果某天更换了一台MAC地址更小的交换机,根桥就不知不觉漂移了。
原因四:多实例MSTP中实例根桥配置遗漏
MSTP模式下,不同VLAN可以映射到不同实例,每个实例有自己的根桥。如果只配了实例0的根桥,其他实例的根桥可能漂移到非核心设备上——表现为部分VLAN正常、部分VLAN卡顿。
一句话总结:所有根桥漂移问题的根源都是同一个——没有手动指定根桥,或者指定了但没有保护机制。
四、解决方案:三步根治根桥漂移
第一步:手动指定核心交换机为根桥
在核心交换机上:
<HUAWEI> system-view
[HUAWEI] stp mode rstp # 建议用RSTP,收敛更快
[HUAWEI] stp enable
[HUAWEI] stp root primary # 直接指定为主根桥,优先级自动设为0
在备份核心交换机(如果有双核心冗余)上:
[HUAWEI-BACKUP] stp root secondary # 指定为备份根桥,优先级自动设为4096
stp root primary等价于stp priority 0,但语义更明确。配置后优先级不能再用stp priority修改,需要先undo stp root去使能。
验证根桥:
<HUAWEI> display stp
确认 CIST Root 和 CIST Bridge 的MAC地址一致——说明本机就是根桥。
第二步:开启根保护,防止"篡位"
在核心交换机所有下行端口(连接接入层交换机的端口)上配置根保护:
[HUAWEI] interface GigabitEthernet0/0/1
[HUAWEI-GigabitEthernet0/0/1] stp root-protection
[HUAWEI-GigabitEthernet0/0/1] quit
[HUAWEI] interface GigabitEthernet0/0/2
[HUAWEI-GigabitEthernet0/0/2] stp root-protection
[HUAWEI-GigabitEthernet0/0/2] quit
根保护的原理:配置后,端口只能保持"指定端口"角色。如果收到优先级更高的BPDU(有人想抢班长),端口立即进入 DISCARDING 状态,拒绝接受新根桥——直到对方不再发送更优BPDU,端口才恢复转发。
根保护只在"指定端口"上生效。在根端口或备用端口上配置不生效。根保护和环路保护互斥,同一端口不能同时配。
第三步:开启BPDU保护,防止接入层接入交换机
在全局配置BPDU保护(针对所有边缘端口):
[HUAWEI] stp bpdu-protection
然后确保所有接入终端的端口配置为边缘端口:
[HUAWEI] interface GigabitEthernet0/0/10
[HUAWEI-GigabitEthernet0/0/10] stp edged-port enable
[HUAWEI-GigabitEthernet0/0/10] quit
BPDU保护的原理:边缘端口正常情况下不应该收到BPDU。如果收到BPDU,说明有人把交换机插到了办公口上——端口立即 shutdown,防止非法设备参与STP计算。
配置自动恢复(避免需要手动重启端口):
[HUAWEI] error-down auto-recovery cause bpdu-protection interval 300
300秒后自动恢复。如果对方设备还在,端口会再次被shutdown——这正好提醒你有人接了不该接的设备。
五、多厂商命令对比:华为/H3C/锐捷/思科STP根桥配置
| 操作 | 华为 | H3C | 锐捷 | 思科 |
|---|---|---|---|---|
| 开启STP | stp enable |
stp enable |
spanning-tree |
spanning-tree mode rapid-pvst |
| 设置STP模式 | stp mode rstp |
stp mode rstp |
spanning-tree mode rstp |
spanning-tree mode rapid-pvst |
| 指定主根桥 | stp root primary |
stp instance 0 root primary |
spanning-tree root primary |
spanning-tree vlan 1 root primary |
| 指定备份根桥 | stp root secondary |
stp instance 0 root secondary |
spanning-tree root secondary |
spanning-tree vlan 1 root secondary |
| 手动设优先级 | stp priority 4096 |
stp instance 0 priority 4096 |
spanning-tree priority 4096 |
spanning-tree vlan 1 priority 4096 |
| 根保护(接口) | stp root-protection |
stp root-protection |
spanning-tree rootguard |
spanning-tree guard root |
| BPDU保护(全局) | stp bpdu-protection |
stp bpdu-protection |
spanning-tree bpduguard enable |
spanning-tree portfast bpduguard default |
| 边缘端口(接口) | stp edged-port enable |
stp edged-port |
spanning-tree portfast |
spanning-tree portfast |
| 查看STP摘要 | display stp brief |
display stp brief |
show spanning-tree summary |
show spanning-tree summary |
| 查看异常端口 | display stp abnormal-interface |
display stp abnormal-port |
show spanning-tree inconsistentports |
show spanning-tree inconsistentports |
关键差异:华为直接
stp root primary;H3C需带instance 0;锐捷和思科用spanning-tree前缀。查看命令华为H3C用display,锐捷思科用show。根保护华为H3C叫root-protection,锐捷叫rootguard,思科叫guard root——同一个功能四种叫法。
六、预防措施:STP规划规范
根桥漂移治好了,怎么防止下次再犯?做好以下规划:
规范一:根桥必须手动指定,不让STP自动选举
- 主根桥:核心交换机,优先级设为0(
stp root primary) - 备份根桥:备份核心交换机,优先级设为4096(
stp root secondary) - 其他交换机:保持默认优先级32768,明确不允许设为0
规范二:所有核心交换机下行端口配根保护
根保护确保即使接入层有高优先级设备接入,核心交换机的根桥地位也不会被抢走。
规范三:所有接入端口配边缘端口+BPDU保护
边缘端口跳过STP状态机,终端秒级上线。BPDU保护防止有人把交换机插到办公口上参与STP计算。
规范四:STP模式全网统一
- 全网统一用 RSTP 或 MSTP
- 不要混用STP和RSTP——STP收敛慢(30秒+),RSTP收敛快(1-3秒)
- 如果用MSTP,确保域名、修订号、VLAN映射在全网一致
规范五:开启TC保护,防止TC-BPDU攻击
[HUAWEI] stp tc-protection
[HUAWEI] stp tc-protection threshold 10
TC-BPDU(拓扑变更通知)会触发交换机快速刷新MAC地址表。如果有人恶意发送大量TC-BPDU,交换机会不断刷新MAC表导致丢包。TC保护限制每单位时间处理的TC-BPDU数量。
规范六:重启前先检查STP状态
核心交换机重启前,确认它是根桥。重启后立即检查根桥是否恢复——如果30秒内没恢复,说明根桥优先级配置有问题。
七、排障速查表(贴在机柜上)
| 现象 | 可能原因 | 排查命令 | 处置 |
|---|---|---|---|
| 定时断网(重启后) | 根桥在非核心设备上,重启触发重新选举 | display stp(看CIST RootPortId是否为0.0) |
stp root primary 指定核心为根桥 |
| 网络延迟突然增大 | 根桥漂移到接入层,流量走次优路径 | display stp brief(核心端口角色变成ROOT) |
查找新根桥→修改其优先级→恢复核心为根桥 |
| 部分VLAN正常部分卡 | MSTP多实例根桥配置遗漏 | display stp instance 1(看每个实例根桥) |
为每个实例手动指定根桥 |
| 端口频繁DISCARDING/FORWARDING | 根保护反复触发,有设备持续发送高优先级BPDU | display stp abnormal-interface(Reason: ROOT-Protected) |
找到发送高优BPDU的设备→修改优先级或断开 |
| 新设备接入后断网 | 新设备优先级高,抢了根桥 | display stp(对比CIST Root变化) |
断开新设备→修改优先级→重新接入 |
| 边缘端口被shutdown | 有人把交换机插到办公口 | display stp abnormal-interface(Reason: BPDU-Protected) |
找到接入设备→拔掉→端口自动恢复 |
八、网络稳了,数据丢了怎么办?
STP根桥漂移修好了,网络不再定时断线了——但IT老手都知道另一句话:网络稳了不代表数据安全了。
网络中断5分钟能被发现、被修复、被追责。但数据层面的安全问题——文件没备份、权限没管控、勒索病毒潜伏——可能默默存在几个月,直到出事才暴露。就像这次根桥漂移,其实在断网之前,STP拓扑变更已经发生了好几次,只是没人看日志。
我们建议企业在做STP排障的同时,顺手检查三件事:
1. 文件存储有没有集中管理? 网络中断5分钟,文件传不了。但如果没有集中存储,硬盘坏了——文件直接没了。一套信创云盘(纯软件部署在你自己的服务器上),让所有文件集中存储、统一管控、随时可恢复。网络断了文件还在,硬盘坏了从备份恢复。
2. 权限管控有没有跟上? STP保护机制防止非法设备接入网络。同样的逻辑——文件权限如果没有保护机制,离职员工带走图纸、只读权限被绕过下载,这些"权限漏洞"比网络漏洞危害更大。32维权限模型+文件不落地+水印追溯+离职联动自动回收——从制度到工具,一个都不能少。
3. 备份策略做了没有? 网络中断5分钟,损失有限。但勒索病毒加密了所有文件、核心交换机配置丢失没有备份——这种损失不可逆。3-2-1-1-0备份法则(3份数据/2种介质/1份异地/1份离线/0错误验证)不是选择题,是必答题。