第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"语义:
- VRF A导出的路由携带VRF A的Export RT
- VRF B接收路由时,检查路由携带的RT是否与VRF B的Import RT匹配
- 只要有一条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 预防建议
- RT编号规范化:建立RT分配表,每个租户的共享RT唯一且受管控
- 自动化配置:使用配置管理工具(如Ansible)自动生成RT/RD,避免人工输入错误
- 定期审计:定期导出所有VRF的RT配置并与分配表对比,发现异常
- 最小权限原则:每个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遗漏 | 路由无法发布 | 配置审计,双向验证 |
思考
- EVPN Type2和Type3路由的RD由系统自动生成(Type+VNI),不依赖用户配置的VRF RD。这意味着即使VRF的RD配置错误,Type2/Type3路由仍然正常工作?那么用户配置的VRF RD在EVPN中究竟影响哪些路由?
- RT匹配是"或"逻辑,这在某些场景下可能导致意外的路由泄露。如果需要实现"与"逻辑(只有同时匹配多个RT才导入),如何实现?
- 在大规模多租户环境中(数千个VRF),手动维护RT/RD规划表是否可行?自动化工具应该如何设计RT/RD的分配算法?
下篇预告:第261篇:VXLAN over SR-MPLS混合方案