第260篇:BGP EVPN 的 RT/RD 规划

关键词:Route Distinguisher、Route Target、Route Origin、BGP EVPN、多租户、路由导入导出、华为CloudEngine


一、引言

在前几篇中,我们系统学习了Spine-Leaf架构、VXLAN Overlay、BGP EVPN控制面、Type2/Type3路由、网关部署模式以及Anycast Gateway。这些技术共同构成了现代数据中心Overlay网络的技术基石。然而,所有这些技术的正常运转都依赖一个底层但至关重要的机制——BGP的RD(Route Distinguisher)和RT(Route Target)规划。

在BGP MPLS VPN和BGP EVPN中,RD用于保证路由的全局唯一性,RT用于控制路由的导入和导出。如果RD规划不当,会导致路由冲突和无法区分不同租户的同源路由;如果RT规划不当,会导致路由泄露(不该看到的路被看到了)或路由丢失(该看到的路看不到)。

本文将深入讲解BGP EVPN中RD和RT的工作原理、规划原则、常见错误模式,并结合华为CloudEngine设备给出完整的配置示例和故障案例。

二、Route Distinguisher(RD)原理

2.1 RD 的作用

RD(Route Distinguisher)是一个8字节的唯一标识符,附加在BGP路由的前缀之前,形成全局唯一的路由标识(称为BGP Route Distinguisher Prefix)。RD的核心作用是:即使不同的租户或VRF使用相同的IP地址前缀(如两个租户都使用192.168.1.0/24),加上不同的RD后,这两条路由在BGP路由表中仍然是不同的条目。

BGP路由标识 = RD + Prefix
示例:
  RD1: 65100:100, Prefix: 192.168.1.0/24 → 路由A
  RD2: 65100:200, Prefix: 192.168.1.0/24 → 路由B
  (虽然Prefix相同,但RD不同,BGP视为两条不同路由)

2.2 RD 的格式

RD有三种标准格式(RFC 4364):

格式 结构 示例 适用场景
Administrator:Assigned-number 2字节Admin + 4字节Assigned 65100:100 最常见,Admin=AS号,Assigned=VRF/VNI编号
IP-address:Assigned-number 4字节IP + 2字节Assigned 10.255.254.1:100 Admin为IP地址的场景
8字节不分割 8字节无结构 0x0000010000000001 自定义格式

2.3 EVPN 中的 RD 生成规则

在BGP EVPN中,RD的生成方式与普通BGP VPN略有不同。EVPN路由的RD由以下两部分组成:

EVPN RD = <Route Distinguisher Type: 2 Bytes> + <EVPN RD Value: 6 Bytes>

但实际配置中,EVPN使用一个简化的RD格式,与路由类型(Route Type)和ETAG-ID(VNI)直接关联:

EVPN路由类型 RD生成规则 示例
Type1 (ES) RD = + 1:0x00000001
Type2 (MAC/IP) RD = + 2:10001
Type3 (IMET) RD = + 3:10001
Type5 (IP Prefix) RD = 用户自定义(同普通VPN RD) 65100:100

关键观察:Type2和Type3路由的RD由系统自动生成,用户无法手动配置(RD = Type + VNI)。只有Type5路由(IP Prefix Route)使用用户自定义的RD。

2.4 RD 规划原则

原则一:全局唯一性

任何两条不同的VRF/VNI不能使用相同的RD。RD的唯一性是BGP VPN/EVPN正常工作的基础。

原则二:可识别性

RD应包含能够识别其所属租户或VRF的信息。推荐的RD格式:<AS号>:<VNI编号> 或 <AS号>:<租户ID><子网序号>。

原则三:有序性

RD应按一定规则有序分配,便于故障排查和路由审计。

三、Route Target(RT)原理

3.1 RT 的作用

RT(Route Target)是一个扩展社区(Extended Community)属性,用于控制BGP路由的导入(Import)和导出(Export)。与RD不同,RT不用于区分路由,而是用于控制路由的"可见性"——哪些VRF可以接收(Import)某条路由,哪些VRF可以发送(Export)某条路由。

Export RT: VRF A 的 Export RT = 65100:100
Import RT: VRF B 的 Import RT = 65100:100
结果: VRF B 可以收到 VRF A 导出的路由

Export RT: VRF A 的 Export RT = 65100:100
Import RT: VRF C 的 Import RT = 65100:200
结果: VRF C 无法收到 VRF A 导出的路由(RT不匹配)

3.2 RT 的格式

RT的格式与RD相同,有三种标准格式:

格式 结构 示例
AS:2字节数值 2字节AS + 2字节数值 65100:100
IP:2字节数值 4字节IP + 2字节数值 10.0.0.1:100
4字节:4字节 4字节Admin + 4字节数值 65100:00000100

3.3 RT 匹配规则

RT的匹配遵循简单的"Import-Export"语义:

  1. VRF A导出的路由携带VRF A的Export RT
  2. VRF B接收路由时,检查路由携带的RT是否与VRF B的Import RT匹配
  3. 只要有一条Import RT匹配,该路由就被导入到VRF B

重要:RT匹配是"或"逻辑,而非"与"逻辑。只要有一条Import RT匹配,路由就被导入。这意味着:

  • 如果VRF B的Import RT包含多个值,任一匹配即可导入
  • 如果需要精确控制,应确保Export RT和Import RT的精确对应

四、EVPN 中的 RT 规划策略

4.1 单租户单VNI场景

最简单的场景:一个租户、一个VNI、一对RT。

VRF-TenantA-1:
  RD = 65100:100
  Export RT = 65100:100
  Import RT = 65100:100

所有Leaf的VRF-TenantA-1配置完全相同的RD和RT。

4.2 多租户隔离场景

多个租户需要完全隔离,每个租户使用独立的RT。

租户A:
  RD = 65100:100
  Export RT = 65100:100
  Import RT = 65100:100

租户B:
  RD = 65100:200
  Export RT = 65100:200
  Import RT = 65100:200

租户A和租户B之间没有任何路由泄露,因为RT完全不匹配。

4.3 跨VNI路由泄露场景

当同一租户的不同VNI之间需要路由互通时(如子网间通信),需要配置额外的RT。

租户A - VNI 10001 (172.16.1.0/24):
  RD = 65100:10001
  Export RT = 65100:10001, 65100:1    # 私有RT + 共享RT
  Import RT = 65100:10001, 65100:1

租户A - VNI 10002 (172.16.2.0/24):
  RD = 65100:10002
  Export RT = 65100:10002, 65100:1    # 私有RT + 共享RT
  Import RT = 65100:10002, 65100:1

共享RT (65100:1) 使两个VNI之间可以互相学习路由。

4.4 RT 规划的三种经典模式

模式一:一对一模式(1:1 RT)

每个VRF的Import RT = Export RT = 同一个值。最严格的隔离模式,只有RT完全相同的VRF之间才能互通。

模式二:一对多模式(1:N RT)

一个共享RT用于租户内所有VRF互通,私有RT用于精确控制。灵活且实用,是多数生产环境的首选。

模式三:Many-to-Many模式

多个VRF共享一组RT,任意两个VRF之间的互通由RT的交集决定。适合复杂的跨租户互联场景,但管理难度高。

模式 隔离粒度 管理复杂度 适用场景
一对一(1:1) 最高(VRF级隔离) 低 严格多租户隔离
一对多(1:N) 中等(租户级隔离) 中 租户内多子网互通
Many-to-Many 最低(精细控制) 高 复杂跨租户互通

五、华为 CloudEngine RT/RD 配置

5.1 多租户多VNI完整配置

# ============================================
# Leaf-01 多租户 EVPN 配置
# ============================================
sysname Leaf-01

interface LoopBack0
 ip address 10.255.254.1 255.255.255.255

# ========== 租户 A ==========
# VNI 10001 - 租户A 子网1
ip vpn-instance TENANT-A-SUBNET1
 vpn-instance-mode general
 rd 65100:10001
 route-target export 65100:10001 65100:1
 route-target import 65100:10001 65100:1
 ipv4-family

# VNI 10002 - 租户A 子网2
ip vpn-instance TENANT-A-SUBNET2
 vpn-instance-mode general
 rd 65100:10002
 route-target export 65100:10002 65100:1
 route-target import 65100:10002 65100:1
 ipv4-family

# ========== 租户 B ==========
# VNI 20001 - 租户B 子网1
ip vpn-instance TENANT-B-SUBNET1
 vpn-instance-mode general
 rd 65100:20001
 route-target export 65100:20001 65100:2
 route-target import 65100:20001 65100:2
 ipv4-family

# VNI 20002 - 租户B 子网2
ip vpn-instance TENANT-B-SUBNET2
 vpn-instance-mode general
 rd 65100:20002
 route-target export 65100:20002 65100:2
 route-target import 65100:20002 65100:2
 ipv4-family

# ========== VXLAN VTEP ==========
vxlan vtep 10.255.254.1
 ip vpn-instance TENANT-A-SUBNET1
  vxlan vni 10001
 ip vpn-instance TENANT-A-SUBNET2
  vxlan vni 10002
 ip vpn-instance TENANT-B-SUBNET1
  vxlan vni 20001
 ip vpn-instance TENANT-B-SUBNET2
  vxlan vni 20002

# ========== BGP EVPN ==========
bgp 65100
 router-id 10.255.254.1
 #
 peer 10.255.255.1 as-number 65100
 peer 10.255.255.1 connect-interface LoopBack0
 peer 10.255.255.1 eVPN-enable
 peer 10.255.255.2 as-number 65100
 peer 10.255.255.2 connect-interface LoopBack0
 peer 10.255.255.2 eVPN-enable
 #
 address-family evpn
  peer 10.255.255.1 enable
  peer 10.255.255.2 enable
  evpn ipv4-prefix-route

5.2 验证 RT/RD 配置

# 检查 VRF 的 RD 和 RT
Leaf-01> display vpn-instance TENANT-A-SUBNET1
  Route Distinguisher : 65100:10001
  Route Targets:
    Export: 65100:10001 65100:1
    Import: 65100:10001 65100:1

# 检查 EVPN 路由携带的 RT
Leaf-01> display bgp evpn routing-table
  # 查看每条路由携带的 Extended Community (RT)

# 检查 BGP VPNv4 路由(Type5)
Leaf-01> display bgp vpnv4 routing-table
  # 确认跨 VNI 的路由泄露是否按预期工作

六、故障案例:RT 配置错误导致租户间路由泄露

6.1 故障现象

某云服务商的多租户数据中心中,租户A的VM可以ping通租户B的VM,这是严重的安全事件。两个租户应该完全隔离,但网络层发生了路由泄露。

6.2 排查过程

# 在 Leaf-01 上检查租户A的路由表
Leaf-01> display ip routing-table vpn-instance TENANT-A-SUBNET1
  Destination: 10.10.1.0/24      ← 租户A自己的子网
  Destination: 10.10.2.0/24      ← 租户A的另一个子网(正常)
  Destination: 10.20.1.0/24      ← 租户B的子网(异常!)

租户A的路由表中出现了租户B的路由。

# 检查租户A的 Import RT
Leaf-01> display vpn-instance TENANT-A-SUBNET1
  Route Targets:
    Export: 65100:10001 65100:1
    Import: 65100:10001 65100:1   ← 共享 RT 65100:1

# 检查租户B的 Export RT
Leaf-01> display vpn-instance TENANT-B-SUBNET1
  Route Targets:
    Export: 65100:20001 65100:1   ← 也使用了共享 RT 65100:1!
    Import: 65100:20001 65100:1

根因:租户B在添加第二个VNI时,运维人员误将租户B的共享RT配置为65100:1(与租户A相同),而非应该使用的65100:2。这导致租户A和租户B共享了同一组RT,路由发生了跨租户泄露。

6.3 解决方案

# 修正租户B的 RT 配置
ip vpn-instance TENANT-B-SUBNET1
 route-target export 65100:20001 65100:2    # 改回 65100:2
 route-target import 65100:20001 65100:2

ip vpn-instance TENANT-B-SUBNET2
 route-target export 65100:20002 65100:2    # 改回 65100:2
 route-target import 65100:20002 65100:2

# 验证路由泄露已消除
Leaf-01> display ip routing-table vpn-instance TENANT-A-SUBNET1
  Destination: 10.10.1.0/24      ← 租户A自己的子网
  Destination: 10.10.2.0/24      ← 租户A的另一个子网
  # 租户B的路由 10.20.1.0/24 已消失

6.4 预防建议

  1. RT编号规范化:建立RT分配表,每个租户的共享RT唯一且受管控
  2. 自动化配置:使用配置管理工具(如Ansible)自动生成RT/RD,避免人工输入错误
  3. 定期审计:定期导出所有VRF的RT配置并与分配表对比,发现异常
  4. 最小权限原则:每个VRF的Import RT只包含必须接收的路由来源

七、RT/RD 规划表模板

租户 VNI 子网 RD Export RT Import RT
租户A 10001 10.10.1.0/24 65100:10001 65100:10001, 65100:1 65100:10001, 65100:1
租户A 10002 10.10.2.0/24 65100:10002 65100:10002, 65100:1 65100:10002, 65100:1
租户B 20001 10.20.1.0/24 65100:20001 65100:20001, 65100:2 65100:20001, 65100:2
租户B 20002 10.20.2.0/24 65100:20002 65100:20002, 65100:2 65100:20002, 65100:2
租户C 30001 10.30.1.0/24 65100:30001 65100:30001, 65100:3 65100:30001, 65100:3

八、总结

概念 作用 规划要点
RD 路由全局唯一标识 每个VRF唯一,推荐使用AS:VNI格式
Export RT 控制路由向外发布 包含私有RT(精确控制)和共享RT(租户内互通)
Import RT 控制路由向内接收 与Export RT对应,决定可见性
RT匹配 "或"逻辑 任一Import RT匹配即可导入
EVPN RD Type2/3自动,Type5自定义 Type2/3的RD = Type + VNI
常见错误 后果 预防措施
RD重复 路由覆盖,VM不可达 建立RD分配表,自动化分配
RT重复 跨租户路由泄露 严格管控共享RT编号
Import RT遗漏 路由丢失,通信中断 配置审计,双向验证
Export RT遗漏 路由无法发布 配置审计,双向验证

思考

  1. EVPN Type2和Type3路由的RD由系统自动生成(Type+VNI),不依赖用户配置的VRF RD。这意味着即使VRF的RD配置错误,Type2/Type3路由仍然正常工作?那么用户配置的VRF RD在EVPN中究竟影响哪些路由?
  2. RT匹配是"或"逻辑,这在某些场景下可能导致意外的路由泄露。如果需要实现"与"逻辑(只有同时匹配多个RT才导入),如何实现?
  3. 在大规模多租户环境中(数千个VRF),手动维护RT/RD规划表是否可行?自动化工具应该如何设计RT/RD的分配算法?

下篇预告:第261篇:VXLAN over SR-MPLS混合方案