前几天在机房处理一个故障,一台服务器双网卡接两台上联交换机,业务高峰时丢包严重。我过去一看,兄弟把两条网线都插上了,但没做任何绑定,交换侧也没做聚合处理,结果两条链路同时工作还互刷广播,交换机直接告警环路。这其实是个很典型的场景:明明可以靠交换机的二层链路聚合解决问题,不少同行还是会绕远路。
二层链路聚合,在华为设备上通常就叫 Eth-Trunk。它的核心逻辑很简单:把两台交换机之间、或者交换机与服务器之间的多条物理链路,捆绑成一条逻辑链路。对外是一个逻辑接口,对内是多条成员链路同时转发,既能提升带宽,又能实现链路冗余,还能避开生成树协议对冗余链路的阻塞。这篇文章就围绕华为设备,把二层链路聚合的原理、配置、验证和排错讲透。适合刚接触园区网配置的工程师,也适合在运维过程中被链路聚合坑过一次但又没完全搞懂的同行。
1. 什么时候真的需要一层二层链路聚合:业务场景与取舍
1.1 先从一次“假双链”故障说起
我前面提到的那个故障,服务器上明明插了两根网线,为什么反而出问题?因为交换机的物理接口在没有聚合时,默认都会被生成树协议(STP)纳管。两条物理路径一旦构成环路,STP会阻塞其中一条,另一条正常转发。但服务器侧的网卡驱动如果做了主动负载均衡,或者干脆把两个口都配置成“活的”,交换机的STP判断和服务器网卡的转发逻辑就会打架。结果就是广播风暴、MAC地址漂移,业务呈现“时通时断”的状态。
如果当时用二层链路聚合,把服务器两个网卡和交换机两个接口绑定成一个Eth-Trunk,情况就完全不同。流量会按照负载分担算法分散到两条链路上,而且任何一条链路断开,另一条还能继续承载全部流量。这个道理放在交换机到交换机之间更常见:两栋楼之间、两级核心之间,往往要跑好几条光纤,如果不做聚合,带宽叠加不了,冗余也做不了。
1.2 “带宽不够”不一定就要换设备
很多朋友第一反应是“带宽不够就上更贵的交换机”,这不一定划算。一台接入交换机到核心交换机之间,如果只是普通千兆口,两条千兆链路聚合后,理论转发能力可以接近2Gbps。虽然实际效果受哈希算法和流量模型影响,达不到完美叠加,但比单条链路强得多,而且成本几乎为零。
聚合的另一个价值是链路冗余。物理链路断了,流量能自动切换到其他成员链路,用户基本无感知。这在接入层尤其关键,毕竟终端用户不会容忍你跑进机房换线。对于设备本身而言,做二层链路聚合不需要额外license,也不需要换板卡,是性价比非常高的扩容和冗余手段。
1.3 二层聚合和三层聚合的边界
这里要区分一下:二层链路聚合处理的是二层接口,成员接口类型可以是access、trunk,也就是我们常说的“中继模式”或“接入模式”,Eth-Trunk本身也是一个二层逻辑接口。三层链路聚合则是在Eth-Trunk上配置IP地址,常用于路由场景和跨设备互联。
我这篇文章聚焦的是二层场景。实际组网中,交换机之间跑多个VLAN时,二层聚合适配度最高,因为不需要重新规划IP网段,也不用考虑路由协议。只要把成员接口加入聚合组,VLAN透传范围保持一致,两边的配置对称,链路就能正常工作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 华为二层链路聚合的两条技术路线:手工负载分担与LACP动态协商
2.1 链路聚合从哪来:从“物理堆线”到“逻辑一根线”
在交换机的早期阶段,两条链路同时用是有条件的。STP会阻塞冗余端口,防止形成环路。后来出现了端口捆绑技术,让多条物理链路被当成一条逻辑链路,stp也只对这个逻辑接口进行判断,不会阻塞成员链路。传统的端口捆绑需要人工在两端配置,只要两边成员接口都加入同一个聚合组,协议栈就把它们看成一个端口。
华为设备上,这个逻辑接口称为 Eth-Trunk。你可以把Eth-Trunk理解成一个“虚拟容器”,里面装了好几个物理口。实际转发时,设备会根据报文的MAC地址或IP地址进行哈希计算,选中某一条成员链路发送。这个哈希算法是可调的,我们要根据自己的业务流量模型去选择合适的哈希因子。
2.2 手工负载分担模式的关键逻辑
手工负载分担模式,是链路聚合里最朴素的一种实现。两端的交换机都不参与协商,只要把接口手工加入同一个Eth-Trunk编号,配置一致,链路就进入工作状态。成员链路之间全部负载分担,同时承担流量转发,任何一条链路故障时自动从哈希表中排除,流量由剩余成员链路承接。
这种模式的好处是配置简单、依赖少,适用于两侧设备不支持LACP协商,或者链路对端是服务器的场景。但它有一个比较大的问题,就是链路对端必须也配置成相同的聚合模式、相同的Eth-Trunk编号。如果只有一端配置了聚合,另一端还是普通物理口,设备不会主动告诉你链路上有协议错误。实际排错时,两个口明明都up,却ping不通,很多人就卡在这里。
2.3 LACP动态协商模式又解决了什么
LACP,全称Link Aggregation Control Protocol,是802.3ad标准里定义的链路聚合控制协议。华为设备的LACP模式,允许两端通过交换LACPDU报文,协商哪些成员链路可以加入聚合、哪些成员链路作为备份。这样就避免了两端配置不对称还浑然不知的问题。
LACP还引入了端口优先级和系统优先级的概念。两端都会选举出主动端(actor)和被动端(partner),以主动端的配置为准。系统优先级越小越优先,端口优先级越小越可能成为活动链路。通过调整这些参数,我们可以控制哪些链路是活动转发状态,哪些链路是备用状态。这对于“一条主链路,一条备份链路”的场景非常实用。
2.4 两种模式怎么选
| 对比项 | 手工负载分担模式 | LACP动态协商模式 |
|---|---|---|
| 两端协商 | 无协议协商 | 通过LACP报文协商 |
| 配置复杂度 | 低,手工加入成员 | 稍高,需配置模式及优先级 |
| 链路检测 | 依赖物理up/down,检测慢 | 可检测对端失效,配合超时时间切换更快 |
| 活动/备份 | 所有成员均转发 | 可设置活动链路和备份链路 |
| 适用场景 | 服务器双网卡、简单设备互联 | 交换机到交换机、要求高可靠性的场景 |
一般来说,交换机与交换机之间,我建议优先考虑LACP动态模式。它兼容性好,标准化程度高,而且会自动协商出活动链路,故障切换的效率比手工模式高不少。如果是接服务器,就要看服务器网卡是否支持对应的bonding模式,很多Linux系统用mode=4对应802.3ad,Windows下的Team方式也支持LACP,可以配合使用。
3. 动手配置:在华为设备上把二层链路聚合敲出来
3.1 实验拓扑与规划
实际配置前,我们得先规划清楚。下面是一个最常用的二层组网:
- SW1作为接入交换机,连接多个VLAN终端。
- SW2作为汇聚交换机,下联SW1。
- SW1和SW2之间使用两条GE物理链路(GE0/0/1和GE0/0/2),绑定为一个Eth-Trunk 1。
- 需要放行VLAN 10和VLAN 20,因此Eth-Trunk接口配置为中继模式(trunk)。
在eNSP模拟器里,这个拓扑也能直接搭出来。我建议初学者先在eNSP上练一遍,熟悉命令格式后,再上真机。因为模拟器对协议细节做了一定简化,LACP协商不一定完全真实,但基本配置逻辑是一致的。
3.2 配置VLAN与中继链路的基础
先把基础VLAN建好。
code复制[SW1]vlan batch 10 20
[SW2]vlan batch 10 20
然后进入接口GigabitEthernet0/0/1和GE0/0/2。这里要注意:在华为设备上,接口一旦被加入Eth-Trunk,就不能再单独配置VLAN或trunk属性。正确的做法是,把这两个物理接口全部清空默认配置,然后加入到Eth-Trunk中。
我经常看到有人先把物理接口配置成trunk,再试图加入聚合组,结果设备提示“成员口下存在业务配置,请先清除”。这是个非常常见的坑,下面排错部分还会细说。
3.3 手工模式Eth-Trunk配置步骤
手工负载分担模式配置如下。
code复制[SW1]interface Eth-Trunk 1
[SW1-Eth-Trunk1]mode manual load-balance
[SW1-Eth-Trunk1]port link-type trunk
[SW1-Eth-Trunk1]port trunk allow-pass vlan 10 20
[SW1-Eth-Trunk1]trunkport GigabitEthernet 0/0/1
[SW1-Eth-Trunk1]trunkport GigabitEthernet 0/0/2
SW2上的配置完全对称,只是设备名不同。
code复制[SW2]interface Eth-Trunk 1
[SW2-Eth-Trunk1]mode manual load-balance
[SW2-Eth-Trunk1]port link-type trunk
[SW2-Eth-Trunk1]port trunk allow-pass vlan 10 20
[SW2-Eth-Trunk1]trunkport GigabitEthernet 0/0/1
[SW2-Eth-Trunk1]trunkport GigabitEthernet 0/0/2
mode manual load-balance 这条命令可以省略,因为华为交换机上Eth-Trunk默认就是手工负载分担模式。但为了配置可读性,我会明确写上。
关键是两端的Eth-Trunk编号必须一致。比如SW1用Eth-Trunk 1,SW2也用Eth-Trunk 1。如果在不同厂商设备之间对接,编号可以不同,但华为设备自己对接时,最好保持一致,避免后续维护时混乱。
3.4 LACP动态模式配置步骤与验证
LACP模式配置稍微复杂一点。
SW1:
code复制[SW1]interface Eth-Trunk 1
[SW1-Eth-Trunk1]mode lacp-static
[SW1-Eth-Trunk1]lacp timeout fast
[SW1-Eth-Trunk1]port link-type trunk
[SW1-Eth-Trunk1]port trunk allow-pass vlan 10 20
[SW1-Eth-Trunk1]trunkport GigabitEthernet 0/0/1
[SW1-Eth-Trunk1]trunkport GigabitEthernet 0/0/2
SW2:
code复制[SW2]interface Eth-Trunk 1
[SW2-Eth-Trunk1]mode lacp-static
[SW2-Eth-Trunk1]port link-type trunk
[SW2-Eth-Trunk1]port trunk allow-pass vlan 10 20
[SW2-Eth-Trunk1]trunkport GigabitEthernet 0/0/1
[SW2-Eth-Trunk1]trunkport GigabitEthernet 0/0/2
两边都是lacp-static,设备会自动交换LACPDU。想控制主备链路,可以设置系统优先级和接口优先级。
code复制[SW1]lacp system-priority 100
这条命令要在系统视图下配置,值越小优先级越高。SW1的系统优先级为100,SW2保持默认32768,那么SW1就是LACP主动端,以它的端口优先级和状态为准。
在成员接口上设置端口优先级,让GE0/0/1成为active,GE0/0/2成为standby。
code复制[SW1-GigabitEthernet0/0/1]lacp priority 100
[SW1-GigabitEthernet0/0/2]lacp priority 200
这个配置会在LACP协商后,让GE0/0/1先进入活动状态,GE0/0/2作为备用。实际效果可以用display eth-trunk 1查看。
3.5 关键验证命令与输出解读
配置完成后,验证命令是重头戏。
code复制display eth-trunk 1
输出大致包含:
code复制Eth-Trunk1's state information is:
WorkingMode: LACP-static
Hash arithmetic: According to SIP-XOR-DIP
System ID: ...
Least Active-numbernumber of links: 1
Operate status: up
还会列出每个成员接口的角色,是Selected还是Standby。
code复制Port Status Priority Operate-State
GE0/0/1 Selected 100 up
GE0/0/2 Standby 200 up
如果看到Operate status: up,说明聚合链路逻辑状态正常。接着用display trunkmembership Eth-Trunk 1查看成员接口的VLAN属性,确认trunk放行的VLAN列表是一致的。
测试二层连通性时,从SW1下挂的PC ping SW2下挂的PC,通了基本就没问题。但别只ping一次,最好持续ping,同时拔掉一根物理链路,观察丢包情况。如果配置正确,最多丢几个包,业务很快恢复;如果断线后完全不通,大概率是链路聚合没生效,或者对端还停留在普通接口状态。
4. 配置完掉流量?二层链路聚合排错与避坑实录
4.1 成员接口为什么加不进来
这是新手最常遇到的第一个问题:trunkport GigabitEthernet 0/0/1敲下去,系统直接报错。
报错内容通常指向“成员口下存在业务配置,请先清除”。原因是这个物理接口之前配置过access vlan、trunk属性,甚至可能是某个业务接口,残留配置没清干净。解决方法是进入物理接口,用undo shutdown确认接口是开启状态,然后执行undo portswitch或者clear configuration this把接口配置清空,再重新加入Eth-Trunk。
我比较习惯的做法是,加入成员接口前,对接口做一次批量清空:
code复制[SW1]clear configuration interface GigabitEthernet 0/0/1
然后重新进入接口,确认没有配置残留,再回到Eth-Trunk下添加。注意,clear configuration interface会导致接口shutdown,需要重新undo shutdown。
4.2 接口模式不一致导致的“通一半”现象
还有一种情况,Eth-Trunk状态是up,两个成员接口都是selected,但VLAN间流量就是不通。这时候要重点检查Eth-Trunk逻辑接口的链路类型和允许VLAN列表。
在华为设备上,Eth-Trunk接口本身有access/trunk/hybrid属性。如果SW1的Eth-Trunk配置成了trunk,允许VLAN 10和20,而SW2的Eth-Trunk居然还是默认hybrid,或者允许VLAN列表不一致,二层流量就出不去。因为二层转发不只看物理链路up,还要看VLAN标签能否在两端匹配。
解决办法是确保两端的port link-type一致,且port trunk allow-pass vlan配置的VLAN完全对称。如果业务VLAN比较多,可以用port trunk allow-pass vlan all,但出于安全考虑,我还是建议只放行业务需要的VLAN。
4.3 LACP协商一直失败怎么办
LACP协商失败是最让人头疼的,因为物理层明明是通的。
先看display lacp statistics,确认是否收到对端的LACPDU。如果收不到,大概率是对端没有配置LACP模式,或者对端配置的是手工模式。LACP报文是组播发送的,二层链路通则能收到。如果两端都是LACP模式,但系统视图下的优先级、端口优先级配置不当,可能导致某条链路的端口一直无法进入Selected状态。
我踩过的一个坑是,在模拟器里SW1配置成了lacp-static,SW2却忘了配置,就看了一眼物理口up,以为没问题,结果Eth-Trunk起不来。后来发现,LACP模式下如果对端是普通接口,Eth-Trunk虽然能显示物理up,但逻辑状态会一直停留在一个“协商中”的奇怪状态,VLAN数据根本转发不了。
4.4 流量不经过聚合链路:STP与VLAN的小动作
二层链路聚合配置正确,但如果周围还有别的物理链路,形成环路,STP可能会阻塞Eth-Trunk里的某些成员端口。虽然stp通常把Eth-Trunk当作一个逻辑端口参与计算,但成员链路的端口角色可能显示为Alternate或Backup,这时候流量就不会走这条链路。
另外,华为设备的STP默认是使能的,如果Eth-Trunk配好但没收到BPDU,接口可能一直处于discarding状态。可以执行display stp interface Ethernet-Trunk 1 brief查看端口状态。正常情况下,Eth-Trunk接口状态应该是forwarding。
4.5 哈希负载不均衡:链路聚合的“假性能”
链路聚合配置全对,业务也通了,但带宽就是上不去,两条链路一条跑满,一条几乎为0,这种现象也很多。
原因在于负载分担的哈希因子和业务流量模型不匹配。默认情况下,华为交换机可能按源MAC和目的MAC进行哈希,如果流量集中在某几个MAC对之间,哈希结果就会固定指向某一条链路。比如服务器A和服务器B之间的大流量传输,MAC对就那么几个,自然只走一条物理链路。
这种问题不是链路聚合没生效,而是负载分担粒度不够细。解决方法是调整哈希算法,比如按源IP、目的IP、源端口、目的端口计算哈希。但要注意,二层链路聚合如果成员接口同时承载二层和三层流量,调整前要看清设备支持的哈希内容,不同型号的支持范围不一样。
5. 让聚合链路跑得更稳:负载分担调优与日常维护心得
5.1 负载分担算法选型:按MAC还是按IP
华为设备上查看当前负载分担算法:
code复制display load-balance eth-trunk 1
修改算法:
code复制[SW1-Eth-Trunk1]load-balance src-dst-ip
常见的负载分担因子包括:
src-dst-mac:按源目的MAC哈希,适用于二层转发流量较多的场景。src-dst-ip:按源目的IP哈希,适用于路由和三层转发较多的场景。src-dst-ip-port:按IP和端口哈希,粒度最细,适用于TCP/UDP业务较多场景,但设备计算开销也更高。
选型原则很简单:看业务流量的主要特征是MAC变化多,还是IP变化多。如果是接入层交换机和核心交换机之间跑VLAN流量,推荐用src-dst-mac,因为二层报文的MAC地址分布通常比较均匀;如果是服务器出口,由于服务器MAC固定,建议用src-dst-ip甚至src-dst-ip-port,否则哈希结果很容易集中在某个源MAC上。
5.2 改变成员链路前后要注意什么
日常维护中,最怕的就是在已经承载业务的Eth-Trunk上动刀。比如想替换一根光纤,或者调整成员接口,一定要按“先摘除,后调整”的原则操作。
执行undo trunkport把某个接口从Eth-Trunk中移除,流量会立即重新分布到剩余成员链路上,可能会造成瞬时拥塞。如果业务不能中断,就需要在低峰期操作,或者提前增加一条临时成员链路,再移除目标链路。
另外,成员接口加入之前必须确认对端接口也做了同样的操作。我之前见过一个案例,只在一端把新接口加入了Eth-Trunk,另一端还空着,结果LACP协商后Eth-Trunk逻辑状态还是up,但成员链路上并没有实际流量,因为对端的转发逻辑并没有把流量映射过来。
5.3 eNSP上验证聚合功能的小技巧
用eNSP练手时,很多人会遇到一个问题:模拟器里PC的ping流量太小,哈希结果可能始终固定走某一条链路,看不出来负载效果。
我习惯在eNSP里挂两台服务器,或者在交换机间放几台PC,同时ping不同的目标,再查看display eth-trunk 1里的成员流量计数。华为eNSP的display interface不会像真机那样显示每秒流量,但可以通过display eth-trunk 1查看每个成员口的转发统计,或者用display interface GigabitEthernet0/0/1看统计的大概趋势。
如果模拟器里没有LACP模式的完整支持,先用手工模式把逻辑跑通,再切到LACP模式练习,这样更容易理解协议报文交互。
5.4 二层聚合之外的进阶方向
当你掌握了二层链路聚合,再看三层链路聚合就会轻松很多。三层Eth-Trunk的配置思路几乎一样,只是把Eth-Trunk接口当成一个三层接口,配置IP地址,然后运行路由协议。三层链路聚合常用于核心交换机之间,提高路由链路带宽并实现冗余。
还有一些场景会用到跨设备链路聚合,比如堆叠系统下的Eth-Trunk。把两台物理交换机堆叠成一台逻辑设备后,成员接口可以分布在两台物理设备上,这样即使一台设备故障,另一台设备上的成员链路仍然能接管流量。不过堆叠和聚合的配合需要额外注意,建议先把基础聚合原理吃透,再去碰跨设备场景。
最后分享一个小经验:我在实际项目里配置链路聚合,一定会在两端都贴好标签,标注“Eth-Trunk 1成员口”,因为这种逻辑链路在故障排查时非常容易被人忽略。有时候现场同事看到两根线都是通的,就以为是两条独立链路,重新做过配置后把聚合关系拆了,业务立刻乱套。运维这件事,很多事故不是技术门槛高,而是细节管不住。把这根“逻辑链路”当成一根线来维护,设备、网线、模块、标签、配置,任何一环都不能随意改动,链路聚合才能成为你手里的稳定方案。
