第176篇:EVPN 多归(Multi-homing)与 DF 选举
关键词:多归属、Ethernet Segment、ESI、DF选举、Active VTEP、Standby VTEP、Ingress Replication
一、引言
在传统 VPLS 中,CE 设备只能通过单一 PE 接入(Single-homing),一旦该 PE 或连接链路故障,CE 将失去网络连接。EVPN 原生支持 CE 的多归属(Multi-homing)——将 CE 同时连接到多个 VTEP(属于同一个 Ethernet Segment),实现设备级和链路级的冗余保护。在多归属场景下,DF(Designated Forwarder)选举决定了哪个 VTEP 负责主动转发广播/未知单播/组播流量,避免重复流量和环路。
二、核心概念
2.1 Ethernet Segment(ES)
Ethernet Segment 是 EVPN 多归属的基础概念,表示一组连接到同一 CE 的 VTEP 接口集合:

2.2 ESI(Ethernet Segment Identifier)
ESI 是 Ethernet Segment 的全局唯一标识符(20字节):
| 组成部分 | 长度 | 说明 |
|---|---|---|
| Flag | 1字节 | 标记位 |
| Length | 1字节 | ESI 长度 |
| Administrator | 可变 | 管理员空间(如 AS 号) |
| Assigned Number | 可变 | 分配编号 |
ES 规则:同一 ES 下的所有 VTEP 必须配置完全相同的 ESI。
2.3 DF(Designated Forwarder)选举
DF 负责代表 ES 转发广播、未知单播和组播(BUM)流量,防止重复:
| 角色 | 说明 |
|---|---|
| DF(指定转发器) | ES 中唯一转发 BUM 流量的 VTEP |
| Non-DF | ES 中不转发 BUM 流量的 VTEP |
DF 选举规则: 1. 比较 VTEP 的 System ID(Router ID),值最小的为 DF 2. 可通过 Type 1 路由中的优先级字段影响选举 3. DF 选举在 ES 内部进行,各 ES 独立选举
2.4 多归属切换模式
| 模式 | 说明 | 切换时间 |
|---|---|---|
| All-Active | 所有 VTEP 同时转发已知单播 | 无切换(同时Active) |
| Active-Standby | 仅 Active VTEP 转发所有流量 | 毫秒级(依赖检测) |
2.5 ESI 标签(ESI Label)
在 All-Active 多归中,PE 向远端发送 BUM 流量时携带 ESI Label 标识来源,使远端 PE 能够识别该 BUM 流量来自哪个 ES,避免将 BUM 流量发回同一 ES 造成环路。
ESI Label 的运作机制:
| 场景 | 行为 | 结果 |
|---|---|---|
| PE1 收到 CE1 广播帧 | PE1 向外发送 BUM,携带 ESI Label = ESI-1 | 远端 PE 知道来源是 ESI-1 |
| PE3 收到 PE1 的 BUM | PE3 检查 ESI Label,发现来源 = ESI-1 | PE3 不将 BUM 发回 ESI-1 下的任何 AC 接口 |
| PE3 需要将 BUM 转发到 ESI-2 | PE3 正常转发到 ESI-2 的 DF | ESI-2 的 DF 将 BUM 发给 CE2 |
MPLS 承载时的 ESI Label 栈结构:
| 层级(从外到内) | 标签名称 | 说明 |
|---|---|---|
| 外层 | IMI Label | 跨域 MPLS 隧道标签,用于在不同域之间转发 |
| 中层 | BD Label | Bridge Domain 标签,标识所属的广播域 |
| 内层 | ESI Label | 标识来源 ES,仅在 BUM 流量中携带,用于去重 |
| 载荷 | Ethernet Frame | 原始客户帧 |
VXLAN 承载时:ESI 信息通过 Type 2 MAC 路由的 ESI 属性传递,接收方根据 MAC 路由中的 ESI 信息判断是否应该向某个 ES 转发。
2.6 水平分割(Intra-ES Replication Prevention)
All-Active 模式下,CE 发出的 BUM 流量会被同一 ES 下的所有 PE 收到。如果每个 PE 都向外转发,远端 PE 会收到重复帧;更严重的是,远端 PE 将 BUM 回传给 ES 时,同一 ES 下的所有 PE 都会向 CE 转发,导致 CE 收到多份相同帧。
水平分割解决两个方向的重复问题:
| 方向 | 问题 | 解决机制 |
|---|---|---|
| CE→远端 | PE1 和 PE2 都收到 CE1 的广播,都外发 | 远端 PE 使用 ESI Label 去重 |
| 远端→CE | PE3 向所有 ES 成员(PE1 和 PE2)发送 BUM | 只有 DF 向 CE 转发,Non-DF 丢弃 |
2.7 分裂脑(Split Brain)问题
如果同一 ES 下的 VTEP 之间 BGP 会话中断,但两者都认为自己仍在正常运作,就会产生分裂脑——两台 PE 都认为自己是唯一的 DF,同时向 CE 转发 BUM 流量。

| 检测方法 | 说明 | 检测时间 |
|---|---|---|
| ES KeepAlive | 同一 ES 下的 PE 直连链路周期性发送 KeepAlive | 秒级 |
| BFD for BGP | 加速 BGP 会话故障检测 | 毫秒级 |
| Type 4 路由过期 | Type 4 路由在 BGP 中老化后触发 DF 重新选举 | 分钟级 |
最佳实践:部署 ES KeepAlive + BFD for BGP,实现毫秒级分裂脑检测。
2.8 Active/Standby 模式详解
All-Active 虽好,但以下场景需用 Active/Standby:
| 场景 | 原因 |
|---|---|
| CE 不支持 LACP/多活 | 老旧设备不支持链路聚合 |
| 避免 MAC 漂移 | 单活模式下 MAC 位置固定 |
| CE-PE 链路带宽不对称 | 主备模式管理更简单 |
Active/Standby 通过 ES 路由控制:Active PE 正常转发所有流量,Standby PE 不转发任何流量。Active PE 故障时,Standby PE 感知 ES 路由变化后自动切换为 Active。
# 强制 Standby 模式
[EVPN-MH-PE2] bridge ethernet-segment 1
[EVPN-MH-PE2-ethernet-segment-1] df-mode standby
# 该 PE 永远不参与 DF 选举
2.9 DF 选举算法
| 算法 | 说明 | 特点 |
|---|---|---|
| Default(Modulo-based) | 基于 IP 排序取模 | 标准算法,自动负载均衡 |
| Preference-based | 通过配置优先级决定 | 手动控制 DF 归属 |
| Highest Random Weight | 随机权重分配 | 分布更均匀 |
Modulo-based 算法详解:对 ES 下所有 PE 按 Loopback IP 排序(从小到大),不同 BD 的 DF 按取模分配:
示例(2 个 PE,4 个 BD):
PE1 (10.1.1.1) → IP 较小 → 索引 0
PE2 (10.1.2.1) → IP 较大 → 索引 1
BD10 → DF = PE1 (10 mod 2 = 0)
BD20 → DF = PE2 (20 mod 2 = 0, 但从索引1开始)
BD30 → DF = PE1
BD40 → DF = PE2
→ 不同 BD 有不同的 DF,实现负载均衡!
三、技术细节
3.1 多归属数据转发流程

3.2 Type 1 路由(ES 路由)
Type 1 路由用于通告 ES 信息,包含:
| 字段 | 说明 |
|---|---|
| ESI | Ethernet Segment Identifier |
| Flags | ES 状态标志 |
| MAC Address | ES 上学习的 MAC 地址(可选) |
Type 1 路由的作用: - 告知远端 VTEP 该 ES 的存在和成员 - 携带 ES 上学习的 MAC 地址列表 - 支持 DF 选举(通过优先级字段)
3.3 Type 4 路由(ES-Route,用于 DF 选举)
Type 4 路由是 DF 选举的核心机制。每个 ES 成员 PE 发布一条 Type 4 路由:
| 字段 | 说明 |
|---|---|
| Route Type | 0x04(ES-Route) |
| Route Distinguisher | PE 的 RD |
| ESI | Ethernet Segment Identifier |
| IP Address | 发布 PE 的 Loopback 地址(或 Router ID) |
| Flags | ESI Flags(多归模式标志) |
| Ethernet | Auto-Detection、Default-Gateway 等可选标志 |
Type 4 路由与 DF 选举的关系:
PE1 发布 Type 4: RD=100:PE1, ESI=0000.0000.0000.0000.0001, IP=10.1.1.1
PE2 发布 Type 4: RD=100:PE2, ESI=0000.0000.0000.0000.0001, IP=10.1.2.1
PE1 收到 PE2 的 Type 4 → 收集 ES 所有成员 → 执行 DF 选举
PE2 收到 PE1 的 Type 4 → 收集 ES 所有成员 → 执行 DF 选举
→ 双方选举结果一致(确定性算法),不会出现冲突
Per-VNI DF 选举:DF 选举不是全局的,而是针对每个 VNI(BD)独立进行。同一 ES 下: - BD10 的 DF 可能是 PE1 - BD20 的 DF 可能是 PE2 - 实现跨 BD 的 BUM 流量负载均衡
3.3 多归属故障切换

四、实战配置/案例分析
4.1 完整多归属配置(含 BFD 和 KeepAlive)
# ========== VTEP1 ==========
[EVPN-MH-PE1] sysname EVPN-MH-PE1
[EVPN-MH-PE1] ipv4 route-static 0.0.0.0 0.0.0.0 10.0.0.1
# BGP EVPN 配置
[EVPN-MH-PE1] bgp 65001
[EVPN-MH-PE1-bgp] router-id 10.1.1.1
[EVPN-MH-PE1-bgp] address-family ipv4 vpnv4
[EVPN-MH-PE1-bgp-ipv4-vpnv4] peer 10.1.2.1 route-reflector-client
[EVPN-MH-PE1-bgp-ipv4-vpnv4] peer 10.1.2.1 connect-interface LoopBack 0
[EVPN-MH-PE1-bgp-ipv4-vpnv4] peer 10.1.2.1 as-number 65002
[EVPN-MH-PE1-bgp-ipv4-vpnv4] peer 10.1.2.1 bfd enable
[EVPN-MH-PE1-bgp] address-family l2vpn evpn
[EVPN-MH-PE1-bgp-l2vpn-evpn] peer 10.1.2.1 route-reflector-client
[EVPN-MH-PE1-bgp-l2vpn-evpn] peer 10.1.2.1 connect-interface LoopBack 0
[EVPN-MH-PE1-bgp-l2vpn-evpn] peer 10.1.2.1 as-number 65002
[EVPN-MH-PE1-bgp-l2vpn-evpn] peer 10.1.2.1 bfd enable
# Ethernet Segment 配置
[EVPN-MH-PE1] bridge ethernet-segment 1
[EVPN-MH-PE1-ethernet-segment-1] description ES-for-CE1
[EVPN-MH-PE1-ethernet-segment-1] esi 0000.0000.0000.0000.0001
[EVPN-MH-PE1-ethernet-segment-1] priority 32768
[EVPN-MH-PE1-ethernet-segment-1] interface 100ge 1/0/1
[EVPN-MH-PE1-ethernet-segment-1] interface 100ge 1/0/2
# 配置 ES KeepAlive(防分裂脑)
[EVPN-MH-PE1] bridge ethernet-segment 1
[EVPN-MH-PE1-ethernet-segment-1] keepalive timer 10 30
# KeepAlive 间隔10ms,超时30ms
# VXLAN VNI
[EVPN-MH-PE1] vxlan vni 1000
[EVPN-MH-PE1-vxlan-vni-1000] route-distinguisher 10.1.1.1:1000
[EVPN-MH-PE1-vxlan-vni-1000] route-target both evpn 1000:1000
[EVPN-MH-PE1-vxlan-vni-1000] vxlan-source-interface LoopBack 0
# ========== VTEP2 ==========
[EVPN-MH-PE2] sysname EVPN-MH-PE2
[EVPN-MH-PE2] ipv4 route-static 0.0.0.0 0.0.0.0 10.0.0.1
[EVPN-MH-PE2] bgp 65002
[EVPN-MH-PE2-bgp] router-id 10.1.2.1
[EVPN-MH-PE2-bgp] address-family ipv4 vpnv4
[EVPN-MH-PE2-bgp-ipv4-vpnv4] peer 10.1.1.1 route-reflector-client
[EVPN-MH-PE2-bgp-ipv4-vpnv4] peer 10.1.1.1 connect-interface LoopBack 0
[EVPN-MH-PE2-bgp-ipv4-vpnv4] peer 10.1.1.1 as-number 65001
[EVPN-MH-PE2-bgp-ipv4-vpnv4] peer 10.1.1.1 bfd enable
[EVPN-MH-PE2-bgp] address-family l2vpn evpn
[EVPN-MH-PE2-bgp-l2vpn-evpn] peer 10.1.1.1 route-reflector-client
[EVPN-MH-PE2-bgp-l2vpn-evpn] peer 10.1.1.1 connect-interface LoopBack 0
[EVPN-MH-PE2-bgp-l2vpn-evpn] peer 10.1.1.1 as-number 65001
[EVPN-MH-PE2-bgp-l2vpn-evpn] peer 10.1.1.1 bfd enable
[EVPN-MH-PE2] bridge ethernet-segment 1
[EVPN-MH-PE2-ethernet-segment-1] esi 0000.0000.0000.0000.0001
[EVPN-MH-PE2-ethernet-segment-1] priority 32768
[EVPN-MH-PE2-ethernet-segment-1] interface 100ge 1/0/1
[EVPN-MH-PE2-ethernet-segment-1] keepalive timer 10 30
[EVPN-MH-PE2] vxlan vni 1000
[EVPN-MH-PE2-vxlan-vni-1000] route-distinguisher 10.1.2.1:1000
[EVPN-MH-PE2-vxlan-vni-1000] route-target both evpn 1000:1000
[EVPN-MH-PE2-vxlan-vni-1000] vxlan-source-interface LoopBack 0
4.2 All-Active vs Active-Standby 转发行为对比
| 维度 | All-Active | Active-Standby |
|---|---|---|
| 已知单播 CE→远端 | 两个 VTEP 都可接收并转发 | 只有 Active 转发 |
| 已知单播 远端→CE | 远端选择最优 VTEP 转发 | 只发往 Active VTEP |
| BUM CE→远端 | 两个 VTEP 都收到,仅 DF 外发 | 只有 Active 接收并转发 |
| BUM 远端→CE | 远端仅发往 DF | 远端仅发往 Active |
| 带宽利用率 | 双链路同时利用 | 备链路闲置 |
| 切换时间 | DF 切换(毫秒级) | Active 切换(毫秒级) |
| MAC 表稳定性 | 可能出现 MAC 漂移 | MAC 位置固定 |
4.3 验证多归属状态
# 查看ES状态
<EVPN-MH-PE1> display ethernet-segment 1
Ethernet-Segment: 1
ESI: 0000.0000.0000.0000.0001
Priority: 32768
State: Active
DF: Local (Router-ID: 10.1.1.1 < 10.1.2.1)
Members:
10.1.1.1 (Local, Active)
10.1.2.1 (Remote, Active)
# 查看Type1路由
<EVPN-MH-PE1> display bgp evpn routing-table type 1
*> RD: 10.1.1.1:1000
ESI: 0000.0000.0000.0000.0001
Flags: All-Active
MACs: 00:11:22:33:44:55
# 查看DF状态
<EVPN-MH-PE1> display evpn df
VNI: 1000
ES: 0000.0000.0000.0000.0001
DF: 10.1.1.1 (Local)
4.4 故障排查:多归属后CE通信中断
故障场景:CE 双归属部署后,网络出现环路或流量丢失。
# Step 1: 检查ES配置一致性
<EVPN-MH-PE1> display ethernet-segment 1
ESI: 0000.0000.0000.0000.0001
<EVPN-MH-PE2> display ethernet-segment 1
ESI: 0000.0000.0000.0000.0001
# ESI一致, 正常
# Step 2: 检查DF选举
<EVPN-MH-PE1> display evpn df
DF: 10.1.1.1 (Local)
<EVPN-MH-PE2> display evpn df
DF: 10.1.1.1 (Remote)
# DF选举一致, 正常
# Step 3: 检查MAC路由
<EVPN-MH-PE1> display bgp evpn routing-table type 2
# 发现: 同一MAC地址从两个VTEP通告
# 根因: CE侧交换机未正确运行链路聚合(LACP)
# CE侧将同一MAC的流量从两个端口发出, 导致两个VTEP都学习到MAC
# Step 4: 检查CE侧LACP
<CE> display link-agency aggregation 1
# 发现LACP未启用或未协商成功
# 修正: 在CE侧启用LACP
4.5 常见故障汇总
| 故障现象 | 可能根因 | 排查命令 | 修复方法 |
|---|---|---|---|
| CE 无法通信 | ESI 不匹配 | display ethernet-segment | 统一 ESI 值 |
| CE 收到重复帧 | 分裂脑 | display evpn df | 检查 BGP/BFD 会话 |
| 单链路失效无切换 | DF 选举未触发 | display bgp evpn routing-table type 4 | 检查 Type 4 路由发布 |
| BUM 环路 | ESI Label 未配置 | display vxlan vni | 启用 ESI Label |
| MAC 漂移频繁 | CE 未跑 LACP | display link-agency | CE 侧配置 LACP |
| BGP 会话震荡 | MTU 不匹配 | display bfd session | 调整 MTU 和 BFD 参数 |
五、总结
| 项目 | 要点 |
|---|---|
| 多归属 | CE 同时连接多个 VTEP,实现冗余 |
| ESI | Ethernet Segment 唯一标识,同一 ES 下 VTEP 配置相同 ESI |
| DF 选举 | 基于 Router ID 或优先级,决定 BUM 流量转发者 |
| Type 1 路由 | 通告 ES 信息和成员 MAC 列表 |
| Type 4 路由 | ES-Route,用于 DF 选举,每 VNI 独立选举 |
| ESI Label | 标识 BUM 来源 ES,远端 PE 据此避免回传同一 ES |
| 水平分割 | 防止 CE 收到自己发出的 BUM 帧 |
| 分裂脑 | BGP 中断导致双 DF,需 BFD + KeepAlive 防护 |
| 故障切换 | DF 故障后 Non-DF 接管,MAC 表通过 BGP 同步 |
思考
- EVPN 多归属的 DF 只负责 BUM 流量。已知单播报文是否也可以从 Non-DF 进入 EVPN 网络?为什么?
- 如果 ES 下的所有 VTEP 同时故障,CE 的多归属保护是否还能生效?多归属的保护范围是什么?
- All-Active 模式和 Active-Standby 模式在已知单播和 BUM 流量的处理上有何不同?
下篇预告:第177篇:EVPN IRB(Integrated Routing and Bridging)