4. BGP路由通告与下一跳

BGP 本身不发现路由,它只负责把已经存在于本地路由表或其他协议中的前缀“搬运”给邻居。因此,一条前缀能否被通告出去、邻居能否把它装进 BGP 表并最终优选,取决于三个环节:本地如何产生这条 BGP 路由、通告时下一跳属性是什么、接收方能否到达这个下一跳。这三个环节中任何一个断裂,路由都不会真正生效。

一、network 与 redistribute:两种把路由引入 BGP 的方式

network 命令的语义常被误解。在 Cisco IOS 中,network 10.1.1.0 mask 255.255.255.0 并不是“凭空宣告一个网段”,而是“在本地路由表中查找一条精确匹配该前缀和掩码的路由,如果存在,就把它引入 BGP”。这条来源路由可以是直连、静态、OSPF、EIGRP 等任意协议。若本地没有精确匹配项,命令不会报错,但不会有任何前缀被通告——这是初学者最常见的“配置了却不生效”的原因。

! 前提:本地路由表已有 10.1.1.0/24(直连或静态)
router bgp 65001
 network 10.1.1.0 mask 255.255.255.0
! 若本地只有 10.1.0.0/16,则上面这条不会产生任何通告

redistribute 则是按协议整体注入,例如 redistribute ospf 1 会把 OSPF 学到的路由批量引入 BGP。它更省事,但控制粒度粗,容易把不该外泄的前缀一起带出去,通常需要配合 route-map 做过滤。二者的关键差异是:network 是“精确点名”,redistribute 是“按来源批量导入”。工程上更推荐用 network 逐条控制对外通告,redistribute 仅用于确有批量需求的场景。

二、下一跳属性:BGP 最容易被忽视的字段

BGP 路由携带 NEXT_HOP 属性。对于从 eBGP 邻居学到的路由,下一跳默认是发送该路由的 eBGP 邻居接口地址;对于从 iBGP 邻居学到的路由,下一跳默认保持不变,仍指向最初注入该路由的 eBGP 边界地址。这个“iBGP 不修改下一跳”的默认行为,正是大量路由可达性问题的根源。

设想 AS 65001 内部有 R1(边界,与外部 AS 65002 的 R2 建 eBGP)和 R3(内部,与 R1 建 iBGP)。R1 从 R2 学到 203.0.113.0/24,下一跳是 R2 的接口地址。R1 通过 iBGP 转给 R3 时,下一跳仍是 R2 的地址。R3 若没有到达 R2 接口地址的路由(例如该地址不在 OSPF 域内),这条 BGP 路由就会因“下一跳不可达”而无法进入优选,也就不会被安装进路由表。

iBGP 下一跳保持 vs next-hop-self 对比 AS 65001 R1 边界 eBGP + iBGP R3 内部 iBGP 邻居 iBGP R2 外部 AS 65002 eBGP 203.0.113.0/24 下一跳 = R2 接口地址 默认行为(无 next-hop-self) R1→R3 下一跳仍为 R2 地址 R3 若无到 R2 地址的路由 → 下一跳不可达,路由不优选 配置 next-hop-self R1→R3 下一跳改为 R1 地址 R3 通过 IGP 可达 R1 接口 → 下一跳可达,路由优选

三、next-hop-self 的作用与适用位置

neighbor x.x.x.x next-hop-self 的作用是:在向指定邻居发送 BGP 更新时,把 NEXT_HOP 改写为本机与该邻居相连的接口地址。它通常配置在 iBGP 会话上,让内部路由器把下一跳指向自己,从而借助 IGP 保证可达性。

router bgp 65001
 neighbor 10.0.0.3 remote-as 65001
 neighbor 10.0.0.3 next-hop-self

需要注意:next-hop-self 只影响发送方向,即只改变本机向该邻居通告时的下一跳,不改变本机接收到的路由的下一跳。它也不是越多越好——在路由反射器或全互联 iBGP 场景中,若所有边界都改写下一跳,可能掩盖真实的出口信息,影响流量工程。因此应结合拓扑有选择地使用。

四、第三方下一跳与路由可达性

“第三方下一跳”(third-party next-hop)指 BGP 更新中的 NEXT_HOP 既不是发送方,也不是接收方,而是链路上的第三个设备。典型场景是共享以太网段上的多路访问:R1、R2、R3 同处一个广播域,R1 与 R2 建 eBGP,R1 与 R3 建 iBGP。R1 从 R2 学到的路由下一跳是 R2 的接口地址,R1 转给 R3 时若不做 next-hop-self,R3 收到的下一跳仍是 R2 地址。由于 R3 与 R2 在同一网段,R3 可以直接 ARP 到 R2,这条路由反而可达——这就是第三方下一跳能正常工作的原因。

但若 R3 与 R2 不在同一网段,且 R3 没有到 R2 接口地址的路由,第三方下一跳就会失效。判断标准很简单:接收方必须能通过 IGP、直连或静态路由到达 NEXT_HOP 地址。BGP 优选过程中,下一跳不可达的路由会被直接排除,不会进入路由表。

排查下一跳问题的常用命令:show ip bgp 查看前缀的下一跳与状态码;show ip bgp neighbors x.x.x.x advertised-routes 查看本机实际发出的下一跳;show ip route <next-hop> 确认接收方能否到达该地址。若 show ip bgp 中前缀前有 r 标记(RIB failure),往往就是下一跳不可达或递归失败。

五、一个可复现的判断流程

当一条 BGP 路由“通告了但邻居没收到”或“收到了但不优选”时,可按以下顺序定位:

  1. 在发送方执行 show ip bgp,确认该前缀是否已进入本地 BGP 表(带 *> 表示有效)。若没有,检查 network 是否有精确匹配的本地路由,或 redistribute 是否被 route-map 过滤。
  2. 执行 show ip bgp neighbors <邻居> advertised-routes,确认该前缀是否真的被发出,以及下一跳字段是什么。
  3. 在接收方执行 show ip bgp,查看前缀状态。若显示 r 或下一跳不可达,用 show ip route <下一跳> 验证可达性。
  4. 根据结果决定是否在发送方 iBGP 会话上加 next-hop-self,或在接收方补充到下一跳的 IGP 路由。

理解 network 的“精确匹配”语义、redistribute 的批量特性、iBGP 下一跳保持的默认行为,以及 next-hop-self 的改写方向,就能把绝大多数 BGP 通告与可达性问题定位到具体设备的具体命令上。下一跳可达性是 BGP 优选的前置条件,任何属性比较都发生在下一跳可达之后。