第259篇:Anycast Gateway 与主机路由

关键词

Anycast Gateway、分布式网关、主机路由、/32精确路由、无中断切换、网关冗余、MAC地址共享


一、分布式网关的冗余挑战

1.1 传统网关的问题

在传统 VLAN 网络中,每个 VLAN 的网关有一个固定的 IP 和 MAC 地址:

传统 VLAN 网关模式:

  VLAN 100 网关:10.10.1.1/24, MAC: 00-01-02-03-04-05

  问题:网关在汇聚层设备上
        汇聚层主备切换时:
          虚拟 MAC 切换(VRRP/HSRP)
          主机 ARP 表超时
          切换时间 3-10 秒
          业务中断

1.2 分布式网关的冗余需求

分布式网关要求每台 Leaf 都是 VXLAN 网关,但主机只能配置一个网关地址:

矛盾点:

  主机 VM A 的网关配置:
    IP: 192.168.1.1
    MAC: ??

  如果 Leaf1 和 Leaf3 的网关 MAC 不同:
    VM A 在 Leaf1 下 → 学到 Leaf1 的网关 MAC → 正常
    VM A 迁移到 Leaf3 → 网关 MAC 变了 → ARP 刷新 → 有中断

  如果 Leaf1 和 Leaf3 的网关 MAC 相同:
    VM A 在 Leaf1 下 → 学到网关 MAC
    VM A 迁移到 Leaf3
    ARP 表中网关 MAC 没变 → 直接通信 → 零中断!

Anycast Gateway = 所有 Leaf 共享相同的网关 IP + MAC

二、Anycast Gateway 原理

2.1 基本概念

Anycast Gateway 是分布式网关的关键设计——所有 Leaf 设备上配置相同的网关 IP 和 MAC 地址

Anycast Gateway 示意:

               ┌──────────┐
               │  Spine   │
               └────┬─────┘
                    │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
Leaf1 GW: IP:1.1 MAC:MACg Leaf2 GW: IP:1.1 MAC:MACg Leaf3 GW: IP:1.1 MAC:MACg
│ │ │
VM A GW:1.1 ARP:MACg VM B GW:1.1 ARP:MACg VM C GW:1.1 ARP:MACg
--- --- --- --- ---

关键点: 每台 Leaf 上的 Vbdif 接口: IP: 192.168.1.1(相同) MAC: 0000-5e00-0101(相同,手动指定)

主机侧: 所有 VM 的网关:192.168.1.1 → MAC 0000-5e00-0101 无论哪个 Leaf 接入,网关的 MAC 不变

2.2 华为配置

# Leaf1 Anycast Gateway 配置
interface Vbdif10001
 description Gateway for VNI 10001
 ip binding vpn-instance Tenant-A
 ip address 192.168.1.1 255.255.255.0
 mac-address 0000-5e00-0101       # 手动指定 MAC(所有 Leaf 相同)
 #

# Leaf2 Anycast Gateway 配置(完全相同的 IP 和 MAC)
interface Vbdif10001
 description Gateway for VNI 10001
 ip binding vpn-instance Tenant-A
 ip address 192.168.1.1 255.255.255.0
 mac-address 0000-5e00-0101       # 与 Leaf1 相同 MAC
 #

2.3 转发行为

Anycast Gateway 下的转发:

场景 1:VM A(Leaf1)访问外部网络(默认路由)

  VM A 的默认路由:0.0.0.0/0 → 网关 192.168.1.1

  1. VM A 发送帧:dst MAC = 0000-5e00-0101(网关 MAC)
  2. Leaf1 收到:
     dst MAC = 本 Leaf 的 Anycast MAC → 接收
     路由查找 → 下一跳是出口路由器
     VXLAN 封装 → 发送到出口 Leaf
  3. 回程流量:
     出口 Leaf → Spine Underlay → Leaf1
     因为 Leaf1 发布的主机路由 /32 告诉全网 VM A 在 Leaf1 下

场景 2:VM A(Leaf1)→ VM B(Leaf3)跨子网

  VM A(192.168.1.10) → VM B(192.168.2.10)

  1. VM A:目标不是本地子网 → ARP 查询网关 MAC → 
     已有:192.168.1.1 → MAC 0000-5e00-0101
  2. 发送帧:dst MAC = 0000-5e00-0101
  3. Leaf1 收到:匹配本地 Anycast MAC → 三层路由
     目标 192.168.2.10 → 主机路由 /32 → VTEP = Leaf3
     VXLAN 封装(VNI 20001)→ 发送到 Leaf3
  4. Leaf3 收到:解封装 → 转发给 VM B

三、主机路由(/32 精确路由)

3.1 为什么需要主机路由

分布式网关需要知道每台主机在哪台 Leaf 下,这样才能精确转发:

没有主机路由的问题:

  VM A(192.168.1.10)在 Leaf1 下
  VM B(192.168.2.10)在 Leaf3 下

  出口 Leaf 想回传流量给 VM A:
    查路由表:
      192.168.1.0/24 → 网关 192.168.1.1(Anycast)
      但 192.168.1.1 在每台 Leaf 上!
    出口 Leaf 不知道 VM A 具体在哪台 Leaf

  结果:流量可能发到错误的 Leaf

主机路由(/32)的解决方案:

  EVPN Type 2 路由发布时,同时发布 /32 主机路由:
    192.168.1.10/32 → VTEP 10.1.1.1(Leaf1)
    192.168.2.10/32 → VTEP 10.1.1.3(Leaf3)
    192.168.1.20/32 → VTEP 10.1.1.2(Leaf2)

  路由表成为:
    192.168.1.0/24 → Anycast 192.168.1.1(汇总路由)
    192.168.1.10/32 → VTEP 10.1.1.1(精确路由)
    192.168.1.20/32 → VTEP 10.1.1.2
    192.168.2.10/32 → VTEP 10.1.1.3

  最长匹配原则:/32 比 /24 更精确 → 优先使用

3.2 主机路由的发布

主机路由由 EVPN Type 2 路由自动发布:

Type 2 MAC/IP 路由:
  MAC: AA:AA:AA:AA:AA:01
  IP: 192.168.1.10
  VNI: 10001
  Next-Hop: 10.1.1.1(VTEP IP)

Leaf1 发布 Type 2 后,自动生成主机路由:
  IP: 192.168.1.10/32
  出接口: NVE1(VXLAN 隧道接口)
  下一跳: 10.1.1.1(Leaf1 的 VTEP IP)

华为配置:
  # 自动发布 /32 主机路由
  bgp 65001
   l2vpn-family evpn
    advertise arp                                 # 通告 ARP(生成主机路由)
    advertise irb                                 # 通告 IRB 接口

  # 验证主机路由
  display ip routing-table vpn-instance Tenant-A

  Route Flags: R - relay, D - download to fib
  ───────────────────────────────────────────────
  Routing Table : Tenant-A
         Destinations : 10       Routes : 15

  Destination/Mask  Proto   Pre  Cost     NextHop         Interface
     192.168.1.0/24  Direct  0    0       192.168.1.1     Vbdif10001
     192.168.1.10/32  EVPN    0    0       10.1.1.1        NVE1
     192.168.1.20/32  EVPN    0    0       10.1.1.2        NVE1
     192.168.2.0/24  Direct  0    0       192.168.2.1     Vbdif20001
     192.168.2.10/32  EVPN    0    0       10.1.1.3        NVE1

3.3 主机路由的精确转发

利用主机路由实现精确转发:

场景:VM A(L1, 192.168.1.10) → Internet

  1. VM A 发送 ping 8.8.8.8
     dst MAC = 网关 MAC(0000-5e00-0101)

  2. Leaf1 收到:
     路由查找:8.8.8.0/8 → 默认路由 → 出口 Leaf
     VXLAN 封装 → 发送到出口 Leaf(L3 VNI)

  3. 回程:8.8.8.8 → 出口 Leaf → 
     查路由:
       192.168.1.10/32 → VTEP 10.1.1.1(Leaf1)✓ 精确匹配
       不是发到 Anycast 192.168.1.1
     VXLAN 封装 → 发送到 Leaf1

  4. Leaf1 解封装 → 转发给 VM A

精确路由保证回程流量正确到达 Leaf1,
而不是被 Anycast 网关随机路由到其他 Leaf!

四、Anycast Gateway + 主机路由的故障切换

4.1 Leaf 故障切换

VM A 在 Leaf1 下,Leaf1 故障:

故障前:
  路由表全网一致:
    192.168.1.10/32 → VTEP 10.1.1.1(Leaf1)

Leaf1 故障:
  1. BGP 邻居断连(BFD 300ms 检测)
  2. Spine(RR)撤销 Leaf1 的所有 EVPN 路由
  3. 192.168.1.10/32 从路由表删除
  4. 只剩 192.168.1.0/24 → Anycast 192.168.1.1

VM A 迁移到 Leaf2(或 Leaf2 感知到 VM A):
  1. Leaf2 学习到 VM A 的 MAC/IP
  2. Leaf2 发布 Type 2 路由
  3. 全网更新:192.168.1.10/32 → VTEP 10.1.1.2(Leaf2)
  4. 恢复通信

切换时间:
  BFD 检测:300ms
  BGP 撤销:~100ms
  主机路由更新:~100ms
  总切换时间:< 1s

注意:Anycast MAC 不变,VM A 不需要刷新 ARP!

4.2 无中断升级

场景:Leaf1 需要软件升级

升级流程:

Step 1:通过路由策略撤销 /32 主机路由
  # 在 Leaf1 上临时撤销路由
  route-policy DENY_SELF permit node 10
   if-match ip-prefix LOCAL_HOST

  bgp 65001
   l2vpn-family evpn
    apply route-policy DENY_SELF export

  Step 2:全网更新
    192.168.1.10/32 撤销
    只剩 192.168.1.0/24 Anycast

Step 3:其他 Leaf 接管流量
  VM A 的流量由 Leaf2/Leaf3 通过 Anycast 分担
  ARP 表不变(因 MAC 相同)
  业务不中断

Step 4:升级 Leaf1

Step 5:恢复路由发布
  undo route-policy DENY_SELF
  重新学习 VM 的 ARP
  重新发布 /32 主机路由

Step 6:流量回切(可选)
  Leaf1 的 /32 路由发布后
  回程流量自动回到 Leaf1

五、Anycast Gateway 的设计要点

5.1 MAC 地址规划

Anycast MAC 地址规划原则:

1. 每 VNI 唯一的 MAC
   VNI 10001: MAC 0000-5e00-0101
   VNI 20001: MAC 0000-5e00-0201
   VNI 30001: MAC 0000-5e00-0301

2. 使用标准 OUI
   推荐:0000-5e00-xxxx(IANA 分配的 VRRP 地址段)
   避免与真实 NIC MAC 冲突

3. 跨 Leaf 一致
   同一个 VNI 的 Anycast MAC 在所有 Leaf 上必须相同
   否则 VM ARP 表会混乱

4. 避免冲突
   不与物理服务器网卡的 MAC 冲突
   不与 VRRP/HSRP 虚拟 MAC 冲突

5.2 ARP 处理

Anycast Gateway 下的 ARP 处理:

VM 查询网关 MAC:
  "Who has 192.168.1.1?"

Leaf 回复:
  "192.168.1.1 is at 0000-5e00-0101"

  每台 Leaf 都回复!
  但由于 Underlay 可达性,VM 只收到直连 Leaf 的回复

跨 Leaf 的 ARP:
  VM(Leaf1)发 ARP 查询另一台 Leaf 下的 VM:
    ARP 代理(Leaf1 本地代答)
    如果不存在 → 通过 Type 3 BUM 发送

  优化:ARP 代理+主机路由,绝大多数 ARP 本地代答

六、总结

知识点 核心要点
Anycast Gateway 所有 Leaf 共享相同网关 IP+MAC
核心价值 VM 迁移/故障时网关 MAC 不变,ARP 不刷新
主机路由 /32 精确路由,EVPN Type 2 自动发布
最长匹配 /32 优先于 Anycast 的汇总 /24
故障切换 BFD 检测→撤销/32→Anycast 接管→迁移后恢复
无中断升级 先撤销路由,升级完再恢复
MAC 规划 每 VNI 一个 MAC,所有 Leaf 一致
与 VRRP 区别 所有 Leaf 同时 Active(非主备)

七、思考

  1. Anycast Gateway 和 VRRP 虚拟网关有什么本质区别?为什么 VRRP 不适合 Spine-Leaf 架构?
  2. 如果所有 Leaf 的 Anycast MAC 相同,Leaf 收到一个目的 MAC = Anycast 的帧时,怎么知道是自己需要路由的帧?
  3. 主机路由(/32)在分布式网关中扮演什么角色?如果不发布 /32 路由,仅靠 Anycast 网关的 /24 汇总路由会有什么问题?
  4. 当 Leaf1 故障时,VM A 从 Leaf1 切换到 Leaf2,为什么 ARP 不需要刷新?请描述完整的切换时间线。
  5. 假设一个数据中心有 4 台 Leaf,每台 Leaf 下挂 50 台 VM,每台 VM 有一个 /32 主机路由。全网路由表有多少条路由?Anycast 汇总路由如何与 /32 精确路由协同工作?

下篇预告:第260篇《BGP EVPN 的 RT/RD 规划》——EVPN 中的 Route Distinguisher 和 Route Target 的设计原则,在大规模多租户场景下的规划策略。