EBGP:跨AZ的路由学习心得
整理自实际配置场景的讨论笔记,覆盖:路由传播流水线、EBGP/IBGP 行为差异、
next-hop-self、IBGP 建邻规则、扩展性问题与解法。
0.1. 一、拓扑
1 | |
协议部署:
- 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 | |
R3 处理:NHT 检查 NH 直连 ✓ → 进 BGP 表 → best → 决定通告给 IBGP 邻居。
0.2.2. 第 2 站:R3 → R1、R3 → R2(IBGP,关键点)
R3 配了 next-hop-self,所以通告内容是:
1 | |
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 | |
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 | |
包头 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 | |
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 | |
- 所有路由器只和 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. 九、关键结论速查
- OSPF + IBGP 缺一不可:OSPF 管 AS 内拓扑(Loopback 互通),IBGP 管 AS 间路由(外部网段)。
next-hop-self是 IBGP 部署最佳实践——让 IBGP 的 NH 简化为本 AS 内地址,OSPF 自然能解析,不污染 IGP。- EBGP 跨 AS 才前置 AS_PATH 和强制改 NH;IBGP 内部默认透传。
- IBGP 水平分割强制要求 full-mesh 或 RR——不能靠”中转”传播。
- 数据包能转发的前提:路径上每台路由器都装入了该 BGP 路由 + 能递归解析 NH 到物理出口。
EBGP:跨AZ的路由学习心得
https://martinbj2008.github.io/2026/06/26/2026-06-26-as100-ibgp-ospf-notes.ai/