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 路由就会因“下一跳不可达”而无法进入优选,也就不会被安装进路由表。
三、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 路由“通告了但邻居没收到”或“收到了但不优选”时,可按以下顺序定位:
- 在发送方执行
show ip bgp,确认该前缀是否已进入本地 BGP 表(带*>表示有效)。若没有,检查 network 是否有精确匹配的本地路由,或 redistribute 是否被 route-map 过滤。 - 执行
show ip bgp neighbors <邻居> advertised-routes,确认该前缀是否真的被发出,以及下一跳字段是什么。 - 在接收方执行
show ip bgp,查看前缀状态。若显示r或下一跳不可达,用show ip route <下一跳>验证可达性。 - 根据结果决定是否在发送方 iBGP 会话上加
next-hop-self,或在接收方补充到下一跳的 IGP 路由。
理解 network 的“精确匹配”语义、redistribute 的批量特性、iBGP 下一跳保持的默认行为,以及 next-hop-self 的改写方向,就能把绝大多数 BGP 通告与可达性问题定位到具体设备的具体命令上。下一跳可达性是 BGP 优选的前置条件,任何属性比较都发生在下一跳可达之后。