实验案例:Cisco IOL XE 跑通 VXLAN EVPN(2 spine + 4 leaf + 8 主机,含 10 条流量过滤器)
用免费的 Cisco IOL 镜像搭一套完整的 VXLAN EVPN fabric:2 台 spine 做 EVPN route reflector,4 台 leaf 做 VTEP,8 台主机分属 4 个 VLAN;每台 leaf 都有全部 4 个 SVI,用同一 IP + 同一 MAC 做分布式 anycast 网关,不配 L3 VNI 也能跨子网。完整启动配置与 IaC 拓扑放在附件包,正文只留核心配置、验收判据和踩坑清单。
实测环境:EVE-NG + eve-iac agent 0.9.1;Cisco IOS-XE 17.18.2(IOL,l2-iol-xe-17-18-02.bin);VPCS 1.3 (0.8.1)。
???? 完整预配与 IaC 文件见 §10.1 附件包;第 5 节只列核心行,不要直接拿片段去粘贴。
运行态:三条 ping 同时跑,VXLAN-VNI-10010(72)与 VXLAN-VNI-10030(76)同时点亮,ICMP-Request/Reply 各 112 一一对应;单独跑一组时只有对应的那个 VNI 亮。ARP 三项为 0 是正常的——ARP 表已填满,不再发包。


附件:vxlan-evpn-xe.zip
0. 实测结果
| 项 |
实测结果 |
| Underlay |
OSPF area 0,每台 leaf 两个邻居 FULL,/30 点对点链路 |
| Overlay |
iBGP AS 65000,两台 spine 做 RR;每台 leaf 两条 EVPN 会话 Established、PfxRcd > 0 |
| 控制面 |
每台 leaf:show nve vni4 个 Up,show nve peers3 远端 × 4 VNI = 12 个 Up |
| MAC-IP |
show l2vpn evpn mac ip每台 leaf 8 条,本地主机指向 Et0/x:vlan,远端主机指向对端 VTEP |
| 数据面 |
5 组 ping 全部 5/5;同 VLAN ttl=64,跨 VLAN ttl=63 |
| 可视化 |
10 条 traffic filter 全部通过 libpcap 编译并部署 |
1. 这个实验解决什么
VXLAN EVPN 的教程大多从“两台交换机、一个 VNI”讲起,看完还是不知道真实 fabric 长什么样;而厂商的完整设计文档一上来就是双租户、对称 IRB、ESI 多归,节点多到没法一次看完。这个案例取中间那一档:
- 6 台 IOL,正好是一台普通 PC 能跑满的规模:2 spine + 4 leaf,underlay 和 overlay 都完整;
- 4 个 VLAN 分两个区(A 区 10/20、B 区 30/40),能看到“同一个 VLAN 横跨两台 leaf”和“跨 VLAN 要经过网关”两种路径;
- 刻意不做 L3 VNI:跨子网靠每台 leaf 的 anycast SVI 本地路由,再用目标 VLAN 的 L2 VNI 转发——这是理解“分布式网关到底解决了什么”的最短路径;
- 10 条流量过滤器把 ARP、ICMP、OSPF、BGP、VXLAN 封装和指定 VNI 在拓扑上实时点亮,还能给出“该不亮就不亮”的反证。
跑完这个实验,再回头看 cEOS 那套对称 IRB 双租户,会顺畅很多。
2. 镜像与规格
| 节点 |
角色 |
EVE 模板 |
镜像 |
vCPU / RAM |
网口 |
| SPINE1 / SPINE2 |
EVPN RR(不是 VTEP) |
iol |
l2-iol-xe-17-18-02.bin |
1 / 1024 MB |
Ethernet0/0..0/3 |
| LEAF1 … LEAF4 |
VTEP + 分布式网关 |
iol |
l2-iol-xe-17-18-02.bin |
1 / 1024 MB |
Ethernet0/0..0/3 |
| HOST-A1 … HOST-B4 |
主机 |
vpcs |
EVE 自带 |
— |
eth0 |
注意事项:
- IOL 的 attributes.ethernet 填 1 就得到 4 个口(Ethernet0/0..0/3),不是“1 个口”——这是 IOL 模板自己的 ×4 规则,和 VyOS 那类按个数计的模板不同。
- 镜像必须是支持 VXLAN 的 XE 版本:interface nve1 和 l2vpn evpn 两条命令都能进才算数。15.2 的 l2-adventerprisek9-ms 两条都报 % Invalid input。
- l2-* 是三层交换机镜像(能交换也能路由),不是纯二层交换机;l3-* 是路由器镜像。本实验 leaf 更贴近三层交换机,选 l2-*。
- 节点名必须纯 ASCII。中文节点名在 EVE 往返时会丢字,eve-iac 部署报 invalid_native_format 并静默删库。
确认镜像没拿错,登录任意一台 IOL 执行 show version,应同时看到 Version 17.18.2、System image file is "unix:/opt/unetlab/addons/iol/bin/l2-iol-xe-17-18-02.bin" 和 4 Ethernet interfaces。
3. 拓扑与地址
两台 spine 各用 4 个口接 4 台 leaf;每台 leaf 的 Ethernet0/0 / Ethernet0/1 上联两台 spine,Ethernet0/2 / Ethernet0/3 接两台主机。
| # |
链路 |
类型 |
网段(A 端 / B 端) |
| 1 |
SPINE1 Et0/0↔ LEAF1 Et0/0 |
路由口 |
10.0.1.0/30(.1/.2) |
| 2 |
SPINE1 Et0/1↔ LEAF2 Et0/0 |
路由口 |
10.0.1.4/30(.5/.6) |
| 3 |
SPINE1 Et0/2↔ LEAF3 Et0/0 |
路由口 |
10.0.1.8/30(.9/.10) |
| 4 |
SPINE1 Et0/3↔ LEAF4 Et0/0 |
路由口 |
10.0.1.12/30(.13/.14) |
| 5 |
SPINE2 Et0/0↔ LEAF1 Et0/1 |
路由口 |
10.0.2.0/30(.1/.2) |
| 6 |
SPINE2 Et0/1↔ LEAF2 Et0/1 |
路由口 |
10.0.2.4/30(.5/.6) |
| 7 |
SPINE2 Et0/2↔ LEAF3 Et0/1 |
路由口 |
10.0.2.8/30(.9/.10) |
| 8 |
SPINE2 Et0/3↔ LEAF4 Et0/1 |
路由口 |
10.0.2.12/30(.13/.14) |
| 9 |
LEAF1 Et0/2/Et0/3↔ HOST-A1 / A2 |
access |
VLAN 10 / VLAN 20 |
| 10 |
LEAF2 Et0/2/Et0/3↔ HOST-A3 / A4 |
access |
VLAN 10 / VLAN 20 |
| 11 |
LEAF3 Et0/2/Et0/3↔ HOST-B1 / B2 |
access |
VLAN 30 / VLAN 40 |
| 12 |
LEAF4 Et0/2/Et0/3↔ HOST-B3 / B4 |
access |
VLAN 30 / VLAN 40 |
环回与角色:
| 设备 |
角色 |
Loopback0 |
BGP |
| SPINE1 |
EVPN RR |
10.255.0.1/32 |
AS 65000,无 nve1 |
| SPINE2 |
EVPN RR |
10.255.0.2/32 |
AS 65000,无 nve1 |
| LEAF1 |
VTEP |
10.255.0.11/32 |
AS 65000,与两台 spine 建邻居 |
| LEAF2 |
VTEP |
10.255.0.12/32 |
同上 |
| LEAF3 |
VTEP |
10.255.0.13/32 |
同上 |
| LEAF4 |
VTEP |
10.255.0.14/32 |
同上 |
VLAN / VNI / 网关:
| VLAN |
名称 |
VNI |
子网 |
网关(所有 leaf 相同) |
| 10 |
WEB |
10010 |
10.10.10.0/24 |
10.10.10.1,MAC 0000.5e00.0101 |
| 20 |
APP |
10020 |
10.10.20.0/24 |
10.10.20.1,同 MAC |
| 30 |
DB |
10030 |
10.10.30.0/24 |
10.10.30.1,同 MAC |
| 40 |
OPS |
10040 |
10.10.40.0/24 |
10.10.40.1,同 MAC |
主机地址:
| 主机 |
IP / 24 |
网关 |
VLAN |
接入 |
主机 |
IP / 24 |
网关 |
VLAN |
接入 |
| HOST-A1 |
10.10.10.11 |
.1 |
10 |
LEAF1 Et0/2 |
HOST-B1 |
10.10.30.11 |
.1 |
30 |
LEAF3 Et0/2 |
| HOST-A2 |
10.10.20.11 |
.1 |
20 |
LEAF1 Et0/3 |
HOST-B2 |
10.10.40.11 |
.1 |
40 |
LEAF3 Et0/3 |
| HOST-A3 |
10.10.10.12 |
.1 |
10 |
LEAF2 Et0/2 |
HOST-B3 |
10.10.30.12 |
.1 |
30 |
LEAF4 Et0/2 |
| HOST-A4 |
10.10.20.12 |
.1 |
20 |
LEAF2 Et0/3 |
HOST-B4 |
10.10.40.12 |
.1 |
40 |
LEAF4 Et0/3 |
EVE 连线界面里的端口显示为 e0/0 这类短名,设备内部是 Ethernet0/0,两者是同一个口。
4. 关键设计
- spine 只做 RR,不做 VTEP:两台 spine 上没有 nve1,只跑 OSPF 和 BGP EVPN 反射。VTEP 越少,排错路径越短;spine 宕一台,EVPN 路由由另一台继续反射(本实验未做故障收敛测试)。
- L2 VNI 必须走 EVI:只配 interface nve1 下的 member vni 会出现“BGP 邻居 Established,但 show bgp l2vpn evpn 全空、PfxRcd = 0”。每个 VLAN 都要有 l2vpn evpn instance vlan-based 和 vlan configuration → member evpn-instance。
- ingress-replication,不用组播 underlay:l2vpn evpn 全局配 replication-type ingress,每个 VNI 在 nve1 下配 ingress-replication。拓扑上不需要 PIM,省掉一整层变量。
- **分布式 anycast 网关:同 IP + 同 MAC + no ip proxy-arp**:4 台 leaf 的 Vlan10 都是 10.10.10.1 和 0000.5e00.0101,主机换 leaf 时 ARP 缓存不失效;no ip proxy-arp 防止某台 leaf 用 anycast MAC 代替远端主机应答,破坏 MAC-IP 学习。
- 不配 L3 VNI:跨子网由本地 anycast SVI 路由,再用目标 VLAN 的 L2 VNI 转发。代价是每台 leaf 都要有全部 4 个 SVI;收益是没有 VRF、没有对称 IRB,链路只有一条。
- 用 switchport voice vlan 保活 SVI:每台 leaf 只有 2 个 VLAN 有本地 access 口,另外 2 个 VLAN 在开机时本地没有 up 端口,SVI 会一直是 down;no autostate 拉不起来。把缺失的 VLAN 配成主机口的 voice VLAN,让它本地 active,SVI 就能开机 up,而主机的 untagged 流量仍走 access VLAN。
5. 核心配置(完整预配见附件)
完整逐字的 14 份配置在附件包里(§10.1)。本节只摘核心行说明“这台设备为什么能参与 VXLAN/EVPN”,不要直接拿片段粘贴,复现请用附件里的 configs/default/n_X.cfg。
5.1 SPINE1 / SPINE2(两台同构,只列 SPINE1 的行)
l2vpn evpn
replication-type ingress
router-id Loopback0
!
router bgp 65000
no bgp default ipv4-unicast
address-family l2vpn evpn
neighbor 10.255.0.11 route-reflector-client
neighbor 10.255.0.11 send-community extended
要点:spine **没有 nve1**,只反射 EVPN 路由。show nve vni 在 spine 上会报错,这是对的。
5.2 LEAF1 … LEAF4(四台同构,只列 LEAF1 的行)
ip routing
vtp mode transparent
!
vlan configuration 10
member evpn-instance 10 vni 10010
!
l2vpn evpn instance 10 vlan-based
encapsulation vxlan
replication-type ingress
advertise mac enable
!
interface nve1
no shutdown
source-interface Loopback0
host-reachability protocol bgp
member vni 10010
ingress-replication
!
interface Vlan10
no autostate
no ip proxy-arp
mac-address 0000.5e00.0101
ip address 10.10.10.1 255.255.255.0
vlan 20 / 30 / 40 各重复一遍(EVI 号 = VLAN 号,VNI 号见 §3),四台 leaf 的 SVI 地址和 MAC 完全相同。
5.3 主机口:voice VLAN 保活
interface Ethernet0/2
switchport mode access
switchport access vlan 10
switchport voice vlan 30
spanning-tree portfast
LEAF1/LEAF2 的主机口补 VLAN 30/40,LEAF3/LEAF4 补 VLAN 10/20。**必须 switchport mode access**:IOL 的 trunk 口不接收 VPCS 的 untagged 流量。
5.4 VPCS 主机(完整两行)
set pcname HOST-A1
ip 10.10.10.11/24 10.10.10.1
VPCS 的启动脚本不是 Cisco CLI:主机名要 set pcname NAME,地址行是 ip ADDR/MASK GATEWAY,**ip 行不要加 set**。
6. 复现步骤
6.1 手工 EVE(不需要 eve-iac)
- 新建 lab,按 §2 建 6 台 iol + 8 台 vpcs;IOL 的 Ethernet 数量填 1(4 个口)。
- 按 §3 连 16 条链路:spine 用 Et0/0..0/3 接 4 台 leaf,leaf 用 Et0/0/0/1 上联、Et0/2/Et0/3 接主机。
- 把附件里 configs/default/n_1.cfg … n_14.cfg 分别粘进对应节点的 Startup Config。
- 对 6 台 IOL 执行 Wipe,再 Start——顺序不能反(原因见 §8.3)。
- 启动后按 §7 逐项验收。手工粘贴配置时,务必先 vtp mode transparent,再写 vlan 块。
6.2 IaC 一键复现(eve-iac)
目录结构与 .eve-iac.yml:
vxlan-evpn-xe/
├── .eve-iac.yml
├── topology.yml
└── configs/default/n_1.cfg … n_14.cfg
version: 1
topology: topology.yml
eve:
lab: /IaC/vxlan-evpn-xe.unl
topology.yml、.eve-iac.yml 与 14 份配置都在附件包里。MCP 调用顺序:
eve_iac_status # 确认工程被发现,mode=create
eve_iac_validate # 拓扑 + 10 条 BPF 表达式编译
eve_iac_plan # 首次应为 create
eve_iac_deploy replace=true # 建 lab
eve_iac_start # 启动全部节点
两条工具边界:eve_iac_deploy 返回 timeout 多半是假失败,先 inspect refresh=true 看结果再决定是否重试;0.9.1 下改启动配置后 reconcile 只上传不激活,**要生效必须手动 stop → wipe → start**(wipe 需明确授权)。
7. 验收判据
7.1 Underlay
show ip ospf neighbor
期望每台 leaf 两个 FULL/ -(对端 10.0.1.1、10.0.2.1),spine 侧看到 4 个 FULL。show ip route 里应能看到其他所有设备的 10.255.0.x/32 环回。
7.2 Overlay 控制面
show bgp l2vpn evpn summary
期望两台邻居 Established、PfxRcd > 0(实测 24 = 3 台远端 leaf × 每台 8 条;主机上下线时会掉,不要死记数字)。
show nve vni
show nve peers
期望 show nve vni 4 个 VNI 全 Up;show nve peers 每个 VNI 都有 3 个远端 VTEP,共 12 个 Up。
show l2vpn evpn mac ip
期望 8 条主机记录:本地主机 Next Hop 是 Et0/2:10 / Et0/3:20(接口:VLAN),远端主机是对端 VTEP 的环回(10.255.0.12/13/14)。这 8 条齐全,说明 type-2 路由已经跨 leaf 交换完成。
7.3 数据面:TTL 是最便宜的判据
验收全部在 VPCS 上做,不要用 IOL 自己 ping 自己。
| 源 |
目的 |
路径 |
预期 |
判据 |
| HOST-B1 |
10.10.30.12(HOST-B3) |
同 VLAN 30,LEAF3 → LEAF4 |
5/5 |
**ttl=64**:纯二层桥接 |
| HOST-B1 |
10.10.40.12(HOST-B4) |
跨 VLAN 30 → 40,LEAF3 → LEAF4 |
5/5 |
**ttl=63**:恰好一跳 |
| HOST-B1 |
10.10.40.11(HOST-B2) |
跨 VLAN,同 LEAF3 |
5/5 |
ttl=63 |
| HOST-B1 |
10.10.10.11(HOST-A1) |
跨 VLAN 30 → 10,LEAF3 → LEAF1 |
5/5 |
ttl=63 |
| HOST-B3 |
10.10.30.11(HOST-B1) |
同 VLAN 反向 |
5/5 |
ttl=64 |
HOST-B1> ping 10.10.30.12 -c 5
84 bytes from 10.10.30.12 icmp_seq=1 ttl=64 time=1.726 ms
...
HOST-B1> ping 10.10.40.12 -c 5
84 bytes from 10.10.40.12 icmp_seq=1 ttl=63 time=3.566 ms
...
同 VLAN 出现 63,说明它被某个 SVI 路由了一次,路径就不对了。TTL 比“ping 通”精确得多。
7.4 Traffic filters:该亮什么、该不亮什么
10 条过滤器(timeout 全部 500 ms):
| # |
标题 |
表达式 |
颜色 |
| 1 |
ARP-Request |
(arp and arp[6:2] = 1) or (vlan and arp and arp[6:2] = 1) |
#00e5ff |
| 2 |
ARP-Reply |
(arp and arp[6:2] = 2) or (vlan and arp and arp[6:2] = 2) |
#76ff03 |
| 3 |
ICMP-Request |
(icmp[0] == 8) or (vlan and icmp[0] == 8) |
#ff4081 |
| 4 |
ICMP-Reply |
(icmp[0] == 0) or (vlan and icmp[0] == 0) |
#651fff |
| 5 |
OSPF-Hello |
(ip proto 89 and ip[21] = 1) or (vlan and ip proto 89 and ip[21] = 1) |
#ffd600 |
| 6 |
BGP-EVPN |
(tcp port 179) or (vlan and tcp port 179) |
#ff6d00 |
| 7 |
VXLAN-All |
(udp port 4789) or (vlan and udp port 4789) |
#00b8d4 |
| 8 |
VXLAN-VNI-10010 |
(udp port 4789 and udp[12:2] = 0x0027 and udp[14:1] = 0x1a) or (vlan and udp port 4789 and udp[12:2] = 0x0027 and udp[14:1] = 0x1a) |
#c6ff00 |
| 9 |
VXLAN-VNI-10030 |
(udp port 4789 and udp[12:2] = 0x0027 and udp[14:1] = 0x2e) or (vlan and udp port 4789 and udp[12:2] = 0x0027 and udp[14:1] = 0x2e) |
#ff00e5 |
| 10 |
VXLAN-Inner-ARP |
(udp port 4789 and udp[28:2] = 0x0806) or (vlan and udp port 4789 and udp[28:2] = 0x0806) |
#ffab00 |
在 EVE 的 Traffic Filters 面板里,期望看到:
| 观察位置 |
应亮 |
说明 |
| 接入链路(leaf ↔ 主机) |
ARP-Request/Reply、ICMP-Request/Reply |
主机帧不打标,VLAN 变体那半段不匹配 |
| underlay 链路(spine ↔ leaf) |
OSPF-Hello、BGP-EVPN、VXLAN-All |
BGP keepalive 间隔长,高亮只闪一下 |
| 同 VLAN ping(B1 → B3) |
VXLAN-VNI-10030亮,**VXLAN-VNI-10010不亮** |
二层流量只在 VLAN 30 的 VNI 里走 |
| 跨 VLAN ping(B1 → A1) |
VXLAN-VNI-10010亮,VXLAN-VNI-10030不亮 |
网关路由后,帧进了目标 VLAN 的 VNI |
| 任一次首次 ping |
VXLAN-Inner-ARP亮 |
ARP 请求被泛洪进 VXLAN |
| underlay 链路 |
ICMP-Request/Reply不亮 |
最漂亮的一条反证:ICMP 已被封进 UDP 4789,外层协议号是 17,icmp[]匹配不到 |
命中次数只能在 EVE 面板看,MCP 没有读通道。500 ms 窗口下零星报文可能漏抓,发 5–10 次 ping 再观察。
BPF 写法注意:这些是 classic libpcap/tcpdump 语法,不是 Wireshark 显示过滤器;proto[offset:size] 的 size 只能是 1/2/4,所以 VNI 必须拆成 udp[12:2] + udp[14:1](udp[12:3] 编译不过);VLAN 变体必须加括号,and/or 同级左结合,vlan and A or B 只会让 vlan 约束 A;OSPF 类型字节在 ip[21] 而不是 ip[20]。
7.5 判据的边界
- 不要只凭 ping 判断成功:show l2vpn evpn mac ip 的 8 条记录和 show nve peers 的 12 个 Up 才是控制面真的工作了的证据。
- show ip interface brief 会多出一个 Tunnel0,IP 与 Loopback0 相同并 up/up——这是 XE 为 VXLAN 自动生成的,不是配错。
- show interfaces nve1 的计数器恒为 0,隧道 MAC 也不进普通 MAC 表;这是 IOL 的实现限制,不是隧道没通。
8. 踩坑清单(按“会骗到你”的程度排序)
8.1 镜像不对:15.2 的 adv 镜像根本没有 VXLAN/EVPN ★最根本
interface nve1 和 l2vpn evpn 两条命令都报 % Invalid input detected at '^' marker。不是配置写错,是镜像没有这个功能。 判断方法只有一个:进全局配置敲这两条,都能进才算支持。不要看版本号或文件名猜。
8.2 L2 VNI 只配 member vni 不出路由 ★
只在 interface nve1 下写 member vni 10010 + ingress-replication,会得到:**BGP 会话 Established,但 show bgp l2vpn evpn 全空、PfxRcd = 0**。必须补 EVI(l2vpn evpn instance + vlan configuration → member evpn-instance)。这是最容易“看起来配了其实没配”的一处:underlay 健康、会话健康,只有 overlay 是空的。
8.3 vlan.dat 跨 stop/start 保留,会毒化启动解析 ★
同一份启动配置,在旧 vlan.dat 上 stop → start:vlan 块名字不更新(VLAN0010 而不是 WEB),switchport voice vlan 行直接从 running-config 消失;wipe 后 start 则 100% 正确。所以首次导入配置后要 wipe 再 start,改过 VLAN 结构后也要 wipe 再 start。用 stop+start 验证预配配置,只会得到“配置没生效”的假象。
8.4 必须 vtp mode transparent,否则 VLAN 块被静默吞掉 ★
IOL 默认 VTP Server 模式,启动配置里的 vlan 10 / name WEB 整块可能被静默丢弃:VLAN 不存在,但接口下的 switchport access vlan 10 却留着。症状是 show vlan brief 里没有 VLAN 10、主机完全不通。验证用 show vtp status,应显示 Transparent。
8.5 no autostate 救不了“开机时没有 up 端口”的 SVI ★
每台 leaf 只有 4 个 VLAN 里的 2 个有 access 口,另外 2 个的 SVI 在创建瞬间本地没有 active 端口 → 初始 down;no autostate 是运行态属性,拉不起已经 down 的 SVI。反过来在启动配置里写 shutdown + no shutdown 想“手动拉一把”,解析时会被合并,也无效。唯一稳妥的解法是 switchport voice vlan <缺失 VLAN>。
于是 show vlan brief 会看到“反直觉”的一幕:LEAF1 的 Et0/2 是 access VLAN 10,却同时关联 VLAN 30。这是故意的,不是配错。
8.6 IOL 的 trunk 口不接受 VPCS 的 untagged 流量 ★
主机口配成 switchport mode trunk + native VLAN + portfast trunk:SVI 全 up,但接在该口的 VPCS 完全不通,接口输入计数为 0。改回 switchport mode access 立刻恢复。VPCS 不打标签,IOL 的 trunk 口也不收 untagged 入向帧——主机口只能 access。
8.7 anycast 网关三件套缺一不可 ★
同 IP、同 MAC(0000.5e00.0101)、no ip proxy-arp。少 MAC,主机换 leaf 后 ARP 缓存失效;少 no ip proxy-arp,某台 leaf 可能用自己的 anycast MAC 代替远端主机应答,把“远端主机自己的 ARP 应答”变成“网关代理应答”,破坏 MAC-IP 学习的判据。
8.8 权限级别:show running-config / ping source 要先 enable
show running-config 在 LEAF1>(user exec)下报 Invalid input,不是镜像坏了,只是权限不够;ping 带 source / repeat、clear arp-cache 同样只在特权模式可用。在 user exec 下测出的“这命令不存在”结论全都不可信。
8.9 BGP EVPN 的三个必配项
address-family l2vpn evpn + activate(否则不交换 EVPN 路由)、send-community extended(否则扩展团体传不过去)、spine 上的 route-reflector-client(leaf 只与 spine 建邻居,没有 RR 配置 leaf 之间收不到彼此的路由)。另外:l2vpn evpn 下的 router-id 要写接口名 Loopback0 而不是 IP;nve1 的 source-interface 只接受 Loopback;host-reachability protocol bgp 不能漏。
8.10 三个容易漏的单行配置
| 漏了 |
症状 |
leaf 上的 ip routing |
SVI 有地址但不转发,跨 VLAN 完全不通 |
uplink 上的 no switchport |
口还是二层口,IP 配不进去,OSPF 起不来 |
uplink 上的 ip ospf network point-to-point |
OSPF 选 DR/BDR,收敛行为与预期不符 |
8.11 VPCS 的语法与控制台有损
set pcname HOST-A1 的 set 不能漏,漏了报 unknown VPCS command,而且会让整批 config_edit 原子失败(同批其他节点配置一起不落盘)。控制台偶尔整条空读、或只把最后一行吞进提示符、或报 Bad command: "pipe2 failed";对策是以“读到的内容是否满足预期”作判据,不满足就退避重读,连续失败对这台 VPCS 做一次 stop → start(不用 wipe)。
8.12 排障顺序
从下往上查,不要一上来就怀疑 VXLAN:① 镜像能不能进 nve1 / l2vpn evpn(§8.1)→ ② show ip interface brief 的 uplink 和 SVI 是否 up/up → ③ show ip ospf neighbor 是否 FULL → ④ show bgp l2vpn evpn summary 是否 Established、PfxRcd > 0 → ⑤ show nve vni / show nve peers → ⑥ show l2vpn evpn mac ip 是否 8 条 → ⑦ 最后才在 VPCS 上 ping 看 TTL。
9. 已知限制
- 没有 L3 VNI / 对称 IRB:刻意。跨子网靠每台 leaf 的 anycast SVI 本地路由 + L2 VNI 转发,不覆盖 VRF-aware EVPN。
- 没有 EVPN 多归属 / ESI:每台主机只挂一台 leaf,练不了 all-active 和别名 MAC。
- 没有做故障收敛测试:拓扑有双 uplink 冗余,但没测过挂掉一台 spine 的收敛时间。
- 没验 VXLAN MTU / 分片:全是小包 ping,撞不到 underlay MTU 边界。
- 只有 2 个 VNI 配了专用过滤器:10010 / 10030 作代表;10020 / 10040 照抄改 udp[14:1] 为 0x24 / 0x38 即可。
- IOL 的 NVE 计数器不可用:恒为 0,只能用控制面表验证。
- 版本敏感:实测基于 IOS-XE 17.18.2;其他版本请先确认 interface nve1 与 show l2vpn evpn mac ip 的输出格式。
10. 附录
10.1 A. 附件包(完整预配 + IaC)
完整配置与 IaC 文件打包为 **vxlan-evpn-xe.zip**(约 228 KB)。下载方式(发布时替换):
???? <TODO:网盘链接 / 公众号自动回复关键字 / 阅读原文>
包内结构:
vxlan-evpn-xe/
├── README.md # 文件清单、双路径复现、校验方法
├── .eve-iac.yml # 工程描述符(eve.lab 需改成你的路径)
├── topology.yml # 14 节点 / 16 链路 / 10 条 traffic_filters
├── topology.png # 拓扑图(2560×1440)
└── configs/default/
├── n_1.cfg … n_6.cfg # SPINE1/2、LEAF1..4
└── n_7.cfg … n_14.cfg # HOST-A1..A4、HOST-B1..B4
配置文件 SHA-256(按原始字节计算,无结尾换行,与 eve_iac_config index 一致):
| 文件 |
字节 |
SHA-256 |
n_1.cfg |
1915 |
d16b1db7e41b6530a6774112c2334857f61717ece019d3de4f649d296f30f100 |
n_2.cfg |
1915 |
95365555a3f1524871156675f091882058351358ef2813817c29d0001753757e |
n_3.cfg |
2914 |
493b41e3533f8105002f111e9ee57f5b89ab8ddd4b9b26e2369c64371c3f28ee |
n_4.cfg |
2914 |
d8bc3d3abc31e017ad19082b7e71e4ba2b7c85cbb78b6d04b7a4e267d81ed8fb |
n_5.cfg |
2916 |
12b1553e55a1429a787fd5c71858e0f7b12df117b933ff6dbabdd30633e1ba1c |
n_6.cfg |
2916 |
f9dad2c1c78a06cb8465b5be6414f9147115897ec39b8378ed0ad473fcfee165 |
n_7.cfg |
47 |
3f1b83dcdcc6a3206d35a9cfc037022ec2da94ffbea4ed48ca7b656ead203f64 |
n_8.cfg |
47 |
a7083c29d157c5519cc41e9f7125409a1b602c8333e22ecf0e77c633b493b9a8 |
n_9.cfg |
47 |
8f12c31fb669170472f7d2b9594bcab0d07daca679b6f7b3a14978b342e265f6 |
n_10.cfg |
47 |
293ba9b28d61c4991b9dc3a5b882759edcc9e8d97815fdc229749e66f3c8878f |
n_11.cfg |
47 |
2dc96240376b3b8082f62c5a8b653acb88305728a9bd63879666a8b635e0f94a |
n_12.cfg |
47 |
59ab615593c81e5ee162851e5e10f420c819e6207fc8f40f8fc4b013fe6aa778 |
n_13.cfg |
47 |
2b71aa599606c5f865b75655120713643093240539316aaa1f16f7fb60153980 |
n_14.cfg |
47 |
14aee65642123725a74110df7b1bc2fc516879851f425b03b94a132e872ea19e |
下载后核对(PowerShell):Get-FileHash .\configs\default\n_1.cfg -Algorithm SHA256。
10.2 B. topology.yml 结构
完整 topology.yml 在附件包里,核心结构如下(省略部分节点、链路与 filter):
version: eve-iac/v1
name: vxlan-evpn-xe
configsets:
default:
n_1: configs/default/n_1.cfg
# n_2 … n_14 同理
nodes:
n_1:
name: SPINE1
template: iol
image: l2-iol-xe-17-18-02.bin
configset: default
icon: Router-2D-Cat-Blue-S.svg
position: {x: 450, y: 80}
attributes: {delay: 0, disable_offload: false, ethernet: 1, keepalive: false,
nvram: 1024, ram: 1024, serial: 0}
# n_2 … n_14 同理
links:
- endpoints: - {node: n_1, interface: e0/0}
- {node: n_3, interface: e0/0}
# 其余 15 条链路同理
traffic_filters:
filter_1:
title: ARP-Request
expr: "(arp and arp[6:2] = 1) or (vlan and arp and arp[6:2] = 1)"
color: "#00e5ff"
timeout: 500
enabled: 1
# filter_2 … filter_10 见 §7.4
10.3 C. MCP 调用序列(对照用)
eve_iac_status
eve_iac_validate
eve_iac_plan
eve_iac_deploy replace=true
eve_iac_start
eve_iac_console_exec {node: "n_3", command: "show bgp l2vpn evpn summary"}
eve_iac_console_exec {node: "n_3", command: "show nve peers"}
eve_iac_console_exec {node: "n_3", command: "show l2vpn evpn mac ip"}
eve_iac_console_exec {node: "n_11", command: "ping 10.10.30.12 -c 5"}
10.4 D. 版本与验证记录
- 2026-10-18:首次搭建并实测。IOS-XE 17.18.2(IOL XE)、VPCS 1.3、eve-iac agent 0.9.1。
- 2026-11-01:按《实验案例发布工作流》重排为发布版;正文只保留核心配置,完整预配、topology.yml、.eve-iac.yml、拓扑图打包进 vxlan-evpn-xe.zip。
- 验证:eve_iac_plan 为 no changes;10 条 filter 全部编译通过;14 份配置的字节数与 SHA-256 与 eve_iac_config index 逐一核对一致。
- 实测通过:OSPF FULL、EVPN Established、nve peers 12 个 Up、MAC-IP 8 条、5 组 ping 5/5(ttl=64 / ttl=63)。