华为交换机STP与链路聚合实战
做了这么多年网络项目,我有个很深的体会:很多故障不是配错一条命令,而是协议之间的配合出了问题。STP和链路聚合就是这样一对又爱又恨的组合——一个防止环路,一个主动制造多条链路,放在一起配置,稍不注意就会出现业务中断。这篇内容就围绕我在华为交换机上做STP与链路聚合联调的完整过程来写,包含协议原理、配置命令、踩坑记录和排查思路,适合刚接触数通或者正在做网络割接的朋友参考,尤其是手头有华为S5700、S12700或者CloudEngine系列设备的,可以直接对照操作。
之所以要把这两个技术放在一起讲,是因为实际生产环境中它们几乎总是同时存在:核心到接入做Eth-Trunk提升带宽,接入层之间用STP防止环路。你单独看任何一个协议都没问题,但放在一张拓扑图上,就会出现优先级、端口状态、流量走向之间的互相影响。只有把两者当成一个整体去设计,才能避免“配完链路聚合,STP开始报错”这种尴尬局面。
1. 项目背景与整体设计思路拆解
1.1 为什么STP和链路聚合要放在一起谈
先说一个最常见的业务场景:你有一台核心交换机,下面挂了几十台接入交换机,接入交换机之间还有级联线。为了带宽和可靠性,你会在核心到接入之间做链路聚合,把两条甚至四条千兆口绑成一个Eth-Trunk。但接入层为了冗余,往往会多拉几根线形成物理环路。环路一旦存在,广播帧就会在交换机之间无限转发,瞬间打满CPU和带宽,整个网络瘫痪只是几秒钟的事情。
这时候STP的价值就体现出来了:它会把冗余链路中的某一条逻辑上阻塞掉,只保留一条最优路径转发数据。但问题来了——链路聚合本身是多条物理链路绑成一个逻辑口,STP感知到的是这个逻辑口,而不是里面每一根物理线。如果配置顺序不对,或者STP优先级设置不合理,就会出现聚合链路被阻塞、单条物理链路却还在转发的情况,流量路径和预期完全不一致。
所以,做这个项目时我的设计原则很简单:先规划拓扑,再确定STP角色,最后才动手配链路聚合。顺序一定不能反。
1.2 本次实战的网络拓扑与需求
我用一个常见的三层组网来演示:
- 核心层:华为S5720-52X-SI,作为全网根桥(Root Bridge)。
- 接入层:两台华为S5700-28P-LI,分别命名为SW-A和SW-B,通过两根千兆线缆与核心相连,计划做Eth-Trunk。
- 接入交换机之间有一条级联线,形成物理环路,用于演示STP的阻塞效果。
整个网络规划了三个VLAN:VLAN 10(办公网)、VLAN 20(监控网)、VLAN 30(服务器网)。核心交换机上启用VLANIF接口作为网关,接入交换机只做二层透传。
需求点有三个:
- 核心到接入的链路带宽需要翻倍,允许单根链路故障不影响业务;
- 接入层之间那条级联线不能产生环路,必须被STP阻塞;
- 全网收敛时间要求小于10秒,所以不能跑传统STP,至少要RSTP。
这个拓扑在企业里非常典型,你可以直接替换成自己设备的实际型号,命令基本通用。
1.3 方案选型:为什么选RSTP而不是传统STP
传统STP(802.1D)的收敛时间通常在30到50秒,这取决于网络直径和计时器配置。你想想看,核心到接入的链路断了,接入交换机要等30秒才能恢复转发,办公网直接断网半分钟,这在任何业务场景下都是不可接受的。RSTP(802.1w)把收敛时间压缩到了秒级甚至毫秒级,因为它引入了提议-同意(Proposal-Agreement)机制,端口角色和状态变化不再依赖计时器等待,而是主动握手完成。
华为交换机默认就启用STP,但默认模式往往是MSTP(多生成树实例),这个后面我会细说。如果你网络中只有一个VLAN或者所有VLAN的拓扑完全一致,直接用RSTP是最省心的。如果VLAN多、链路冗余复杂,建议用MSTP做多实例负载均衡,但配置复杂度会明显上升。
我这次选RSTP的原因很直接:网络规模不大,VLAN只有三个,拓扑简单,RSTP完全够用,而且调试周期短。用MSTP的话,需要为每个实例单独指定根桥,排查问题时多一层维度,没必要给自己找麻烦。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心协议原理与细节分析
2.1 STP到底在防什么:环路、广播风暴与MAC地址漂移
很多人觉得STP只是“阻塞一个端口”这么简单,其实它解决的是三个层面的问题。第一个是广播风暴。交换机收到广播帧会向除接收端口外的所有端口转发,一旦形成环路,这个帧就会被无限复制,最终占满所有带宽。第二个是MAC地址表震荡,也叫漂移。交换机通过源MAC地址学习来刷新转发表,同一个MAC在环路中会从不同端口反复收到帧,导致转发表不停更新,CPU占用飙升,正常流量无法转发。第三个是重复帧。即使没有风暴,目的设备也会收到多个相同的数据帧,上层协议比如TCP无法处理重复包,直接丢包重传。
STP的核心机制是通过在交换机之间交换BPDU(Bridge Protocol Data Unit,桥协议数据单元),选举出一台根桥,然后每台非根桥交换机计算到根桥的最短路径,确定根端口和指定端口,最后把既不是根端口也不是指定端口的端口阻塞掉。这样逻辑上就形成了一棵无环的树状拓扑。
2.2 STP端口角色与状态:不只是阻塞和非阻塞
RSTP把端口角色分成了四种:根端口(Root Port)、指定端口(Designated Port)、备用端口(Alternate Port)、备份端口(Backup Port)。其中备用端口是根端口在另一条链路上的备份,备份端口是同一链路中指定端口的备份。端口状态也简化为三种:Discarding(丢弃)、Learning(学习)、Forwarding(转发)。相比传统STP的五种状态,RSTP去掉了Blocking和Listening,统一归入Discarding。
这里有个关键点:在RSTP里,指定端口和根端口可以直接从Discarding切换到Forwarding,不需要经过Learning等待。原因在于提议-同意机制——上游端口发送提议BPDU,下游端口如果同意就回应同意BPDU,然后双方直接进入转发状态。这个过程在物理链路上是毫秒级的,所以RSTP收敛快。
备用端口和备份端口在华为设备上的显示可以通过display stp brief看到,如果你发现某个端口角色是ALTE(Alternate)或者BACK(Backup),说明它正在被STP阻塞,这是正常现象。
2.3 STP路径一定是最优的吗——关于根桥、优先级与Cost
我经常被问到“STP选出来的路径一定是最优路径吗”。严格说,它是按照STP自己的度量标准算出来的最优路径,这个度量就是路径开销(Path Cost),默认跟链路带宽相关:千兆口Cost是20,万兆口Cost是2,百兆口是200。但实际业务的最优路径可能还要考虑负载、延迟、管理策略等因素,所以STP的结果不一定是对业务最优的。
更关键的是,如果所有链路带宽相同,STP最终非常依赖Bridge ID和Port ID的数值。华为设备的桥优先级默认都是32768,你没做任何设置时,MAC地址最小的交换机就会成为根桥。这在真实网络里非常危险,因为你根本不知道哪台设备的MAC最小,可能是某台无人管理的傻瓜交换机成了根桥,导致所有流量绕路。
所以实战中的铁律是:必须手动指定核心交换机为根桥,通过设置优先级实现。华为设备上用stp root primary一条命令就够了,它会把优先级自动设为0(实际显示为32768的基础值减8192,即24576以下,系统自动计算出更优值)。备用根桥用stp root secondary,优先级设为4096。不要用默认值去赌运气。
2.4 链路聚合的底层原理:从物理多链路到逻辑单链路
链路聚合(Eth-Trunk)的本质是把多条物理链路捆绑成一个逻辑接口,对上层协议来说,它只看到一个接口。这样做有三个好处:带宽叠加、链路冗余、负载分担。
但有一个常见误区:链路聚合不是把所有流量平均分配到每根链路上。它通过哈希(Hash)算法,根据报文的源MAC、目的MAC、源IP、目的IP等字段计算出一个哈希值,再映射到某一个成员端口上。也就是说,一条流只会走一条物理链路,不会拆分到多条链路。所以聚合对单条大流量(比如视频传输)没有带宽叠加效果,只有多条流同时存在时,才能体现带宽翻倍的优势。
华为链路聚合有两种模式:手工负载分担模式和LACP模式。手工模式就是静态把端口加入Eth-Trunk,不做协商,简单粗暴。LACP模式则通过交换LACPDU报文协商,可以检测对端是否正常,支持链路备份和故障快速切换。我强烈建议生产环境用LACP模式,因为手工模式下如果某条链路物理连通但逻辑异常,交换机无法感知。
3. 华为交换机实战配置过程
3.1 硬件环境与版本准备
我用的设备是华为S5720-52X-SI和S5700-28P-LI,系统版本是V200R010C00SPC600。不同版本命令略有差异,但核心配置思路一致。建议配置前先用display version确认版本号,再用display device检查设备运行状态,确保所有板卡和电源正常。
另外提一句,很多朋友问华为交换机默认密码和console口登录的问题。新设备出厂时console口默认无密码,直接登录;如果之前被人配置过密码,又忘记了,那就需要进BootROM菜单重置。华为设备在启动时按Ctrl+B进入BootROM菜单,选择清除console密码或恢复出厂设置。具体菜单项不同版本略有不同,要看清提示再操作。这个方法在你完全无法登录设备的时候是最后的救命稻草,但操作前一定要确认设备配置有备份,因为恢复出厂会清空所有配置。
3.2 交换机基础配置
先把基础信息配置好,命名设备、创建VLAN、配置接口类型。以SW-A为例:
bash复制system-view
sysname SW-A
vlan batch 10 20 30
interface GigabitEthernet0/0/1
port link-type trunk
port trunk allow-pass vlan 10 20 30
quit
核心交换机的配置类似,但需要加上VLANIF接口作为网关:
bash复制system-view
sysname CORE-SW
vlan batch 10 20 30
interface Vlanif10
ip address 192.168.10.1 255.255.255.0
quit
interface Vlanif20
ip address 192.168.20.1 255.255.255.0
quit
interface Vlanif30
ip address 192.168.30.1 255.255.255.0
quit
到这里只是热身,真正的主角是STP和链路聚合的配置。
3.3 RSTP配置步骤与要点
华为交换机默认启用STP,模式是MSTP。我们要改成RSTP,并指定根桥。
核心交换机上:
bash复制system-view
stp mode rstp
stp root primary
quit
接入交换机SW-A和SW-B上:
bash复制system-view
stp mode rstp
stp root secondary
quit
如果接入交换机不止两台,建议统一用stp root secondary,或者手动设置stp priority 4096。这样做的好处是无论网络规模怎么变,根桥永远在核心,不会出现意外抢占。
接下来要处理边缘端口。连接PC、服务器、打印机这些终端设备的接口理论上不会连接交换机,所以应该设为边缘端口,让它们直接进入转发状态,省去STP协商时间。但为了防止有人误把线插到交换机上形成环路,还要开启BPDU保护。
接入交换机SW-A上:
bash复制system-view
interface GigabitEthernet0/0/10
port link-type access
port default vlan 10
stp edged-port enable
stp bpdu-protection
quit
BPDU保护的作用是:如果这个边缘端口收到了BPDU报文,说明有人把交换机或者什么设备接上来了,端口会被直接关闭(error-down),防止环路产生。这个配置非常重要,很多环路事故就是没开BPDU保护导致的。
3.4 链路聚合配置步骤与参数选择
接下来做核心到接入的链路聚合。我以核心连接SW-A的两条千兆口为例:GE0/0/1和GE0/0/2绑定成一个Eth-Trunk 1。
先在核心交换机上创建Eth-Trunk并配置工作模式:
bash复制system-view
interface Eth-Trunk1
mode lacp-static
trunkport GigabitEthernet0/0/1
trunkport GigabitEthernet0/0/2
quit
然后进入这两个物理接口,把它们的工作参数设置成一致:
bash复制interface GigabitEthernet0/0/1
eth-trunk 1
quit
interface GigabitEthernet0/0/2
eth-trunk 1
quit
注意:物理接口加入Eth-Trunk后,接口下的其他配置全部失效,端口类型、VLAN配置都要在Eth-Trunk接口下统一做,不是在物理口上做。这是新手最容易踩的坑。
然后在Eth-Trunk接口下配置VLAN透传:
bash复制system-view
interface Eth-Trunk1
port link-type trunk
port trunk allow-pass vlan 10 20 30
quit
SW-A这边的配置完全对称,也要先创建Eth-Trunk 1,设置LACP模式,把对应物理口加入,然后配置trunk口放行VLAN。
这里有一个非常关键的参数:LACP模式下,优先级低的设备(数值越小优先级越高)会成为主动端,主动端的系统优先级决定了哪些成员口处于活跃状态。默认情况下,双方的系统优先级都是32768,此时MAC地址小的设备成为主动端。如果核心和接入两台设备的MAC不像预期那样,可能会导致聚合后实际生效的成员口数量和你预期不一致。
所以建议在配置时主动指定:
bash复制// 核心交换机上设置系统优先级,确保核心成为LACP主动端
lacp priority 1000
这句配置是在系统视图下执行,不是接口视图。配置完成后,用display eth-trunk 1可以看到当前聚合状态,确认成员口数量是2,说明聚合成功。
3.5 两种技术联调时的验证方法
配置完成后,验证环节至关重要,我的验证顺序如下:
第一步,查看stp的接口状态:
bash复制display stp brief
在核心交换机上,Eth-Trunk1和连接SW-B的接口应该是指定端口(DESI),转发状态(FORWARDING)。在SW-A上,Eth-Trunk1应该是根端口(ROOT),去往SW-B的级联口应该是备用端口(ALTE),被阻塞(DISCARDING)。
第二步,查看链路聚合状态:
bash复制display eth-trunk 1
确认端口状态是Selected,而不是Unselected。Unselected意味着这个成员口没有参与数据转发,可能是协商失败,也可能是不在同一个VLAN。
第三步,验证VLAN和业务连通性:
bash复制display vlan
ping 192.168.10.1
从接入交换机ping核心网关,再从PC ping网关。都能通,说明二层和三层的转发路径没问题。
第四步,做故障模拟测试。拔掉Eth-Trunk中的一根线,看ping是否中断。如果配置的是LACP模式,业务应该完全没有感知,丢包数为0或者极少数丢包。如果出现明显断流,说明LACP协商或者STP收敛有问题,需要进一步排查。
4. 常见问题与排查技巧实录
4.1 配置STP后链路聚合失效
这是我最常遇到的问题。现象是:链路聚合配置完,display eth-trunk显示两个成员口都是Selected,但业务不通,或者STP一直在报错。
排查思路是这样的:先确认Eth-Trunk的端口模式是否和物理口一致。比如你物理口原本是access模式,加入Eth-Trunk后在Eth-Trunk下配置了trunk模式,但物理口缓存里可能还有旧的access配置,某些老版本固件下会冲突。解决办法是清除物理口配置再加入聚合,或者在系统视图下先interface GigabitEthernet0/0/1,undo port link-type,然后再配置eth-trunk 1。
另一个原因是STP和Eth-Trunk的优先级互相干扰。尤其是使用默认STP优先级时,根桥可能在链路的任意一端,导致非根桥一侧的Eth-Trunk端口被阻塞。所以必须确保核心交换机设置了stp root primary,而且所有链路聚合端口在STP计算中都是指定端口,处于转发状态。
还要留意eth-trunk的负载分担方式。默认华为交换机是逐流负载分担,匹配源目MAC和IP,如果你觉得某条流量没有走聚合链路,可以手动调整:
bash复制system-view
interface Eth-Trunk1
load-balance src-dst-ip
quit
源目IP哈希适用于三层流量为主的环境,源目MAC哈希则适合二层流量较多的场景。需要根据实际业务流量特征来选择。
4.2 华为交换机SSH配置与远程登录取代console
接手一台华为交换机,第一件事就是配置远程管理,不然每次调试都要抱着console线蹲在机房里,效率太低了。SSH配置其实不复杂,按下面几步走就行。
bash复制system-view
rsa local-key-pair create
这行命令会生成RSA密钥对,提示输入密钥长度时建议2048位,太短不安全。
然后配置VTY虚拟终端和认证方式:
bash复制user-interface vty 0 4
authentication-mode aaa
protocol inbound ssh
quit
aaa
local-user admin password irreversible-cipher Admin@123
local-user admin service-type ssh
local-user admin privilege level 15
quit
注意irreversible-cipher是华为较新版本支持的加密方式,老版本可能只支持cipher,如果你用的是旧版本,命令要调整。配置完成后,用电脑上的SSH客户端连接交换机管理IP,能登录就说明成功了。
如果SSH登录失败,优先检查管理口的IP配置和VTY下的protocol inbound ssh是不是被覆盖。曾经有次我怎么都连不上,查了半天发现是VTY下默认的protocol inbound all被我之前的配置覆盖成了telnet,SSH流量被拒绝了。
4.3 重新配置密码:恢复console密码的方法
有朋友问华为交换机进BootLoad的密码是什么。BootLoad密码默认是空,如果你在设备上设置过BootLoad密码又忘了,那就只能通过console口在启动时按Ctrl+B进入BootLoad菜单,输入默认密码或者尝试常用密码。如果都进不去,可能需要联系华为获取解锁办法,这属于比较特殊的情况了。
实际中更常见的是console口登录密码忘了。解决思路是用BootLoad菜单重置。步骤是:设备重新上电,在出现Press Ctrl+B to enter BootLoad Menu时快速按下Ctrl+B,输入BootLoad密码(默认空)进入菜单。不同版本菜单会有差异,但核心选项就是“Clear password”或者“Clear console password”。执行清除后重启设备,console密码就没了,但配置也会清空,所以务必有配置备份。要是没备份,至少可以通过display saved-configuration先看看系统里存的配置内容,如果没存那就只能认栽重配了。
4.4 网络环路没根除:边缘端口和BPDU保护没开对
有一次帮朋友排查网络异常,现象是办公网时通时断,交换机CPU使用率飙升到90%以上。我登上去看display logbuffer,全是MAC地址漂移的告警。查了一圈,发现是一台无线AP误接了两根网线到交换机,形成了环路。
虽然这台交换机也跑了STP,但连接AP的接口没有配置边缘端口,按理说STP应该能阻塞掉冗余链路。问题出在哪?出在STP收敛期间广播风暴已经把设备CPU打满了,BPDU报文处理不过来,STP计算迟迟无法完成。
解决思路很直接:所有接入用户的接口全部配置为边缘端口,并开启BPDU保护。这样一旦有非法设备接入触发环路,端口会直接error-down,不会让风暴扩散。就凭这一个改动,网络立刻稳定下来,CPU恢复正常。
华为交换机上还可以开全局的环路检测(loopback-detection),类似这样:
bash复制system-view
loopback-detect enable
vlan 10
loopback-detect enable
环路检测和STP并不是同一层的东西,它主要针对非STP场景或者设备没有完整跑BPDU的情况,能起到兜底的作用。但要注意,环路检测会使端口自动shutdown,如果误报可能导致正常链路中断,开启前要评估好。
4.5 故障排查速查表
我把本次实战中遇到过的典型问题整理成一个表格,方便大家直接对照排查。
| 故障现象 | 可能原因 | 排查命令 | 解决动作 |
|---|---|---|---|
| Eth-Trunk成员口状态是Unselected | 物理链路不通、端口模式不一致、LACP协商失败 | display eth-trunk 1 | 检查物理层、统一端口模式、检查system priority |
| STP阻塞了Eth-Trunk接口 | 根桥配置不对、桥优先级相同 | display stp brief | 核心配置stp root primary,接入配置stp root secondary |
| PC ping不通网关 | VLAN配置不一致、Trunk未放行 | display vlan, display port vlan | 检查链路两端的VLAN透传配置 |
| 业务时通时断,CPU高 | 存在环路、边缘端口引发BPDU保护 | display logbuffer, display cpu-usage | 配置边缘端口+BPDU保护、环路检测 |
| SSH无法远程登录 | SSH协议未启用、VTY配置被覆盖 | display user-interface vty | 确认protocol inbound ssh并检查认证配置 |
| 交换机console密码丢失 | 密码遗忘、配置未备份 | BootLoad菜单 | 通过BootLoad清除console密码 |
4.6 经验补充:堆叠和链路聚合的关系
你可能会想,既然链路聚合能捆多根线,为什么华为还要做堆叠?这两个技术确实有交集,但应用的场景深度不同。堆叠是把多台交换机虚拟成一台设备,统一管理、统一转发面板,组网更灵活,也是很多数据中心的常用方案。链路聚合则更加轻量,不需要设备支持堆叠接口就能用,适用面更广。
如果你手头有两台接入交换机要跟核心做双归,又不做堆叠,那么STP会阻塞掉其中一条上行链路,另一条就变成冗余备份。要做真正的双活,就得配堆叠(iStack)或者M-LAG(跨设备链路聚合)。M-LAG本质上是一个跨设备的链路聚合技术,两台交换机对接到核心侧同一台Eth-Trunk,而且两边都转发流量,进而突破了STP阻塞这个天然限制。
从实践来看,中小型项目用堆叠已经够用,但是堆叠也有风险——升级版本时两台设备需要同步升级,如果操作不当会同时挂掉;链路聚合则简单得多,而且承载能力足够。两者的选择没有绝对的谁优谁劣,还是要看组网规模、业务可用性要求以及运维团队的习惯。
5. 实操总结与个人经验
写到这里,内容已经比较长了。最后分享两个我个人的配置习惯,希望能帮到正在做网络设计的朋友。
第一个习惯是配置完所有协议后,一定在业务低峰期做一次故障演练,把关键链路逐根拔掉,测试一下STP收敛时间、Eth-Trunk切换时间是否符合预期。很多网络平时看着正常,一断就发现备链路根本没准备好,通过演练能提前发现问题。
第二个习惯是所有的配置变更都要留档,我通常会执行display current-configuration把配置导出,并在变更前后各导一次,方便比对和回退。网络设备不像服务器系统,切换失败可以重装,网络一出问题整个公司就瘫痪了,所以每一步都得稳。
STP和链路聚合本身都不难,真正难的是理解它们在真实网络里如何配合、如何互相约束、如何在故障时快速定位问题。希望这篇文章能帮你少走一些弯路。
