RR 反射路由无法修改属性
大约 3 分钟
RR 反射路由无法修改属性
问题现象
在以下拓扑中:
- HUB FortiGate 作为 BGP Route Reflector
- SPOKE1、SPOKE2 与 HUB 建立 iBGP
- 在 HUB → SPOKE2 的出站方向配置了 route-map-out,用于修改 Local Preference 和 Community
实际现象如下:
- HUB 本地注入前缀
10.255.255.1/32能成功匹配 route-map-out - 从 SPOKE1 学到的前缀
10.29.100.0/24、10.255.255.29/32被反射给 SPOKE2 时,属性没有被修改 - 在 SPOKE2 的路由表中查看到这些前缀保持 LocalPref 100,没有添加 Community,并包含 Originator / Cluster list 字段
- route-map-out 对反射路由完全不生效
以下为完整的示例配置与输出(全部保留):
HUB 作为 RR 的 BGP 配置
config router bgp
set as 65000
config neighbor
edit "172.16.255.29" # SPOKE1
set remote-as 65000
set route-map-in "HUB-RM_SPOKE1-INBOUND"
set route-reflector-client enable
next
edit "172.16.255.32" # SPOKE2
set remote-as 65000
set route-map-out "HUB-RM_SPOKE2-OUTBOUND"
set route-reflector-client enable
next
end
config network
edit 1
set prefix 10.255.255.1 255.255.255.255 # HUB 注入的前缀
next
end
endSPOKE1 通告以下前缀:
10.29.100.0/2410.255.255.29/32
HUB 从 SPOKE1 学到的路由
HUB # get router info bgp neighbors 172.16.255.29 routes
Network Next Hop LocPrf
10.29.100.0/24 172.16.255.29 100
10.255.255.29/32 172.16.255.29 100HUB 广告给 SPOKE2 的路由(含反射路由)
HUB # get router info bgp neighbors 172.16.255.32 advertised-routes
Network Next Hop LocPrf Community
10.29.100.0/24 172.16.255.29 100 <none> # 反射路由
10.255.255.1/32 172.16.255.1 500 65000:1 # 本地注入路由被修改
10.255.255.29/32 172.16.255.29 100 <none> # 反射路由可以看到:
HUB 本地注入路由被成功修改为 LocalPref 500、Community 65000:1 反射路由 LocalPref 仍然为 100,Community 未被修改
SPOKE2 上查看实际接收到的前缀
SPOKE2 # get router info bgp neighbors 172.16.255.1 routes
10.29.100.0/24 LocPrf 100 Originator 10.255.255.29 Cluster 10.255.255.1
10.255.255.1/32 LocPrf 500 Community 65000:1
10.255.255.29/32 LocPrf 100 Originator 10.255.255.29 Cluster 10.255.255.1带 Originator / Cluster list 的是反射路由,属性均未被修改。
问题原因
此现象符合 RFC 4456 的要求,不是 FortiGate 的 Bug,也不是 route-map 配置错误。
依据标准:
Route Reflector 在反射 IBGP 路由时不得修改以下字段:
- NEXT_HOP
- AS_PATH
- LOCAL_PREF
- MED
FortiOS 的实现更严格: 对反射路由不会应用任何 route-map-out 中的属性修改,包括 LocalPref、Community 等。
原因:
- 反射路由必须保持其属性一致性
- 修改反射路由属性会破坏 AS 内 BGP 的决策一致性
- 因此 FortiGate 强制忽略对反射路由的 route-map-out 属性修改
所以:
- 本地注入路由正常被修改
- 从 SPOKE1 来的路由在反射过程中不会被修改
解决方法
如果需要修改 SPOKE1 → SPOKE2 的路由属性,必须避免依赖 RR 出站方向的 route-map-out。
可选择以下任一方式:
在 SPOKE1 → HUB 出站方向修改(推荐)
在 SPOKE1 上:
- 使用 route-map-out 修改 LocalPref / Community
- 路由在进入 RR 之前就完成属性设置
- 最可控,也最符合 BGP 设计逻辑
在 HUB 的入站方向修改
在 HUB 上:
- 使用 route-map-in 修改来自 SPOKE1 的属性
- 再将修改后的路由反射给 SPOKE2(此时不受 RR 限制)
在 SPOKE2 入站方向修改
在 SPOKE2 上:
- 使用 route-map-in 在落地阶段修改属性
- 适用于无法修改源端的情况
可以过滤反射路由,但不能修改其属性
RR 可以:
- route-map-out deny
- prefix-list
- distribute-list
这些方法用来过滤,而不是修改,因此允许。
注意事项(Notes)
以下项目在排查时需特别注意:
反射路由必然带有 Originator 与 Cluster list
如果路由包含:
- Originator
- Cluster list
那么:
- route-map-out 属性修改不会生效
- 这是识别是否为反射路由的重要判断依据
必须规划属性修改的位置
推荐设计:
- 源端做属性赋值(最佳)
- HUB 做入站清洗
- 目标端做最终策略
不要依赖 RR 的出站 direction 修改反射路由,因为它永远不会生效。