本页课程原文(点开阅读)

iBGP 自治系统内部路由

课程(6 节,按顺序学)

第 1 课 · 为什么 AS 内部还需要 iBGP

入门 · 约 8 分钟

本课目标:搞清楚 iBGP 存在的唯一理由。

问题:外部路由怎么进到 AS 内部

假设 AS100 有三台设备 R1、R2、R3,只有 R1 和外面的 AS200 建了 eBGP。
R1 从 AS200 学到了 20.2.2.0/24。现在 R2、R3 怎么知道这条路由?

不能用 OSPF 引入。互联网上有 90 多万条路由,全塞进 OSPF 会直接把设备压垮 —— IGP 的设计目标是快速收敛小规模拓扑,不是承载海量路由。

所以需要在 AS 内部再跑一个 BGP:iBGP。它的唯一职责就是把外部路由在 AS 内部搬运。

iBGP 和 eBGP 的行为差异(就这几条)

| | eBGP | iBGP |
|---|---|---|
| AS 号 | 不同 | 相同 |
| 要求直连 | 是(TTL=1) | 否,IGP 可达就行 |
| AS_PATH | 加自己的 AS | 不变 |
| NEXT_HOP | 改成自己 | 不变 |
| LOCAL_PREF | 不传 | 传 |
| 防环 | AS_PATH | 水平分割 |

后面几课全在讲后两行带来的坑。

动手:看 iBGP 邻居

加载「下一跳不可达」拓扑,去「拓扑与邻居」页。
注意 AS100 里的三台设备两两都有 iBGP 邻居(全连接),而且用 Loopback 建会话。

实验重点

  • iBGP 的唯一职责是在 AS 内部搬运外部路由
  • 不能把 BGP 路由引入 OSPF —— 量级完全不匹配
  • iBGP 通告时 AS_PATH 和 NEXT_HOP 都不变

第 2 课 · iBGP 为什么用 Loopback + 全连接的代价

入门 · 约 10 分钟

本课目标:两个惯例背后的原因。

为什么用 Loopback 建会话

物理接口 down 了,用它建的会话就断,BGP 要重新收敛。
而 AS 内部往往有多条路径,只要设备还活着就应该能走通。

Loopback 是逻辑接口,只要设备不挂就一直 up。用它建会话,某条链路断了 IGP 换条路走,BGP 会话完全不受影响。

命令:peer <对端Loopback> connect-interface LoopBack0
前提:AS 内部的 IGP 必须把 Loopback 地址宣告出去,否则会话地址不可达。

全连接的数量爆炸

因为有水平分割(下一课),iBGP 必须两两全连接。

n 台设备需要 n(n-1)/2 个会话:
· 5 台 → 10 个
· 10 台 → 45 个
· 50 台 → 1225 个

这不只是配置量的问题:每个会话都要维护 TCP 连接、保存一份 Adj-RIB-In,内存和 CPU 都吃不消。

所以现网都用 路由反射器 RR(第 5 课)或联邦来替代全连接。

动手:数一数

在「拓扑与邻居」页看 AS100 里的 iBGP 会话数,然后想想如果加到 10 台要配多少条。

实验重点

  • iBGP 用 Loopback 建会话,链路故障不影响会话
  • 前提是 IGP 宣告了 Loopback 地址
  • 全连接需要 n(n-1)/2 个会话,规模一大就撑不住

第 3 课 · iBGP 水平分割(第一大坑)

排障 · 约 14 分钟

本课目标:理解为什么 AS 内部不能把 iBGP 串成一条链。

规则原文

从 iBGP 邻居学到的路由,不会再通告给其它 iBGP 邻居。

简记:iBGP 只传一跳。

为什么要有这条规则

eBGP 靠 AS_PATH 防环 —— 每跨一个 AS 就加一个 AS 号,看到自己的就丢。

但 iBGP 在 AS 内部传递时 AS_PATH 完全不变,所以没法用 AS_PATH 判断「这条路由是不是绕回来了」。

既然没法判环,那就干脆不让它二次传播 —— 这就是水平分割。
代价是必须全连接,好处是绝对不会环。

动手:亲眼看 R3 学不到

加载「iBGP 水平分割」拓扑:AS100 里只配了 R1↔R2 和 R2↔R3,缺 R1↔R3。
R4(AS200)发布了 20.2.2.0/24。

去②拓扑与邻居页点「控制面 Traffic」:
① R1 从 eBGP 学到 → 通告给 iBGP 邻居 R2(这一跳可以);
② R2 想再通告给 R3 → 被水平分割挡住,右边的讲解会直接告诉你规则和解决办法;
③ 再点「数据面 Traffic」,能看到 R3 那一行标着「✗ 不可达」。

三种解决办法

① iBGP 全连接:补上 R1↔R3。小网络最直接。
② 路由反射器 RR:把 R2 设成 RR,R1 和 R3 设成它的客户端。RR 被允许把客户端的路由反射给其它 iBGP 邻居。
③ 联邦(Confederation):把大 AS 切成若干子 AS,子 AS 之间跑类 eBGP。配置复杂,现网用得比 RR 少。

动手:回「拓扑与邻居」页补一个 R1↔R3 的邻居,再回来看。
⚠️ 你会发现 R3 收到了路由但还是用不了 —— 因为新建的这个 iBGP 会话同样需要在 R1 侧配 next-hop-local(下一课的内容)。两个坑经常连在一起出现,这也是 BGP 排障要按顺序一层层剥的原因。

实验重点

  • 从 iBGP 学到的路由不再通告给其它 iBGP 邻居 —— iBGP 只传一跳
  • 根因是 iBGP 传递时 AS_PATH 不变,无法防环
  • 解决:全连接 / RR / 联邦

第 4 课 · 下一跳不可达(第二大坑)

排障 · 约 14 分钟

本课目标:理解「路由在表里却用不了」到底怎么回事。

现象

display bgp routing-table 能看到这条路由,但:
· 前面没有 * 标记(invalid)
· 没有进 IP 路由表
· ping 不通

而邻居状态一切正常,路由也确实收到了。新手到这里通常就懵了。

根因

R1(AS100 边界)从 R4(AS200)学到 20.2.2.0/24,NEXT_HOP 是 172.16.14.2(R4 在互联链路上的地址)。

R1 把这条路由通告给 iBGP 邻居 R2 时,NEXT_HOP 不变,还是 172.16.14.2。

但 R2 的 IGP(OSPF)里只有 AS100 内部的网段,根本没有 172.16.14.0/30 这条路由 —— 那是 AS 之间的互联地址,AS100 的 IGP 不会宣告它。

于是 R2 拿到一个到不了的下一跳 → 选路第 1 条规则直接把它判为无效。

动手:看诊断

加载「下一跳不可达」拓扑,去②拓扑与邻居页点「控制面 Traffic」播放 20.2.2.0/24。
在 R1 → R2 那一步,右边的讲解会标出「NEXT_HOP 保持不变」并警告下一跳不可达;
再点「数据面 Traffic」,能看到 R2、R3 都标着「✗ 不可达」,原因写的是下一跳不可达,而不是水平分割。

解法:next-hop-local

在边界设备(R1)上,对它的 iBGP 邻居配:

peer 2.2.2.2 next-hop-local

(思科:neighbor 2.2.2.2 next-hop-self)

含义:把通告给这个 iBGP 邻居的路由,下一跳改成我自己(R1 的 Loopback)。R1 的 Loopback 在 AS100 的 IGP 里,所以 R2 到得了。

记忆点:next-hop-local 配在边界设备上,方向是朝 iBGP 邻居。

动手:去「拓扑与邻居」页选中 R1↔R2 邻居,勾上 next-hop-local,再回来看路由变有效了。

另一个理论上可行但不推荐的办法:把 AS 之间的互联网段也宣告进 IGP。不推荐是因为把外部地址引入内部 IGP 既不安全也不好维护。

实验重点

  • iBGP 通告不改 NEXT_HOP,导致内部设备拿到别的 AS 的地址
  • IGP 不会宣告 AS 间互联网段,所以那个下一跳不可达
  • 路由无效的标志:没有 * 标记、不进 IP 路由表
  • 解法:边界设备对 iBGP 邻居配 next-hop-local

第 5 课 · 路由反射器 RR

进阶 · 约 14 分钟

本课目标:用 RR 摆脱 iBGP 全连接,并理解它自己的防环机制。

RR 做了什么

RR 是对水平分割规则的一个例外授权:

把某台设备设为 RR,再把一部分 iBGP 邻居标记成它的客户端(client),剩下的是非客户端。反射规则:

· 从客户端学到的路由 → 反射给所有 iBGP 邻居(其它客户端 + 非客户端)
· 从非客户端学到的路由 → 只反射给客户端
· 从 eBGP 学到的路由 → 发给所有 iBGP 邻居(这本来就允许)

客户端自己什么都不用改,它甚至不知道对面是 RR。
于是 n 台设备从 n(n-1)/2 个会话降到 n-1 个。

RR 自己怎么防环

放开了水平分割,就得补新的防环机制,靠两个属性:

· ORIGINATOR_ID:记录路由最初是哪台设备发进 AS 的(它的 Router-ID)。设备收到 Originator_ID 等于自己的路由,说明绕回来了,丢弃。

· CLUSTER_LIST:每被一个 RR 反射一次,就在最前面加上那个 RR 的 Cluster-ID。RR 看到列表里已经有自己的 Cluster-ID,说明转圈了,丢弃。
顺带 Cluster_List 越短越优(选路第 10 条规则)。

动手:看 RR 反射

加载「路由反射器」拓扑:RR 是反射器,R1 和 R3 是它的客户端,R3 还和 AS200 的 R4 建了 eBGP。
去②拓扑与邻居页点「控制面 Traffic」播放 20.2.2.0/24:
① R3 从 eBGP 学到,通告给 RR;
② RR 反射给客户端 R1 —— 注意这一步在没有 RR 的情况下会被水平分割挡住;
③ 点开这一步,「属性变化」里能看到多了 Originator_ID 和 Cluster_List 两个属性。

实验重点

  • RR 是对 iBGP 水平分割的例外授权
  • 从客户端来的反射给所有 iBGP 邻居;从非客户端来的只反射给客户端
  • 客户端无需任何特殊配置
  • RR 靠 Originator_ID 和 Cluster_List 防环

第 6 课 · LOCAL_PREF 与 AS 内统一出口策略

进阶 · 约 10 分钟

本课目标:理解为什么控制出向流量要用 LOCAL_PREF。

LOCAL_PREF 的定位

· 默认 100,越大越优,选路第 3 条规则(很靠前,所以很好用)。
· 只在 AS 内部传递,绝不发给 eBGP 邻居。

正因为它在 AS 内部随 iBGP 传播,所以它表达的是整个 AS 的统一意志:不管流量从哪台内部设备发起,大家都同意从某个出口出去。

典型场景

AS100 双归到两家 ISP:AS200 是主用(大带宽),AS300 是备用。

做法:在连 AS200 的边界设备上,对入方向的路由 apply local-preference 200。
这条 LOCAL_PREF=200 会随 iBGP 传遍 AS100 所有设备,于是全 AS 一致地优选走 AS200 出去。AS200 断了自动切到 AS300。

对比记忆:
· 想改自己出去的路径 → 调 LOCAL_PREF(在自己 AS 内说了算)
· 想改别人进来的路径 → 调 AS_PATH prepend 或 MED(只能建议,对方可以不听)

动手:在脑子里翻转选路

自己过一遍这两条假设的候选路由:

A: AS_PATH=[200]           LOCAL_PREF=100
B: AS_PATH=[200,300,400]   LOCAL_PREF=200

先凭直觉猜一下谁赢,再按规则顺序真的算一遍:Preferred-Value 平(第 2 条)→ LOCAL_PREF 在第 3 条就分出高低,B 的 200 比 A 的 100 大,后面 AS_PATH 长度根本不看了。

结论会很反直觉:AS_PATH 长得多的 B 反而赢了,因为 LOCAL_PREF 是第 3 条规则,AS_PATH 要等到第 5 条才轮到——前面已经分出高低的规则,后面的规则完全不影响结果。

实验重点

  • LOCAL_PREF 默认 100,越大越优,是选路第 3 条
  • 只在 AS 内传递,代表整个 AS 的统一出口意志
  • 改出向用 LOCAL_PREF,改入向用 AS_PATH prepend / MED
  • LOCAL_PREF 比 AS_PATH 更早比较,会压过它
冀ICP备2026021556号-2|冀公网安备13068302000206号