如果你在数据中心或园区网络里做过服务器双归接入,大概率遇到过这种尴尬:一台服务器明明接了两条上联链路,本想着“双线保险”,结果传统STP硬生生给你堵掉一条,双归变成单归,多出来的链路只能当冷备,平时一点业务流量都转不了。M-LAG(跨设备链路聚合)就是专门解决这个问题的:它让两台物理交换机在接入侧看起来像是一台逻辑设备,两条上联链路能同时转发流量,既保住可靠性,又不浪费带宽。这篇文章就围绕HCL模拟器里的M-LAG学习配置展开,从环境准备、原理拆解到命令配置、故障排查,把完整过程都过一遍。
这篇内容主要面向已经会配置普通链路聚合、想进一步了解数据中心可靠性组网的网络工程师,也适合正在准备H3C认证、手头又没有真机环境的同学。HCL模拟器虽然没法像真机那样完整模拟所有硬件行为,但M-LAG的协商、转发、故障切换逻辑是能跑通的,练原理和熟命令完全够用。
1. 先把M-LAG放在数据中心的真实场景里看
1.1 双归接入为什么不能用STP硬扛
传统组网里,一台交换机要双归接入两台上层设备,最直接的做法是把两条上联分别接到两台设备上,然后在接入交换机上跑STP。问题是STP的逻辑天然就是“破环”,它一定会阻塞掉一个端口,结果就是:物理上有两条链路,逻辑上只有一条在转发。如果你用手工配置关闭STP,运气好没环路,运气不好一广播风暴就能把整片网络打挂。
为了把两条上联都用起来,早期有各种变通方案,比如把两台上层设备堆叠成一台。堆叠(IRF)确实能解决双归问题,但堆叠也有自己的麻烦:两台设备需要专用堆叠线、堆叠系统升级时有整体风险、跨设备版本不一致时比较难处理。M-LAG出现的意义就在于,它不需要把两台设备真正“融合”成一台,而是让两台独立设备在接入侧协同工作,对外表现得像一台。
1.2 M-LAG给网络带来了什么
M-LAG的英文全称是Multi-Chassis Link Aggregation Group,中文一般叫跨设备链路聚合。它的核心价值可以概括成三点:
- 双活转发:两条上联链路同时处于转发状态,接入设备的带宽不再被STP浪费。
- 设备级冗余:任何一台设备故障,另一台设备能无缝接管流量,不用等STP重新收敛。
- 接入侧透明:下联交换机/服务器不需要特殊支持,普通链路聚合配置即可,对端看到的就是一台设备。
这个特性在数据中心里特别实用,因为数据中心最在意的就是“链路不浪费、故障不等待”。M-LAG还支持双活网关,两台设备上配置相同的网关IP,终端侧ARP表始终指向同一个逻辑网关,不会因为设备切换导致网关飘移。
1.3 用HCL模拟M-LAG的可行性与局限
HCL(H3C Cloud Lab)是H3C官方出的图形化网络模拟器,早期版本里设备型号偏少,很多数据中心级特性根本找不到。到了3.0.1及更新版本,模拟器里加入了S6850、S9820等型号,M-LAG相关命令才比较完整。
我个人的结论是:在HCL里学M-LAG完全可行,前提是选对设备型号。如果你用的还是老版本,打开设备一看连m-lag命令都敲不出来,那大概率不是配置问题,而是设备型号不支持,直接换S6850重来就行。
模拟器的局限也很明显:真机上M-LAG故障切换涉及硬件转发表项迁移、芯片级表项同步,模拟器只会给你一个“状态变化”的结果;另外HCL对部分三层转发行为的模拟也不够细腻。但对学习配置和排错思路来说,影响不大。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. HCL实验环境与拓扑规划
2.1 HCL版本和设备型号怎么选
先解决环境问题。HCL模拟器依赖VirtualBox运行,3.0.1版本一般搭配VirtualBox 5.2.x,装新版VirtualBox反而可能不兼容。安装HCL时有个很常见的坑:安装路径不能带中文和空格,否则设备镜像加载会出各种奇怪问题。
设备型号方面,我的建议是:
- 核心M-LAG设备:用S6850,这是HCL里M-LAG命令最完整的型号之一。
- 接入侧设备:可以用S6850,也可以用S5820V2,接入侧只做普通链路聚合,对型号要求不高。
- 终端设备:HCL自带的Host节点可以模拟PC,但操作起来比较麻烦,我习惯直接用一台接入交换机做三层验证,也就是用交换机的VLAN接口去ping网关。
如果你打开HCL发现设备列表里没有S6850,先检查版本,别急着找配置问题。
2.2 本次实验的拓扑与地址规划
我们这次搭一个最典型的M-LAG双归拓扑。S1和S2作为M-LAG设备,组成一个双活系统;S3是下联接入交换机,通过两条上联分别连接到S1和S2;S3上做普通链路聚合,从它的视角看,S1和S2就是一台设备。
设备间链路分配:
- S1和S2之间:两条10GE链路作为peer-link,组成聚合口,放通所有业务VLAN。
- S1和S2之间:一条独立GE链路作为keepalive检测链路,走专用VLAN 4094,不承载业务。
- S1到S3:一条GE/10GE链路,加入M-LAG聚合组。
- S2到S3:一条GE/10GE链路,加入M-LAG聚合组。
- S3到S1和S2:两条上联组成Bridge-Aggregation 1。
地址规划如下:
| 设备 | 接口/VLAN | IP地址 | 用途 |
|---|---|---|---|
| S1 | Vlanif10 | 192.168.10.1/24 | 业务网关(与S2双活) |
| S2 | Vlanif10 | 192.168.10.1/24 | 业务网关(与S1双活) |
| S3 | Vlanif10 | 192.168.10.10/24 | 接入侧验证地址 |
| S1 | Vlanif4094 | 192.168.1.1/24 | keepalive源地址 |
| S2 | Vlanif4094 | 192.168.1.2/24 | keepalive目的地址 |
2.3 模拟器设备启动失败的排查清单
“hcl模拟器设备启动失败”是很多人绕不过去的一道坎,我在一开始也被卡过。如果设备一直卡在“启动中”或者提示启动失败,按这个顺序排查:
- 用管理员身份运行HCL,VirtualBox需要访问虚拟化底层,权限不够很容易出问题。
- 确认BIOS里已经开启CPU虚拟化,Intel的VT-x或AMD的SVM。
- 关闭Windows自带的Hyper-V、内核隔离、内存完整性等功能,这些会和VirtualBox抢虚拟化资源。
- 检查VirtualBox版本是否和HCL匹配,HCL 3.0.1不兼容高版本VirtualBox。
- 删掉用户目录下
.hcl文件夹里的缓存文件再重新启动,这一步能解决很多“莫名其妙”的启动故障。
另外提醒一下:HCL里设备启动需要一点时间,别刚点开机就狂刷启动按钮,容易把设备搞到异常状态。
3. M-LAG的四根支柱:keepalive、peer-link、DRCP、一致性
3.1 keepalive:专用心跳链路,负责脑裂检测
keepalive是M-LAG系统里最容易忽略却最要命的配置。它的作用是让两台设备互相检测“对方是否还活着”,这个检测必须走独立链路,不能和peer-link共用物理线路。
为什么不能共用?因为如果把keepalive和peer-link放在同一条链路上,一旦这条链路断开,两台设备同时失去“数据通道”和“心跳通道”,它们无法确认对方是故障了还是链路断了,就会出现两边都认为自己是主设备、同时转发形成环路的风险,这就是“脑裂”(split-brain)。keepalive独立存在就是为了在peer-link断开时,两台设备还能通过心跳互相感知,从而让备份设备主动关闭M-LAG接口,避免双主转发。
配置keepalive时要注意:专用VLAN不要放通业务流量,源地址和目的地址分别指向对端的Vlanif地址,方向不能写反。S1上源是192.168.1.1,目的是192.168.1.2;S2上刚好反过来。
3.2 peer-link:M-LAG系统里的“内部总线”
peer-link是两台设备之间最重要的数据链路,它承担两个任务:
- 传输DRCP等M-LAG协议报文,保证两台设备状态同步。
- 转发需要“借道”到对端的业务流量。比如某个M-LAG成员接口的入向流量哈希到本设备,但本设备的上行接口不在本地,这时流量就需要通过peer-link送到对端设备再出局。
peer-link的配置核心是把一个普通聚合接口指定为peer-link角色。这条链路带宽一定要给足,因为它是两台设备之间唯一的“内部通道”。在模拟器里我们只做实验用两条10GE够了,生产环境建议多条高带宽链路做聚合冗余。
3.3 M-LAG接口与DRCP:把两条物理链路拧成一根
M-LAG接口就是面向下联设备的业务接口,分别落在两台设备上,但逻辑上属于同一个聚合组。这里的关键协议是DRCP(Distributed Relay Control Protocol),它基于LACP扩展,通过peer-link传递DRCP报文,让两台设备上的M-LAG接口协商成一个逻辑接口。
为了协商成功,两台设备必须配置一致的M-LAG系统参数:
- 系统MAC必须一致,否则对端会认为是两台不同设备。
- 系统编号必须不同,S1用1,S2用2,这是区分主备/身份的依据。
- 系统优先级建议一致,或者显式指定,避免协商混乱。
对下联设备(S3)来说,它看到的DRCP报文来自同一个系统,所以不会认为两条上联是不同设备,链路聚合就能正常建立。这就是M-LAG对接入侧透明的原理。
3.4 一致性检查与双活网关的底层逻辑
M-LAG要求两台设备上的配置保持一定一致性,比如VLAN配置、M-LAG接口所属的VLAN、peer-link配置等。设备会做一致性检查,如果某个关键配置不一致,可能导致M-LAG接口协商失败或者转发异常。
双活网关也是M-LAG的一个重要应用。我们在S1和S2上都配置192.168.10.1,普通场景下这肯定冲突,但在M-LAG系统里,两台设备对外采用同一个M-LAG系统MAC,终端发送ARP请求时,无论请求到达哪台设备,响应的都是同一个系统MAC,终端认为只有一台网关。这样就实现了一个网关IP双活转发:去程流量可能哈希到S1,也可能哈希到S2,回程各自独立转发,谁也不用等谁。
4. S1和S2的完整配置过程
4.1 S1配置:从全局参数到peer-link
下面以S6850为例,给出S1的完整配置。接口编号在实际模拟器里可能有差异,配置时以设备显示为准。
code复制system-view
sysname S1
# 创建keepalive专用VLAN及三层接口
vlan 4094
quit
interface Vlan-interface4094
ip address 192.168.1.1 255.255.255.0
quit
# 配置M-LAG系统参数
m-lag system-mac 0000-0000-0001
m-lag system-number 1
m-lag system-priority 100
# 配置keepalive检测
m-lag keepalive ip destination 192.168.1.2 source 192.168.1.1 vlan 4094
# 创建peer-link聚合接口并放通所有VLAN
interface Bridge-Aggregation 2
description peer-link
port link-type trunk
port trunk permit vlan all
m-lag peer-link
quit
# 将物理接口加入peer-link聚合组
interface Ten-GigabitEthernet1/0/1
port link-aggregation group 2
quit
interface Ten-GigabitEthernet1/0/2
port link-aggregation group 2
quit
# 创建业务VLAN及双活网关接口
vlan 10
quit
interface Vlan-interface10
ip address 192.168.10.1 255.255.255.0
quit
注意几个容易搞错的地方。m-lag peer-link这条命令必须配置在聚合接口下,不能直接配在物理口上。m-lag keepalive里的VLAN参数是keepalive报文所属的VLAN,要和前面创建的VLAN 4094对应,这里很多新手会写成业务VLAN,结果keepalive一直在抖动。
4.2 S2配置:两个数字的微妙区别
S2的配置和S1大体对称,但有两处不能照抄:system-number要改成2,keepalive的源目的地址要互换。
code复制system-view
sysname S2
vlan 4094
quit
interface Vlan-interface4094
ip address 192.168.1.2 255.255.255.0
quit
m-lag system-mac 0000-0000-0001
m-lag system-number 2
m-lag system-priority 100
m-lag keepalive ip destination 192.168.1.1 source 192.168.1.2 vlan 4094
interface Bridge-Aggregation 2
description peer-link
port link-type trunk
port trunk permit vlan all
m-lag peer-link
quit
interface Ten-GigabitEthernet1/0/1
port link-aggregation group 2
quit
interface Ten-GigabitEthernet1/0/2
port link-aggregation group 2
quit
vlan 10
quit
interface Vlan-interface10
ip address 192.168.10.1 255.255.255.0
quit
有同学会问:S2的Vlanif10和S1配置成同一个IP,配置时会不会报错?在M-LAG没有协商成功前,设备可能有告警提示,但只要M-LAG系统协商正常,这个IP冲突是不会影响转发的,因为两个VLAN接口的MAC被统一成了系统MAC。
4.3 配置完成后你应该看到的状态
M-LAG系统参数配置完成后,可以先不配业务M-LAG接口,直接在设备上查看系统协商状态:
code复制display m-lag summary
正常情况下应该能看到:
- Peer-link状态为Up。
- Keepalive状态为OK。
- M-LAG系统状态为正常/协商完成。
如果Keepalive状态一直Failed,十有八九是源目IP写反或者VLAN 4094的三层接口没建好。如果Peer-link状态Down,检查聚合口是否成功选中了物理成员,物理链路是否Up。
5. 接入侧设备的配合与全链路验证
5.1 下联交换机S3的上联聚合配置
M-LAG实验里,下联设备的配置其实非常简单,就是标准链路聚合,唯一的区别是它的两条成员链路分别连接到了不同的物理设备上。S3的配置如下:
code复制system-view
sysname S3
vlan 10
quit
interface Bridge-Aggregation 1
port link-type trunk
port trunk permit vlan 10
quit
interface Ten-GigabitEthernet1/0/1
port link-aggregation group 1
quit
interface Ten-GigabitEthernet1/0/2
port link-aggregation group 1
quit
interface Vlan-interface10
ip address 192.168.10.10 255.255.255.0
quit
ip route-static 0.0.0.0 0 192.168.10.1
S3上不需要配置任何M-LAG相关命令,它只知道自己的聚合口有两条成员链路。由于S1和S2对外呈现为同一台逻辑设备,S3侧的LACP/DRCP协商能正常完成,两个成员口都会进入选中状态,不会出现STP阻塞。
5.2 双活网关、终端连通性与故障切换验证
配置完成后,先在S3上测试到网关的连通性:
code复制ping 192.168.10.1
如果通了,说明M-LAG双活网关工作正常。接着可以做一个最直观的故障切换测试:手动将S3到S1的上联接口shutdown,然后持续ping网关。
在普通冗余组网里,链路断开后至少需要几秒的收敛时间;在M-LAG里,S3上只是聚合口掉了一个成员口,另一个成员口仍然在转发,ping基本不会丢包,或只丢一两个包。这就是M-LAG双活的直观体验。
再进一步,可以在S1上查看M-LAG接口状态:
code复制display m-lag verbose
这个命令能看到DR组信息、M-LAG接口的协商状态、双活状态等。如果S3的两个上联都接了,S1和S2的对应M-LAG接口显示成Active状态,说明双活转发正常。
6. 实测中容易踩的五个坑与排查思路
6.1 keepalive状态一直显示Failed
这是最常见的坑。配置完keepalive后,display m-lag summary里Keepalive状态不是OK,反复横跳。
排查链路:先确认两端的Vlanif4094能不能互相ping通。在S1上ping 192.168.1.2,如果通,说明三层链路正常;如果不通,检查VLAN 4094是否创建、接口是否加入、物理链路是否Up。三层通之后还Failed,检查keepalive命令里的源目的IP是否和Vlanif地址一致,以及keepalive报文用的VLAN是不是VLAN 4094。
注意:keepalive报文不会自动行走Vlanif所在VLAN,它需要命令里显式指定VLAN。如果命令里忘了写vlan参数,或者写成业务VLAN,报文就发不出去。
6.2 peer-link配置顺序导致M-LAG接口协商失败
M-LAG的配置顺序有个隐藏要求:先配好peer-link,再配M-LAG接口。如果先把业务M-LAG接口建好,再回头补配peer-link,业务接口可能一直处于协商失败状态。
原因很简单:M-LAG接口需要通过peer-link交换DRCP报文,peer-link没有建立之前,业务接口收不到对端的DRCP信息,就无法进入正常的双活状态。排错时如果发现M-LAG接口一直不是Active,先确认peer-link状态,再检查业务接口。
6.3 物理接口误加入peer-link聚合组
还有一个比较容易手滑的坑:把面向下联设备的物理接口误加到了peer-link的聚合组里。这种配置在模拟器里不一定报错,但会导致M-LAG业务接口没有了物理成员口,下联流量变成黑洞。
排查思路是逐个核对物理接口的加入方向。peer-link聚合组里应该只有S1和S2之间的互联接口;M-LAG业务聚合组里应该只有面向S3的接口。做这个实验时,我习惯在配置前先画一张接口归属表,把每个物理接口属于哪个聚合组列出来,配完再对照一遍,能省不少事。
6.4 接入侧没有做聚合,流量绕路
这个坑在理解M-LAG原理时很容易踩。有些同学在S1和S2上配好了M-LAG,但在S3上只做了两条普通的上联,没有配置链路聚合。
这种情况下会怎么样?S3的两条上联在自身看来是两条独立链路,STP检查发现逻辑环路后,会阻塞其中一个端口。结果就是:M-LAG侧双活冗余做得再好,接入侧依然只有一条链路在转发,双活的收益完全体现不出来。
M-LAG要求接入侧必须把多根上联做成一个聚合口,这样S3才会把它们当作一条逻辑链路,M-LAG双活才能真正发挥作用。在实际数据中心里,服务器的双网卡 bonding 就是这个角色。
6.5 模拟器命令不支持或设备型号不符
最后一种情况,也是很多人绕了半天才发现的:HCL里压根没有m-lag命令,或者命令敲进去直接提示未知命令。
原因几乎都是设备型号不支持。老的HCL版本只提供S5820V2等型号,这些设备模拟器的特性集里没有M-LAG。解决方法是升级HCL到3.0.1以上,并用S6850或S9820来做实验。版本没问题的话,再检查一下系统视图下是否进入了正确的设备视图,模拟器里不同型号的命令集差异还是不小的。
做这个实验的时候,我自己的习惯是在配置之前先把两台设备的差异点列在一张纸上:system-number、keepalive的源目IP,其他配置尽量
