第88篇:RR 反射规则与 Cluster_List 防环
关键词
BGP、RR、反射规则、Cluster_List、Cluster ID、防环、Originator_ID
一、RR 环境下的环路问题
在使用 RR 的网络中,由于 RR 打破了 iBGP 水平分割,可能产生路由环路。BGP 使用两个属性防止 RR 环境下的环路:
| 防环属性 | 作用 |
|---|---|
| Originator_ID | 标识路由的原始始发者 |
| Cluster_List | 记录经过的 RR Cluster |
二、Originator_ID(始发者 ID)
2.1 定义
Originator_ID 是一个可选非传递属性,由 RR 添加,记录路由的原始始发者的 Router ID。
2.2 工作方式
Client A 通告路由 172.16.0.0/16
Client A ──→ RR1 ──→ RR2 ──→ Client A(再次收到)
↑
Originator_ID = Client A 的 Router ID
Client A 再次收到该路由时:
检查 Originator_ID = 自己的 Router ID
→ 这是自己始发的路由 → 丢弃
2.3 防环效果
Client A(RID=2.2.2.2)始发路由 172.16.0.0/16
→ RR1 添加 Originator_ID = 2.2.2.2
→ RR2 收到,不修改 Originator_ID
→ Client A 收到,发现 Originator_ID = 2.2.2.2(自己)
→ 丢弃,环路终止
三、Cluster_List(集群列表)
3.1 什么是 Cluster
Cluster(集群) 是一组共享路由信息的 RR 和 Client 的集合。
- 每个 RR 有一个 Cluster ID(默认是自己的 Router ID)
- 同一 Cluster 内的 RR 共享相同的 Cluster ID
3.2 Cluster_List 的定义
Cluster_List 是一个可选非传递属性,记录路由经过的所有 Cluster ID。
3.3 RR 的分层结构
Cluster 100 Cluster 200
| RR1 (CID=100) RR2(CID=100) Client Client | RR3 (CID=200) Client Client | └──────────────────┘ | ||||
|---|---|---|---|---|---|---|
| │ iBGP | ||||||
| │ | ||||||
| ┌─────┴─────┐ | ||||||
| │ Client │ | ||||||
| └───────────┘ |
3.4 Cluster_List 防环过程
路由 172.16.0.0/16 经过:
Client 始发
→ RR1(Cluster_List = [100])
→ RR2(Cluster_List = [100],检查自己是否在列表中)
→ 自己的 Cluster ID = 100,发现已在 Cluster_List 中
→ 丢弃!环路检测 ✅
3.5 共享 Cluster ID 的场景
当两台 RR 使用相同的 Cluster ID 时,它们属于同一 Cluster:
# 配置相同的 Cluster ID
bgp 100
router-id 1.1.1.1
peer 10.0.12.2 as-number 100
peer 10.0.12.2 reflect-client
reflector cluster-id 100 # RR1 的 Cluster ID = 100
# RR2 也配置相同的 Cluster ID
bgp 100
router-id 2.2.2.2
reflector cluster-id 100 # RR2 的 Cluster ID = 100
好处:同一 Cluster 内的 RR 之间的路由不会互相反射,减少环路风险。
四、完整的 RR 反射规则
4.1 收到路由的来源决定反射行为
| 路由来源 | 反射给 Client | 反射给 Non-Client |
|---|---|---|
| Client | ✅ | ✅ |
| Non-Client | ✅ | ❌ |
| eBGP 对等体 | ✅ | ✅ |
4.2 反射前的检查
RR 在反射前会做以下检查:
收到路由后:
├─ Originator_ID = 自己? → 丢弃
├─ Cluster_List 包含自己的 Cluster ID? → 丢弃
└─ 以上都不是 → 执行反射
反射时添加:
├─ Originator_ID(如果不存在)
└─ Cluster ID 追加到 Cluster_List
五、配置与验证
5.1 配置示例
# RR1(主 RR)
bgp 100
router-id 1.1.1.1
peer 10.0.12.2 as-number 100
peer 10.0.12.2 reflect-client
peer 10.0.13.3 as-number 100
peer 10.0.13.3 reflect-client
reflector cluster-id 100
# RR2(备用 RR,同 Cluster)
bgp 100
router-id 2.2.2.2
peer 10.0.14.4 as-number 100
peer 10.0.14.4 reflect-client
peer 10.0.15.5 as-number 100
peer 10.0.15.5 reflect-client
reflector cluster-id 100 # 同一 Cluster
5.2 验证命令
# 查看 RR 配置状态
display bgp peer 10.0.12.2 verbose
Peer: 10.0.12.2, AS: 100
Type: IBGP
Description: Client
Reflect client: Yes ← 是 RR 客户端
Cluster ID: 100 ← 所属 Cluster
# 查看路由的 Cluster_List 和 Originator_ID
display bgp routing-table 172.16.0.0
Network: 172.16.0.0/16
Path/Ogn: 100i
Originator: 2.2.2.2 ← 始发者 Router ID
Cluster List: 100 ← 经过的 Cluster
六、RR 部署的最佳实践
6.1 Cluster 规划
| 规模 | 建议 |
|---|---|
| 小型 AS(<20 台) | 1 个 Cluster,2 台 RR |
| 中型 AS(20~100 台) | 2~3 个 Cluster |
| 大型 AS(>100 台) | 分层 Cluster 结构 |
6.2 冗余设计
# 每个 Client 至少连接两台 RR
bgp 100
peer 10.0.12.1 as-number 100 # 主 RR
peer 10.0.23.3 as-number 100 # 备用 RR
6.3 Cluster ID 设计
- 同一冗余组内的 RR 使用相同的 Cluster ID
- 不同层级的 RR 使用不同的 Cluster ID
- Cluster ID 使用 IP 地址格式(如 10.0.0.1)
七、总结
| 防环机制 | 对应属性 | 作用 |
|---|---|---|
| Originator_ID | 始发者 ID | 防止路由回到始发者 |
| Cluster_List | 集群列表 | 防止 RR 环路 |
| iBGP 水平分割 | - | 被 RR 机制替代 |
八、思考
- Originator_ID 的作用是什么?由谁添加?
- Cluster_List 如何防止多级 RR 环境下的环路?
- 如果两台 RR 使用不同的 Cluster ID,它们之间会互相反射路由吗?为什么?
- 当 RR 收到一条 Originator_ID 等于自己的路由时,会如何处理?
- 在分层 RR 架构中,顶层 RR 的 Client 包括下层 RR,如何配置 Cluster ID?
下篇预告:第89篇《联邦(Confederation)解决 IBGP 扩展问题》——另一种 iBGP 扩展方案。