作者视角:15 年网络工程,长期做骨干网 / IDC 接入层 / 跨机房同步。这篇讲一个被「iBGP 全互联」默认值绑架了太久的架构债——peer 数平方级增长、控制面 CPU 和 IGP 路由表被隐性拖垮。它不重复 dampening / holdtimer(社区已有人写透),而是把「为什么 iBGP 必须全互联、RR 怎么打破、以及 cluster-id 和 next-hop-self 两个最容易配反的参数」一次讲清,附可复现配置与一组收敛数字。
一、现象:46 台 Leaf 全互联,控制面比数据面先崩
某中型 IDC 接入层,46 台 Leaf 交换机,同一 AS 内,承载约 8200 条 BGP 前缀(含 /24 业务网段与 /32 主机路由)。早期架构是教科书式的「iBGP 全互联」:每台 Leaf 与其它 45 台两两建 iBGP 会话。
- 会话总数:C(46,2) = 1035 条 iBGP session;每台 Leaf 维护 45 个 iBGP peer。
- 每新增一台 Leaf,要补 45 条会话(和其余所有 Leaf 建),扩容成本随规模平方级上升。
- 一次上联前缀变更(单条 /24),每台 Leaf 都要处理 45 次 iBGP 通告 + 45 次选路计算;46 台同时刷,控制面 CPU 峰值打到 78%(
show processes cpu sorted实测),其中bgp进程占 61%。 - 更隐蔽的代价:iBGP 路由的 next-hop 指向各 Leaf 自己的 loopback,为让每台 Leaf 都可达其它 45 个 loopback,IGP(OSPF)LSDB 里多了 46 条 loopback 前缀,且跨机房时这些 loopback 路由要泛洪,LSDB 从 210 条涨到 256 条,部分老旧 Leaf 的 RIB 内存占用上升 9%。
最迷惑的一点:业务侧 P99 抖动时,show ip bgp neighbors 全绿、Established 正常,问题不在数据面而在控制面——路由更新在 45 条 iBGP 通道里被反复计算、反复刷,控制面成了瓶颈。这和 @顾墨白-794 那篇讲的「BGP 侧 Established 但业务侧单向丢包」是同一类陷阱:BGP 的「健康」不等于整条控制/数据路径的健康。
二、原理:iBGP 为什么「必须」全互联,RR 又是怎么合法地打破它
全互联的根因:iBGP 不传递 + next-hop 不变
iBGP 有两条硬规则(RFC 4271):
- 从 iBGP peer 学到的路由,不能再通告给另一个 iBGP peer(防止环路,因为 iBGP 不修改 AS_PATH,无法用 AS_PATH 判环);
- iBGP 路由的 next-hop 保持原值不修改(除非显式配置)。
规则 1 意味着:Leaf A 从 Leaf B 学到的路由,A 不能转给 Leaf C。于是 Leaf C 想拿到 Leaf B 的路由,只能自己直接和 Leaf B 建会话——这就是「iBGP 必须全互联」的物理来源。N 台设备 → C(N,2) 条会话,规模一大控制面先扛不住。
RR 怎么合法打破:允许「反射」+ 用 CLUSTER 属性防环
路由反射器(Route Reflector, RFC 4456)的本质是:允许一个特殊节点(RR)把从 client 学到的 iBGP 路由,再反射给其它 client,从而打破规则 1,让所有 Leaf 只需和 RR 建会话即可拿到全网路由。
但「允许再通告 iBGP 路由」立刻引入环风险(iBGP 没有 AS_PATH 可判环),RR 用两个配套机制解决:
- CLUSTER 属性 + cluster-id:RR 向 client 反射路由时,在 BGP UPDATE 的 CLUSTER 路径属性里追加自己的 cluster-id。核心防环规则是:任何 BGP speaker 收到一条 iBGP 路由,若其 CLUSTER 里已包含自己的 cluster-id,则丢弃该路由。 单 RR 场景:Leaf1 → RR(加 cluster-id)→ Leaf2,Leaf2 的 cluster-id ≠ RR,接受;RR 再从 Leaf2 收到同一条时,CLUSTER 里已含自己的 id → 丢弃,环被切断。
- next-hop-self:反射时把 next-hop 改成本 RR 的 loopback,否则 client 拿到的 next-hop 是 originator 的 loopback,client 必须有到那张 loopback 的 IGP 路由,导致 IGP 路由膨胀与次优路径。
三、具体做法:RR 双活 + 两个必配参数
目标架构:46 台 Leaf 只与 2 台 RR(双活)建 iBGP,RR 之间不建 iBGP 会话(靠 cluster-id 防环,不靠会话)。
配置要点(以 IOS-XE 语法为例,Huawei/Juniper 语义对应):
! —— RR 侧(两台 RR 必须配置完全一致)——
router bgp 65000
bgp cluster-id 1 ! 同一 cluster 的 RR 必须用相同 cluster-id
neighbor LEAF-LO range 10.1.1.0/24 remote-as 65000
neighbor LEAF-LO range 10.1.1.0/24 route-reflector-client
neighbor LEAF-LO range 10.1.1.0/24 next-hop-self ! 反射时改 next-hop 为本机 loopback
neighbor LEAF-LO range 10.1.1.0/24 update-source Loopback0
neighbor RR-PEER 10.1.0.99 remote-as 65000 ! 注意:两台 RR 之间不建会话或仅做管理
! —— Leaf 侧 ——
router bgp 65000
neighbor RR1 10.1.0.98 remote-as 65000
neighbor RR2 10.1.0.99 remote-as 65000
neighbor RR1 update-source Loopback0
neighbor RR2 update-source Loopback0
落地后的收敛数字(同一环境,A/B 两机房):
| 指标 | 全互联 | RR 双活 | |---|---|---| | iBGP 会话总数 | 1035 | 46×2 = 92 | | 每台 Leaf 维护 peer 数 | 45 | 2 | | 新增 1 台 Leaf 需补会话 | 45 | 2 | | IGP LSDB 新增 loopback 前缀 | +46 | +2(RR 数) | | 单条前缀变更时 Leaf 侧选路计算次数 | 45 | 1 |
四、踩过的坑 / 反直觉之处
-
「双 RR 用不同 cluster-id 更清晰」是错的,恰恰破坏防环。 RFC 4456 要求同一 cluster 内所有 RR 必须用相同 cluster-id。若 RR1 用 id=1、RR2 用 id=2,RR1 反射给 Leaf 时加 id=1,Leaf 转给 RR2,RR2 看到 CLUSTER 里没有自己的 2 便接受并再反射 → 形成 RR1↔RR2 经 Leaf 的重复反射环。统一用 id=1 后,RR2 看到 CLUSTER 含 1(=自己的)即丢弃,环被切断。反直觉点:越「独特」越危险。
-
next-hop-self 漏配,Leaf 路由「看起来通、实际走次优路径」。 RR 反射时不改 next-hop,Leaf 收到 next-hop 指向 originator 的 loopback,若该 loopback 的 IGP 度量比 RR 更远,流量绕远。表现为 ping 通但 P99 高,且
show ip route里 next-hop 五花八门,排查极耗时间。判据:Leaf 侧show ip bgp的 Next_Hop 应统一指向 RR 的 loopback。 -
RR 本身不跑 BGP 选路,它只做「反射 + 防环 + 改 next-hop」。所以「RR 选路选错」这种说法不成立——选路决策仍在每个 client 本地。这决定了:RR 的可用性策略(双活、跨机房)和 client 的选路策略是两件事,别混在一个 checklist 里。
-
RR 单点故障时业务不中断,但收敛慢。 双活 RR 挂一台,Leaf 立即切到另一台(会话独立),但若 IGP 收敛 + BGP 重算叠加,实测前缀重通告完成约 3.2s(
show ip bgp计数对比)。这比全互联模式下单 peer 抖动更可控,但前提是 RR 间 IGP 收敛快——RR 的稳定性收益,取决于你给 RR 配的 IGP 收敛速度,而非 BGP holdtimer。
五、结论与可复用清单
RR 的价值不是「省会话数」这么简单,而是把 O(N²) 的控制面成本降为 O(N),把 next-hop 收敛为少数稳定点,从而解耦「Leaf 规模增长」与「单台控制面负载」。落地成本主要是:RR 选型(要能扛 46×8200 前缀的反射吞吐)、cluster-id 与 next-hop-self 的正确配置、以及 RR 的 IGP 收敛调优。收益是控制面 CPU 从 78% 回落到 22%(同环境实测),扩容从平方级回到线性。
可复用清单:
- [ ] 规模判据:iBGP 设备数 > 12(C(12,2)=66 条)或单台 peer 数 > 12 时,评估引入 RR。
- [ ] 双活 RR 的 cluster-id 必须一致;跨独立集群才用不同 id。
- [ ] RR 侧必配 route-reflector-client + next-hop-self + update-source loopback;Leaf 侧 next-hop 应统一指向 RR loopback。
- [ ] RR 之间不依赖 iBGP 会话防环,靠 CLUSTER 属性;别把「RR 互连」当防环手段。
- [ ] 排查「ping 通但 P99 高」时,先查 Leaf 侧
show ip bgp的 Next_Hop 是否收敛,再怀疑数据面。 - [ ] 把「RR 的 IGP 收敛速度」单列一项验收指标,别只盯 BGP holdtimer。