第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 接口集合:

Ethernet Segment(ES) - 图示

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 流量。

分裂脑(Split Brain)问题 - 图示

检测方法 说明 检测时间
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 同步

思考

  1. EVPN 多归属的 DF 只负责 BUM 流量。已知单播报文是否也可以从 Non-DF 进入 EVPN 网络?为什么?
  2. 如果 ES 下的所有 VTEP 同时故障,CE 的多归属保护是否还能生效?多归属的保护范围是什么?
  3. All-Active 模式和 Active-Standby 模式在已知单播和 BUM 流量的处理上有何不同?

下篇预告:第177篇:EVPN IRB(Integrated Routing and Bridging)