在做园区或数据中心接入层设计时,链路聚合几乎是绕不开的一个环节。比如你手上有两条万兆光纤从接入交换机上联到汇聚交换机,如果不做任何处理,STP 会天然把其中一条 Block 掉,业务只能走一根线,单点故障和带宽瓶颈都摆在那里。华为平台解决这个问题的标准姿势就是 Eth-Trunk,也就是链路聚合组;而二层环境下最稳、最自动化的做法,就是用 LACP 做静态协商。
这篇内容是我在华为 S5720 / S5735 等 VRP 系统上做二层链路聚合的实际经验汇总。覆盖了 LACP 和手工聚合怎么选、配置前要定哪些参数、完整命令怎么敲、负载分担算法怎么调,以及最后几个真实踩坑的排查过程。不管你是刚接手接入网的运维,还是准备 HCIE/HCIP 实验项目的考生,这套过程都能直接照着用。
1. 为什么二层聚合优先选择LACP而不是手工聚合
1.1 一个典型的双上联场景
想象一下这个拓扑:汇聚交换机下挂一台接入交换机,业务 VLAN 有 10 和 20,接入交换机的上联口是两个千兆/万兆光口。如果只用一根线,带宽不够且设备单点;如果把两根线直接都插上,不做聚合,那 STP 一定会让其中一根处于 Block 状态,等于白接。
链路聚合就是把这两个物理口打包成一个逻辑口 Eth-Trunk,让数据能同时从两根物理链路走。这样既解决了环路问题,又把带宽从单条链路的容量提升到了两条之和,还保留了链路冗余。
但这里又出现一个选择:聚合方式是用手工模式还是 LACP 模式?我见过不少初学的人,图省事直接在两台交换机上用 manual load-balance 把端口绑起来,结果链路状态一旦出现“半死”情况,比如物理层还 Up、但协商或对端转发已经异常,手工聚合根本感知不到,流量照样往这条坏链路上发,业务就开始丢包。这时候用户不会觉得你聚合配错了,只会觉得整个网络不稳定。
1.2 LACP与手工负载分担的本质差异
LACP 全称 Link Aggregation Control Protocol,源自 IEEE 802.3ad,后来并入了 802.1AX。它做的事情可以简单理解为:让聚合组里的每个物理端口定期向对端发送 LACPDU 报文,报文中携带本端的系统优先级、系统 MAC、端口优先级、端口号等信息。两端通过协商,决定哪些成员口是 Active 活动链路,哪些是 Standby 备份链路。
而手工模式完全没有这个协商过程。你本地把端口加入 Eth-Trunk,对端也把端口加入 Eth-Trunk,两边自认为链路可用,链路就算“通”了。它不发送协议报文,也不检测对端实际状态,更不会自动把故障链路踢出去。
从可靠性角度说,LACP 比手工模式强在三个地方:
- 自动协商:两端参数不一致时,端口不会被选为活动状态,至少能暴露问题。
- 自动切换:活动链路故障后,备份链路通过 LACP 协商自动接管。
- 状态可见:通过
display eth-trunk能直接看到每个端口是 Selected 还是 Unselected,排错路径清楚很多。
所以只要对端设备也支持标准 LACP,我基本都是建议直接用静态 LACP,别用手工模式硬扛。
1.3 二层聚合和三层Eth-Trunk怎么区分
华为设备上的 Eth-Trunk 本质上还是一个逻辑接口,它既可以是二层口,也可以是三层口。
二层聚合,指的就是这个 Eth-Trunk 接口工作在二层模式,接口类型是 Access、Trunk 或 Hybrid。它对应的是接入交换机到汇聚交换机、服务器网卡 Bonding 对应交换机端口这一类场景。配置时需要在 Eth-Trunk 接口下执行 port link-type trunk 或 port link-type access 这类命令。
三层聚合则不同,它常用于两台交换机之间做三层互联,或者承载 VRRP、VLANIF 网关地址。这时候需要先执行 undo portswitch 把接口切换成三层模式,然后给 Eth-Trunk 配 IP 地址。
我见过不少人拿到需求后不看场景,上来就在 Eth-Trunk 接口下敲 port link-type access,结果设备提示接口是三层口无法执行,当场卡住。所以做配置之前,先想清楚你聚合出来的口到底是用来跑二层业务还是三层路由。本文后面讲的都是二层聚合,三层情况不展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 配置前必须定下来的三件套:模式、成员口和VLAN
2.1 聚合模式选哪个
华为 VRP 上 Eth-Trunk 的工作模式常见有两种:manual load-balance 和 lacp-static。
manual 模式适合纯手工管理链路、对端不支持 LACP 的老设备等极端情况。正常情况下,尤其是两台华为交换机互连,直接选 lacp-static 就好。这个模式在国内各厂商的接入和园区网络里兼容性很广,和不少其他品牌交换机也能正常协商。
如果你用的是较新的华为设备,也可能看到动态 LACP 的选项。静态 LACP 在配置上更可控,成员口不会因为协商过程中对端配置异常而频繁变动。网络设备之间的互连,稳定压倒一切,所以我习惯固定用 lacp-static。
2.2 成员端口的硬性条件
不是随便拉两个口就能组 Eth-Trunk,至少这几个条件要满足:
- 速率和双工模式必须一致。千兆口别和百兆口混在一个聚合组里,哪怕实际速率能协商,带宽和负载分担也会出问题。
- 尽量保持相同的介质类型。光口和电口不建议混用,不同板卡上的口可以混用,但要确认硬件转发能力一致。
- 成员口必须处于二层工作模式。如果之前某个口被
undo portswitch切成了三层口,要先切回二层。 - 成员口不能已经有独立的二层配置,比如已经配置了 Access 或 Trunk 属性,否则会冲突。
有些版本还会对成员口数量有限制,比如一个 Eth-Trunk 最多支持 8 个成员口。实际项目里,接入侧两个口到四个口基本够用,别一上来就把八个口全塞进去。
2.3 VLAN放通和PVID的一致性
这个问题被很多人忽略,但在真实故障里占的比例很高。
二层聚合组里的所有成员口,最终会被当作一个逻辑口来转发数据。所以这些成员口允许的 VLAN 列表必须完全一致。如果你在 Eth-Trunk 接口下配置 port trunk allow-pass vlan 10 20,那四个成员口实际生效的放通列表就都是 10 和 20。
PVID 也要注意。Trunk 口上如果 PVID 不一致,Untagged 帧过去后会被对端重新打上不同的 VLAN 标签,轻则访问不通,重则 MAC 表震荡和广播环路。后面我在排错章节会用一个真实案例说明这个问题有多隐蔽。
2.4 我建议先做掉的两件小事
第一,先把两台设备的接口基础状态梳理清楚。用 display interface brief 看哪些口是 Up 的,速率是否一致,有没有 ERR DOWN 的情况。如果某个成员口是 ERR DOWN 状态,就算加入 Eth-Trunk,也不可能被协商成 Active。
第二,先把 VLAN 建好。比如业务需要 VLAN 10 和 20,就在系统视图下执行 vlan batch 10 20,不要等 Eth-Trunk 配完了再去补 VLAN。有时候漏建 VLAN,端口放通了也会因为 VLAN 不存在而转发异常,而且这种问题用 display vlan 一看就是空的,排错反而费劲。
3. 华为VRP上LACP二层聚合的完整配置步骤
3.1 创建Eth-Trunk并启用静态LACP
用控制台或 SSH 登录设备后,先进入系统视图,然后创建 Eth-Trunk 接口。华为设备的编号是全局的,比如 Eth-Trunk 1。
bash复制system-view
sysname SW-A
vlan batch 10 20
interface Eth-Trunk 1
mode lacp-static
mode lacp-static 这一行是核心,它决定了这个聚合组工作在静态 LACP 模式。执行完后,可以顺手加一句描述,方便后期维护识别:
bash复制description To-SW-Core-LACP
这里多说一句:如果你漏了 mode lacp-static,默认的 Eth-Trunk 模式可能是手工负载分担,对端即使配了 LACP 也协商不起来。所以配置模式这步一定不要跳过。
3.2 加入成员端口及常见报错处理
在 Eth-Trunk 接口视图下,直接把物理口加进来:
bash复制interface Eth-Trunk 1
trunkport GigabitEthernet 0/0/1
trunkport GigabitEthernet 0/0/2
如果端口之前没有任何二层配置,这两条命令执行后就会自动加入。但如果你之前在某物理口上配过 port link-type 或 port trunk allow-pass vlan,系统可能提示“Error: The port has been configured.”,拒绝加入。
遇到这个报错,解决思路不是硬加,而是先清掉端口的独立配置。比较省事的办法是进入到物理接口视图,执行 undo port link-type、undo port trunk allow-pass vlan 等命令清理,或者用 clear configuration this 把该端口恢复默认配置。恢复后再回到 Eth-Trunk 接口视图重新 trunkport。
另一个替代做法是进入物理接口视图执行:
bash复制interface GigabitEthernet 0/0/1
eth-trunk 1
这个命令也能把端口加入聚合组,效果和从 Eth-Trunk 视角加入是一样的。不过我个人习惯还是用 trunkport,因为能一次性把多个口加进去,看起来更直观。
3.3 配置Trunk/Access二层属性
成员口都加进来之后,接着配置二层属性。这里开始区分场景。
如果 Eth-Trunk 作为交换机之间的 Trunk 互联,接口要放通多个 VLAN,配置如下:
bash复制interface Eth-Trunk 1
port link-type trunk
port trunk pvid vlan 10
port trunk allow-pass vlan 10 20
port trunk pvid vlan 10 不是说只允许 VLAN 10 通过,而是指定这个 Trunk 口处理 Untagged 帧时默认划分到 VLAN 10。allow-pass 才是真正放通哪些 VLAN。
如果 Eth-Trunk 是给服务器或者终端设备当接入口的,用 Access 模式更合适:
bash复制interface Eth-Trunk 1
port link-type access
port default vlan 10
需要特别强调的是,二层属性必须配置在 Eth-Trunk 接口下,而不是分别配到每个成员口上。成员口会继承逻辑口的配置,这样的配置方式最规范,也不容易产生成员间配置漂移。
3.4 可选优化:LACP优先级与最大活跃链路数
有些场景下,你有多条物理链路加入聚合组,但业务带宽只需要其中两条。比如有四根千兆口,希望两条作为 Active,另外两条作为 Standby 备份,这时候要限制最大活动链路数:
bash复制interface Eth-Trunk 1
max active-linknumber 2
系统会根据 LACP 协商结果,自动选出两个端口作为 Active 链路,其余变成 Standby。当 Active 链路故障时,备链路会自动升级为 Active,承担流量。
LACP 的选路还涉及到优先级。系统级 LACP 优先级默认是 32768,数值越小优先级越高。你可以调整本端系统的 LACP 优先级,让它更容易在协商中占据主导地位:
bash复制lacp system-priority 100
成员口也可以单独设置端口级优先级:
bash复制interface GigabitEthernet 0/0/1
lacp priority 1000
端口优先级数值越小越容易被选为活动端口。比如你想让 0/0/1 和 0/0/2 优先作为 Active 链路,就可以把这两个口的 LACP 优先级调小,其他成员口保持默认。
3.5 对端设备同步配置的要点
链路聚合是两端的配合,不是单侧动作。对端交换机也要做同样的操作:创建 Eth-Trunk、设置 mode lacp-static、加入成员口、配置二层属性。
两端需要保持一致的关键点包括:
- 聚合模式一致:都是静态 LACP。
- VLAN 放通列表一致:你放通 10 20,对端也必须放通 10 20。
- PVID 尽量一致。
- 成员口的速率、双工能力匹配。
如果对端也是华为设备,配置完全对称即可。如果对端是其他厂商设备,标准 LACP 一般都能协商成功,但要注意各厂商对“默认允许所有 VLAN”和“默认 Vlan 1”的处理逻辑有细微差别。
4. 负载分担算法选型:不是所有报文都按字节均分
4.1 哈希机制与转发行为
配置完聚合只是第一步,真正影响业务体验的是负载分担效果。
Eth-Trunk 转发数据时,不是把数据流按字节拆开平分到两条链路上,而是以“流”为单位做哈希。所谓流,通常由报文的 MAC 地址、IP 地址、VLAN 等字段组成。交换机通过哈希算法,把每个流映射到某条 Active 链路上,同一个流的所有报文始终走同一条链路,保证不乱序。
这就意味着:如果你只有一条大流量连接,比如一个点对点的文件传输,它只会落在一条物理链路上,两条成员口的利用率不会完全相等。这不是故障,而是哈希机制的正常表现。
4.2 load-balance 命令与适用场景
华为 Eth-Trunk 接口下可以用 load-balance 来指定哈希字段。常见选项有:
src-mac:按源 MAC 哈希,适合二层接入场景。dst-mac:按目的 MAC 哈希。src-dst-mac:按源和目的 MAC 一起哈希,二层聚合最常用,效果比较均衡。src-ip:按源 IP 哈希,适合三层流量。dst-ip:按目的 IP 哈希。src-dst-ip:按源和目的 IP 一起哈希,适合跨三层转发较多的环境。vlan:按 VLAN 哈希。
配置方式:
bash复制interface Eth-Trunk 1
load-balance src-dst-mac
具体默认值跟设备型号和软件版本有关。S 系列很多默认就是基于 MAC 的增强型负载分担,实际项目中你不一定能立刻感知到差别。但如果你发现均匀性很差,比如一条链路跑满另一条基本空闲,就可以尝试换成 src-dst-ip 看看效果。
4.3 广播帧、组播帧和STP的关系
这里有个很多人容易误解的点:广播帧和组播帧在 Eth-Trunk 里通常会在所有 Active 链路上复制一份,用于保证广播域内所有设备都能收到。所以你看端口计数器的时候,会看到成员口的广播计数几乎一样高,这并不代表哈希失效。
STP 和链路聚合的关系也值得一提。Eth-Trunk 逻辑口在 STP 拓扑里被视为一个接口参与计算,成员物理口内部不会形成一个环形。也就是说,聚合本身不会破坏生成树结构。如果你要用 RSTP/MSTP,正常在 Eth-Trunk 上启用即可,不用对每个成员口单独处理。
4.4 流量不均时的调整思路
遇到负载不均衡,我是这么排查的:
第一步,先确认所有 Active 端口的速率和双工一致,有一条链路降速成百兆,其他是千兆,那计数自然不均衡。
第二步,判断业务流量的特征。如果是 IP 流量比较多,就改成按 IP 哈希;如果是二层 MAC 流量多,就保持 MAC 哈希。
第三步,可以看接口计数。用 display interface GigabitEthernet 0/0/1 看 In/Out 字节数,对比两条成员口的累计值。如果长期差异特别大,考虑换哈希因子。
但注意一点:负载分担算法不能解决单条大流的问题。遇到单流打满一条链路的情况,要么拆分业务流,要么在规划阶段就把链路带宽设计得足够大,别指望哈希算法把一条 TCP 连接拆到两条物理链路上并行。
5. 验证与排错:从协商失败到“假通”案例复盘
5.1 三个最常用的状态查看命令
配置完成后,第一件事不是直接 ping 业务,而是确认聚合状态。我用得最多的命令是这样三个:
bash复制display eth-trunk 1
这条命令能看聚合组的基本信息,包括工作模式、成员口状态。正常时,成员口应该显示为 Active 或 Selected,如果显示 Unselected,说明协商有问题。
bash复制display eth-trunk brief
这条适合快速浏览所有 Eth-Trunk 的情况,包括接口状态、成员个数。
bash复制display eth-trunk 1 verbose
想看更详细的协商信息,比如系统 ID、端口优先级、LACP 报文收发量,用 verbose 版本。
输出中重点关注几个字段:
WorkingMode是不是 LACP 静态。System ID是否和实际设备匹配。Port Status是否是 Active/Selected。- 对端
Partner信息是否正确显示。
如果 Partner System ID 全是 0000 或者显示异常,基本可以断定 LACP 报文没有协商成功。
5.2 协商不起来的排查链路
我遇到过不少“两端配置看着一模一样,但成员口就是 Up 不起来”的案例。这种时候不要急着改配置,按下面的链路一步步查:
先确认两端模式一致。一端是 lacp-static,另一端是 manual load-balance,是不可能协商出 Selected 端口的。用 display eth-trunk 1 看 WorkingMode 就能判断。
再看物理链路。用 display interface brief 检查成员口是不是 Up。如果某个口是 Down,说明物理链路有问题,和 LACP 没关系,先查光模块和线缆。
然后查二层属性。Eth-Trunk 接口下的放通 VLAN 和链路类型要一致。如果一端是 Trunk 放通 10 20,另一端是 Access,即使 LACP 协商能成功,业务 VLAN 也过不去。
也可以看 LACP 报文统计:
bash复制display lacp statistics eth-trunk 1
如果本地发出的 Lacpdu 数量不断增加,但对端收到的数量一直不变,说明报文可能被端口策略丢弃,或者对端根本没跑 LACP。
5.3 实例复盘:PVID不一致导致的间歇性丢包
这是我自己交付一个接入项目时真实遇到的情况,印象很深。
背景:接入交换机到汇聚交换机之间做了二层 LACP 聚合,Eth-Trunk 是 Trunk 模式,放通了 VLAN 10 和 20。配置完成后,display eth-trunk 看两个成员口都已经是 Active,状态一切正常。但 PC 访问服务器有时通,有时不通,ping 大包时还会出现丢包。
一开始怀疑是负载分担算法问题,调整了两次哈希因子,现象没有改善。后来静下心想,聚合状态是好的,二层属性也放通了,那问题多半出在 VLAN 处理上。
我用 display interface Eth-Trunk 1 查看了 PVID,发现两台设备同一根 Eth-Trunk 上的 PVID 不一致:一端是默认 PVID 1,另一端被我之前在某次调整中改成了 VLAN 10。
这会导致什么结果?Trunk 口收到 Untagged 帧时,会打上本端 PVID;发给对端时,对端发现这个帧的 VLAN 和自己预期的 PVID 不一致,可能重新打标或者按另一套逻辑转发,一个 VLAN 的 MAC 地址就在两端交换机的表项里来回震荡,流量自然时通时断。
解决方式很简单,把两端 Eth-Trunk 的 PVID 统一成同一个值:
bash复制interface Eth-Trunk 1
port trunk pvid vlan 10
两端一致后,丢包问题立刻消失。这个案例给我最大的教训是:LACP 协商成功只代表链路“协议层面通”,不代表“业务 VLAN 通”。后面的检查和验证一定要落到 VLAN 和具体业务报文上。
5.4 拔线测试的正确姿势
配置完成后不要只看状态就收工,我强烈建议做一次拔线测试,验证 LACP 的切换能力。
方法不复杂:先找一个非业务低峰期,稳定运行一段时间后,直接拔掉其中一根成员口的线。观察终端业务是否中断,以及 display eth-trunk 1 中端口状态的变化。正常情况下,另一条链路的成员口会继续保持 Active,业务基本无感切换。如果拔线后业务长时间中断,就要检查是 LACP 超时时间太长,还是设备上的某条策略阻断了协议报文。
华为 LACP 的超时可以设置为慢速或快速。默认 Slow 模式下超时时间约 30 秒,快速模式约 3 秒。如果业务对切换时间敏感,可以在 Eth-Trunk 接口下配:
bash复制lacp timeout fast
不过要注意,这会增加 LACPDU 的发送频率,对设备和网络带宽有一点额外消耗。大多数接入场景用默认慢速就够,但核心链路可以考虑快速模式。
6. 最后几个让聚合长期稳定的小习惯
LACP 配置本身不难,难的是让它在之后几年里都不出幺蛾子。我最后分享三个从实践中养成的习惯。
第一,成员端口加入聚合组前,先清理端口配置。养成习惯后,你会少遇到很多莫名其妙的报错。尤其是交接别人配过的设备,端口上残留了多少历史配置你根本不知道,不如先 display this 看一遍再动手。
第二,不要把 Eth-Trunk 的配置分散在物理接口视图里。凡是 VLAN、链路类型、负载分担这类公共属性,一律在 Eth-Trunk 逻辑口下配置。这样后续维护时,你只需要看一个接口下的配置,不用在十几个物理口之间来回翻。
第三,每次变更后保留一份 display eth-trunk、display lacp statistics 和 display interface Eth-Trunk 的输出截图。聚合类问题往往不是当场爆发,而是几个月后某次割接才冒出来。没有基线数据,排错时你连“这个口过去是不是 Active”都说不清楚,只能靠猜。
链路聚合做多了就会发现,真正的难点从来不在那几行命令,而是你对二层转发、VLAN 语义和对端行为的理解是否到位。希望这篇东西能帮你少走点弯路。
