EBGP:跨AZ的路由学习心得

整理自实际配置场景的讨论笔记,覆盖:路由传播流水线、EBGP/IBGP 行为差异、next-hop-self、IBGP 建邻规则、扩展性问题与解法。


0.1. 一、拓扑

1
2
3
4
5
6
7
8
AS 100 (内部 OSPF + IBGP, R3 配 next-hop-self)              AS 200
┌─────────────────────────────────────────────────┐ ┌─────────────────┐
│ R1 ────── R2 ────── R3 ───────────────────── │════│ R4 │
│ Lo:1.1.1.1 Lo:2.2.2.2 Lo:3.3.3.3 │ │ Lo:4.4.4.4
(10.0.0.3 朝 R4) │ │ (10.0.0.4 朝 R3)
│ │ │ originate: │
│ │ │ 200.1.1.0/24
└─────────────────────────────────────────────────┘ └─────────────────┘

协议部署

  • OSPF area 0:R1 ─ R2 ─ R3(R3-R4 那段链路 10.0.0.0/30 不进 OSPF)
  • IBGP full-mesh:R1↔R2、R1↔R3、R2↔R3(用 Loopback 建邻 + next-hop-self
  • EBGP:R3(3.3.3.3) ↔ R4(4.4.4.4) 通过直连接口建邻

0.2. 二、路由 200.1.1.0/24 在 AS 100 的传播流水线

0.2.1. 第 1 站:R4 → R3(EBGP)

1
2
3
NLRI:    200.1.1.0/24
NH: 10.0.0.4 (R4 自己接口 IP, EBGP 默认行为)
AS_PATH: [200]

R3 处理:NHT 检查 NH 直连 ✓ → 进 BGP 表 → best → 决定通告给 IBGP 邻居。

0.2.2. 第 2 站:R3 → R1、R3 → R2(IBGP,关键点)

R3 配了 next-hop-self,所以通告内容是:

1
2
3
4
NLRI:       200.1.1.0/24
NH: 3.3.3.3 ← ⭐ 改写成 R3 自己 Loopback (不是 10.0.0.4!)
AS_PATH: [200] ← IBGP 不修改 AS_PATH
LOCAL_PREF: 100 ← IBGP 必带

R1/R2 处理:NHT 查 OSPF 表 → 3.3.3.3 可达 ✓ → 装内核 RIB(递归解析后的真实出口)。

0.2.3. 第 3 站:R3 反向 → R4(EBGP)

如果 AS 100 内部有路由要通告给 AS 200(如 R1 originate 100.1.1.0/24),R3 在向 R4 发出时:

1
2
3
4
NLRI:    100.1.1.0/24
NH: 10.0.0.3 ← R3 自己接口 IP (EBGP 强制改 NH)
AS_PATH: [100] ← R3 把自己 AS 100 前置
(LOCAL_PREF 不发, EBGP 不带这个属性)

0.3. 三、每个路由器的核心动作

路由器 收到什么 处理 传给谁
R3(EBGP 入口) 200.1.1.0/24, NH=10.0.0.4 NHT 直连 ✓,进 BGP 表 IBGP 转给 R1、R2,改 NH=3.3.3.3,AS_PATH 不变
R1(IBGP 收方) 200.1.1.0/24, NH=3.3.3.3 NHT 查 OSPF→via R2 ✓,装内核 不再转发(IBGP 水平分割)
R2(IBGP 收方) 同 R1 装内核出口指向 R3 不再转发
R3(EBGP 出口反向) 自己 originate / IBGP 学到的本 AS 路由 应用出向策略 EBGP 给 R4,改 NH=10.0.0.3,AS_PATH 前置 100

0.4. 四、EBGP vs IBGP 的关键行为差异

行为 EBGP IBGP
通告时改 AS_PATH 前置自己 AS 不改
通告时改 NEXT_HOP 改成自己接口 IP 不改(除非配 next-hop-self
学到后再传给同协议邻居 不传(水平分割,需 full-mesh 或 RR)
是否传 LOCAL_PREF

0.5. 五、数据包真实转发路径(目的 200.1.1.5)

1
2
3
4
R1 → 查表 NH=3.3.3.3 → 递归到 12.0.0.2 → 发给 R2
R2 → 查表 NH=3.3.3.3 → 递归到 23.0.0.3 → 发给 R3
R3 → 查表 NH=10.0.0.4 → 直连 → 发给 R4
R4 → AS 200 内部接力 → 200.1.1.5

包头 DstIP 始终是 200.1.1.5,每跳只换 L2 MAC

NH 在每跳的认知不同:

  • R1 认为 NH = 3.3.3.3(递归到 R2)
  • R2 认为 NH = 3.3.3.3(递归到 R3)
  • R3 认为 NH = 10.0.0.4(直连)

0.6. 六、IBGP 建邻规则(核心问题)

0.6.1. 原则:AS 内任意两台跑 BGP 的路由器之间都要建 IBGP 邻居

不是“全员都连边界 R3”,而是两两互联(full-mesh)。原因是 IBGP 水平分割

从 IBGP 邻居学到的路由,不再传给其他 IBGP 邻居

0.6.2. 这个例子需要建 3 条 IBGP 会话

1
2
3
R1 ←──IBGP──→ R3   ✓ 必须
R2 ←──IBGP──→ R3 ✓ 必须
R1 ←──IBGP──→ R2 ✓ 必须 (即使 R2 不在边界)

0.6.3. 为什么 R1↔R2 也要建?反例验证

假设只建 R1↔R3 和 R2↔R3:

  • R3 是边界 originator,向 R1/R2 通告外部路由 → 能 work
  • 但反过来:R1 自己 originate 100.1.1.0/24 → R3 收到(IBGP)→ R3 不能再转给 R2(水平分割)→ R2 学不到 → 数据面黑洞 ❌

所以必须 R1↔R2 也建邻,才能保证任何方向的路由都被 AS 内所有路由器学到。

0.6.4. 全互联会话数公式

$$\frac{N(N-1)}{2}$$

N 会话数
3 3
10 45
50 1225
100 4950

节点一多就爆炸——所以大规模 AS 不直接用 full-mesh。


0.7. 七、大规模 AS 的两种解法

0.7.1. 方案 1:路由反射器 RR(生产主流)

1
2
3
4
5
6
     ┌──── RR ────┐
│ ↑ │
│ IBGP×N │
┌────┼─────┴──────┼────┐
R1 R2 R3 ... Rn
(普通 IBGP client, 只和 RR 建邻)
  • 所有路由器只和 RR建一条 IBGP(共 N 条会话)
  • RR 收到 client 的路由后,特许”反射”给其他 client(突破水平分割,RFC 4456)
  • N=100 时从 4950 条降到 100 条

0.7.2. 方案 2:BGP Confederation 联邦

把大 AS 拆成多个子 AS,子 AS 内部 full-mesh,子 AS 之间用类 EBGP(保留 LP/MED 等 IBGP 属性)。复杂度比 RR 高,使用较少。


0.8. 八、”建邻”和”学到路由”的区别

概念 说明
谁要学到 BGP 路由 AS 内所有要转发该流量的路由器(包括中间纯转发节点)
谁要建 IBGP 会话 只有上面那些路由器之间需要建

反例:如果 R2 是纯 L2/MPLS 中间节点(数据面靠 MPLS 标签转发,不查 IP 路由表),R2 不需要跑 BGP——这就是运营商骨干的 MPLS BGP-Free Core 设计:核心 P 路由器不跑 BGP,只有边缘 PE 跑。


0.9. 九、关键结论速查

  1. OSPF + IBGP 缺一不可:OSPF 管 AS 内拓扑(Loopback 互通),IBGP 管 AS 间路由(外部网段)。
  2. next-hop-self 是 IBGP 部署最佳实践——让 IBGP 的 NH 简化为本 AS 内地址,OSPF 自然能解析,不污染 IGP。
  3. EBGP 跨 AS 才前置 AS_PATH 和强制改 NH;IBGP 内部默认透传。
  4. IBGP 水平分割强制要求 full-mesh 或 RR——不能靠”中转”传播。
  5. 数据包能转发的前提:路径上每台路由器都装入了该 BGP 路由 + 能递归解析 NH 到物理出口。

EBGP:跨AZ的路由学习心得
https://martinbj2008.github.io/2026/06/26/2026-06-26-as100-ibgp-ospf-notes.ai/
Author
Martinbj2008
Posted on
June 26, 2026
Licensed under