1 实验案例:H3C MSR36 分布式 EVPN 网关——8 节点、双 VXLAN、L3VNI 承载数据
4 台 MSR36 路由器 + 2 台 MSR36 模拟主机 + 2 台 VPCS 组成的 EVPN 分布式网关 fabric: RTA/RTB 做 anycast 网关(local-proxy-arp + arp suppression),RTC 是边界网关,RTD 是 BGP EVPN 的 RR。 VM1/VM3 属 VXLAN 10,VM2/VM4 属 VXLAN 20,同 VXLAN 二层互通、跨 VXLAN 三层互通。 本案例的重点不是配置,是「五条数据流各自长什么样」——每一条都用 reset arp + ping + 实时截图固定下来, 13 条 traffic filter 的命中数会给出一个反直觉的结论:同网段流量也走 L3VNI,不走 L2VNI。 实测环境:EVE-NG + eve-iac agent 0.9.1;H3C MSR36(msr36_hcl-7.1.064-EmulatedLab)、VPCS。

1.1 0. 实测结果
| 项 |
实测结果 |
| 规模 |
8 节点 / 7 链路 / 13 条 traffic filter |
| Underlay |
OSPF 1 / area 0,RTA/RTB/RTC ↔ RTD 邻居 FULL |
| Overlay |
iBGP AS 200,RTA ↔ RTD(4.4.4.4)Established,PrefRcv 5 |
| VSI |
vpna1 up(display l2vpn vsi name vpna) |
| 数据流验证 |
5 条全部通过:同 VXLAN ×2、跨 VXLAN ×2、广域网 ×1 |
| 封装路径 |
全部走 L3VNI 1000,VNI-10/20 恒为 0 |
| 部署耗时 |
replace 13.4 秒;plan 4.4 秒 |
1.2 1. 这个实验解决什么
单独看 VXLAN 只验证「二层能通」,单独看 EVPN 又碰不到数据面。这个案例把两者接起来,并用 filter 把控制面、二层泛洪、三层数据拆开观察:
- 两个 VXLAN 两个子网:VM1/VM3 → 10.1.1.0/24(VXLAN 10),VM2/VM4 → 10.1.2.0/24(VXLAN 20)。
- 分布式网关:RTA/RTB 的
Vsi-interface1/2 配 anycast 网关(10.1.1.1 / 10.1.2.1,共享 MAC 0001-0001-0001 / 0002-0002-0002)。
- L3VNI 承载三层:
Vsi-interface3 配 l3-vni 1000,跨 VTEP 三层报文统一用 VNI 1000 封装。
- 五条数据流逐条留证:每条都有截图和命中数,不靠
show 命令"应该通"。
边界:实验拓扑,不是生产设计——没有 ESI 多归属、没有 BFD、没有 SR-TE。
1.3 2. 镜像与规格
| 节点 |
型号 |
EVE 模板 |
镜像 |
vCPU / RAM |
网口 |
| RTA / RTB / RTC / RTD |
MSR36-20 |
msr36_hcl |
msr36_hcl-7.1.064-EmulatedLab |
2 / 512 MB |
11 |
| VM1 / VM2 |
MSR36-20 |
msr36_hcl |
同上 |
2 / 512 MB |
11 |
| VM3 / VM4 |
VPCS |
vpcs |
EVE 自带 |
— |
eth0 |
1.4 3. 拓扑与地址
| 端点 A |
端点 B |
网段 |
RTD GE0/0 |
RTA GE0/0 |
11.1.1.0/30 |
RTD GE0/1 |
RTB GE0/0 |
12.1.1.0/30 |
RTD GE0/2 |
RTC GE0/0 |
13.1.1.0/30 |
RTA GE0/1 |
VM1 GE0/0 |
VXLAN 10 接入 |
RTA GE0/2 |
VM2 GE0/0 |
VXLAN 20 接入 |
RTB GE0/1 |
VM3 eth0 |
VXLAN 10 接入 |
RTB GE0/2 |
VM4 eth0 |
VXLAN 20 接入 |
| 设备 |
地址 |
| RTA / RTB / RTC / RTD LoopBack0 |
1.1.1.1 / 2.2.2.2 / 3.3.3.3 / 4.4.4.4(/32) |
| RTC LoopBack1(vpn1) |
20.1.1.1/32(广域网对端) |
| 分布式网关 |
10.1.1.1(Vsi-if1)、10.1.2.1(Vsi-if2)、l3-vni 1000(Vsi-if3) |
| 主机 |
VM1 10.1.1.10、VM3 10.1.1.20、VM2 10.1.2.10、VM4 10.1.2.20 |
1.5 4. 关键设计
- IP 地址 + OSPF 打通到 Loopback
- 创建 VXLAN 与 VSI,VSI 下配 EVPN 实例
- BGP L2VPN EVPN 与 RR 建邻居
- 接口关联 VSI(
xconnect vsi vpna/vpnb)
- 分布式网关:anycast IP + 相同 MAC +
local-proxy-arp + distributed-gateway local
- L3VNI:
Vsi-interface3 配 l3-vni 1000
1.6 5. 核心配置
完整预配见 configs/default/n_*.cfg(8 份)。RTA 关键片段:
vsi vpna
gateway vsi-interface 1
arp suppression enable
vxlan 10
evpn encapsulation vxlan
route-distinguisher auto
vpn-target auto export-extcommunity
vpn-target auto import-extcommunity
interface Vsi-interface1
ip binding vpn-instance vpn1
ip address 10.1.1.1 255.255.255.0
mac-address 0001-0001-0001
local-proxy-arp enable
distributed-gateway local
interface Vsi-interface3
ip binding vpn-instance vpn1
l3-vni 1000
1.7 6. 复现步骤
eve_iac_deploy lab=evpn_1 # 约 13 秒
eve_iac_start lab=evpn_1 # 约 70 秒到 CLI
eve_iac_inspect lab=evpn_1 # 确认 8/8 running
配置由 H3C configscript 三遍下发(PUT_PASSES=3),预期 pass 3 后 diff 为空。
1.8 7. 五条数据流的验证(逐条留证)
1.8.1 7.1 验证方法
每条流都走同一套流程,保证可比:
# 1) 清 ARP 动态表项,强制下一次 ping 重新学习
<RTA> reset arp dynamic
<RTB> reset arp dynamic
# 2) 从指定主机 ping(5~10 包即可,包数过多会被判为洪泛而拒绝)
VPCS> ping <target> 10
# 3) ping 进行中,在 EVE 的 Traffic Filters 面板截图
# (把 filter 的 timeout 临时调到 2000 ms,高亮才驻留得住)
为什么必须抢时间窗:10 个包约 5.6 秒,而 EVE 拓扑页首次加载约 20 秒。 务必先把拓扑页打开预热,再在 ping 进行中截图,否则截到的必然是「面板有计数、链路全暗」。
1.8.2 7.2 13 条 filter 一览

| # |
过滤器 |
表达式 |
颜色 |
作用层 |
| 1 |
ARP-Request |
(arp and arp[6:2] = 1) or (vlan and arp and arp[6:2] = 1) |
红 #e53935 |
接入 L2 |
| 2 |
ARP-Reply |
(arp and arp[6:2] = 2) or (vlan and arp and arp[6:2] = 2) |
绿 #43a047 |
接入 L2 |
| 3 |
ICMP-Request |
(icmp[0] == 8 and icmp[4:2] != 0xffff) or (vlan and …) |
粉 #d81b60 |
接入 L3 |
| 4 |
ICMP-Reply |
(icmp[0] == 0 and icmp[4:2] != 0xffff) or (vlan and …) |
黄 #fdd835 |
接入 L3 |
| 5 |
VXLAN-All |
udp port 4789 |
紫 #8e24aa |
VXLAN 总量 |
| 6 |
BGP-EVPN |
tcp port 179 |
白 #ffffff |
控制面 |
| 7 |
OSPF |
ip proto 89 |
银 #e0e0e0 |
Underlay |
| 8 |
VXLAN-VNI-10 |
udp port 4789 and udp[12:2] = 0x0000 and udp[14:1] = 0x0a |
紫红 #d500f9 |
L2 VNI |
| 9 |
VXLAN-VNI-20 |
udp port 4789 and udp[12:2] = 0x0000 and udp[14:1] = 0x14 |
琥珀 #ffab00 |
L2 VNI |
| 10 |
VXLAN-Inner-ARP |
udp port 4789 and udp[28:2] = 0x0806 |
亮绿 #76ff03 |
VXLAN 内层 |
| 11 |
VXLAN-Inner-ICMP |
udp port 4789 and udp[28:2] = 0x0800 and udp[39] = 1 |
橙 #ff6d00 |
VXLAN 内层 |
| 12 |
WAN-Gateway |
ip host 20.1.1.1 |
琥珀 #ffd600 |
广域网边界 |
| 13 |
VXLAN-L3VNI-1000 |
udp port 4789 and udp[12:2] = 0x0003 and udp[14:1] = 0xe8 |
红 #ff1744 |
L3 VNI(数据面) |
VNI 必须拆成 udp[12:2](高 16 位)+ udp[14:1]****(低 8 位)——udp[12:3] 编译不过(BPF 只支持 1/2/4 字节读取)。 内层 ethertype 是 udp[28:2](8 UDP + 8 VXLAN + 12 内层 MAC),内层 IP proto 是 udp[39]。
1.8.3 7.3 流 A:同 VXLAN 10(VM3 → VM1)

| 过滤器 |
颜色 |
命中 |
含义 |
ARP-Request/ARP-Reply |
红 #e53935/ 绿 #43a047 |
6 / 6 |
两端接入链路学习 ARP |
ICMP-Request |
粉 #d81b60 |
34 |
VM3 → VM1 的 echo 请求 |
ICMP-Reply |
黄 #fdd835 |
34 |
VM1 的 echo 应答 |
VXLAN-All |
紫 #8e24aa |
68 |
核心链路上的 VXLAN 封装总量 |
VXLAN-Inner-ICMP |
橙 #ff6d00 |
68 |
解封装后的内层 ICMP |
VXLAN-L3VNI-1000 |
红 #ff1744 |
68 |
实际承载数据的 VNI |
VXLAN-VNI-10/VNI-20 |
紫红 #d500f9/ 琥珀 #ffab00 |
0 / 0 |
二层 VNI 未承载任何数据 |
WAN-Gateway |
琥珀 #ffd600 |
0 |
本流不涉及广域网 |
链路高亮:RTA—VM1、RTB—VM3 亮红黄(两端的接入链路),RTA—VM2、RTB—VM4 保持默认蓝。 读法:只有 VXLAN 10 的两台主机所在的接入链路亮,VXLAN 20 侧完全没动——说明流被正确限定在 VXLAN 10 内。
1.8.4 7.4 流 B:同 VXLAN 20(VM4 → VM2)

| 过滤器 |
颜色 |
命中 |
含义 |
ARP-Request/ARP-Reply |
红 / 绿 |
7 / 7 |
VM4/VM2 侧 ARP |
ICMP-Request |
粉 #d81b60 |
42 |
VM4 → VM2 的请求 |
ICMP-Reply |
黄 #fdd835 |
42 |
VM2 的应答 |
VXLAN-All |
紫 #8e24aa |
84 |
封装总量 |
VXLAN-Inner-ICMP |
橙 #ff6d00 |
84 |
内层 ICMP |
VXLAN-L3VNI-1000 |
红 #ff1744 |
84 |
承载 VNI |
VXLAN-VNI-10/VNI-20 |
紫红 / 琥珀 |
0 / 0 |
二层 VNI 未承载数据 |
链路高亮:RTA—VM2、RTB—VM4 亮,VM1/VM3 侧暗——与流 A 完全对称。
1.8.5 7.5 流 C:跨 VXLAN 三层(VM3 → VM2)

| 过滤器 |
颜色 |
命中 |
含义 |
ARP-Request/ARP-Reply |
红 / 绿 |
7 / 7 |
跨 VXLAN 需先解析网关 MAC |
ICMP-Request |
粉 #d81b60 |
54 |
VM3 → VM2(跨子网) |
ICMP-Reply |
黄 #fdd835 |
54 |
VM2 的应答 |
VXLAN-All |
紫 #8e24aa |
108 |
封装总量 |
VXLAN-Inner-ICMP |
橙 #ff6d00 |
108 |
内层 ICMP |
VXLAN-L3VNI-1000 |
红 #ff1744 |
108 |
承载 VNI(跨 VXLAN 必走 L3VNI) |
VXLAN-VNI-10/VNI-20 |
紫红 / 琥珀 |
0 / 0 |
二层 VNI 仍未承载数据 |
链路高亮:RTB—VM3(源侧)→ RTD—RTB → RTD—RTA → RTA—VM2(目的侧),一条完整的跨 VTEP 路径。
这是分布式网关的核心验证:源在 VXLAN 10、目的在 VXLAN 20,两台主机不同子网、不同 VTEP,靠 RTA/RTB 的 anycast 网关做三层转发,封装统一用 L3VNI 1000。
1.8.6 7.6 流 D:跨 VXLAN 反向(VM4 → VM1)

路径与流 C 相反:RTB—VM4 → RTD—RTB → RTD—RTA → RTA—VM1。 验证的是「网关在两个方向都对称」,而不是只有单向能通。
1.8.7 7.7 流 E:VXLAN → 广域网(VM3 → 20.1.1.1)

| 过滤器 |
颜色 |
命中 |
含义 |
ICMP-Request |
粉 #d81b60 |
71 |
VM3 → 20.1.1.1 |
ICMP-Reply |
黄 #fdd835 |
71 |
RTC 的应答 |
VXLAN-All |
紫 #8e24aa |
144 |
fabric 内封装总量 |
VXLAN-Inner-ICMP |
橙 #ff6d00 |
144 |
内层 ICMP |
VXLAN-L3VNI-1000 |
红 #ff1744 |
144 |
承载 VNI |
WAN-Gateway |
琥珀 #ffd600 |
2 |
出 fabric 的裸 IP(请求+应答) |
VXLAN-VNI-10/VNI-20 |
紫红 / 琥珀 |
0 / 0 |
仍未参与 |
链路高亮:RTB—VM3 → RTD—RTB → RTD—RTC** 变黄绿**(平时这条链路始终是默认色)。
这条流证明边界网关生效:VXLAN 内的主机访问 VXLAN 外部地址,报文从 RTB 进入 fabric、经 RTD 送到 RTC, 再由 RTC 的 vpn1 实例转发出去。WAN-Gateway(ip host 20.1.1.1)命中 2 次,正是请求和应答。
1.8.8 7.8 五条流汇总
| 流 |
源 → 目的 |
路径 |
L3VNI |
关键证据 |
| A |
VM3 → VM1 |
RTA↔VM1、RTB↔VM3 |
68 |
VXLAN 20 侧全暗 |
| B |
VM4 → VM2 |
RTA↔VM2、RTB↔VM4 |
84 |
与 A 对称 |
| C |
VM3 → VM2 |
RTB→RTD→RTA |
108 |
跨 VTEP 三层 |
| D |
VM4 → VM1 |
RTB→RTD→RTA |
— |
与 C 反向对称 |
| E |
VM3 → 20.1.1.1 |
RTB→RTD→RTC |
144 |
RTD—RTC变黄绿 +WAN-Gateway=2 |
共同点:每一条流的 VXLAN-All 都等于 ICMP-Request + ICMP-Reply,也等于 VXLAN-L3VNI-1000。 三个数字咬合,说明没有一条数据走 L2VNI。
1.8.9 7.9 反直觉结论:同网段也走 L3VNI
直觉:VM3 和 VM1 同在 10.1.1.0/24、同在 VXLAN 10,应该是二层转发,走 VNI 10。
实测:VXLAN-VNI-10 恒为 0,VXLAN-L3VNI-1000 等于全部包数。原因有两条,都在配置里:
arp suppression enable(VSI 视图)——VTEP 本地代理 ARP,泛洪被抑制,不进 VXLAN;
local-proxy-arp enable(Vsi-interface)——网关代理 ARP,主机看到的对端 MAC 是网关 MAC。
验证:

<VM1> display arp
10.1.1.1 0001-0001-0001 GE0/0 ← 网关
10.1.1.20 0001-0001-0001 GE0/0 ← VM3,MAC 是网关的
0001-0001-0001 是 RTA Vsi-interface1 的 MAC。对端 MAC 等于网关 MAC,说明流量被引导到网关做三层转发。
判据:分布式网关场景下,先看 ARP 表里对端 MAC 是不是网关 MAC——是就说明走了三层,别去 VNI-10 里找数据。
1.9 8. 踩坑清单
display l2vpn vsi****(不带 name)偶发空读——必须 display l2vpn vsi name vpna,否则误判「VSI 没建」。
Vsi-interface** 必须先于 vsi 建**——HCL 允许预引用,EVE 镜像不允许,第一遍报 % Wrong parameter,靠三遍下发的第二遍补上。
- VPCS 的 ping 第二个参数不是包数——
ping 10.1.1.10 10000 仍只跑 5 个包。
- 单次 ping 包数别贪多——超出常规数量会被判为洪泛并拒绝,验收用 5~10 包即可。
- 截图必须抢时间窗——10 个包只有 5.6 秒,必须先把拓扑页打开预热,再在 ping 进行中截;等 ping 结束再打开页面必然全 0。
udp[12:3]** 编译不过**——VNI 是 3 字节,BPF 只支持 1/2/4,必须拆 udp[12:2] + udp[14:1]。
- filter 计数是 2 秒窗口(本案例为截图调到 2000 ms,标准值是 500 ms)——零星报文会漏抓,发 5~10 次 ping 再观察。
#00e5ff** 青色不能用**——深色画布上接近默认链路色,改 #ff6d00 橙。
- H3C 镜像上核心链路 ICMP 会亮——与 Cisco IOL 案例「内层不亮」相反,不要照抄别人的结论。
reconcile** 紧跟 edit 会返回 ****applied: None**——plan 缓存没刷新,等 2~3 秒先跑一次 plan 再 reconcile。
1.10 9. 附件
-
topology.yml — eve-iac 拓扑(含 13 条 traffic_filters)
-
configs/default/n_*.cfg — 8 份启动配置
-
figures/ — 拓扑图 + 5 张数据流截图 + filter 面板截图
附件:evpn_1.zip