3. BGP路由通告与优选基础

BGP 本身不发现路由,它只负责把已经存在于本地路由表中的路由“搬运”给邻居。理解这一点,是掌握 BGP 通告与优选的前提。本节围绕四个相互咬合的问题展开:一条路由如何进入 BGP、下一跳如何被改写、BGP 表与 IP 路由表是什么关系、以及如何用最少的命令验证选路结果。

一、Network 与 Redistribute:两种把路由“喂”给 BGP 的方式

在 Cisco IOS 中,把路由注入 BGP 有两条主路径。network 命令是精确通告:它按“前缀 + 掩码”逐条匹配,只有当本地路由表中存在一条完全一致的路由(前缀和掩码都相同)时,该前缀才会被放入 BGP 表并通告出去。注意它并不“产生”路由,只是把已有路由标记为可通告。

router bgp 65001
 network 10.1.1.0 mask 255.255.255.0
 network 192.168.10.0 mask 255.255.255.252

如果本地路由表里是 10.1.1.0/24 而配置写成 network 10.1.0.0 mask 255.255.0.0,则不会通告任何东西——这是初学者最常见的“配了却不生效”的原因。

redistribute 命令是批量引入:它把某个路由协议或直连/静态路由整体重分发进 BGP,并可用 route-map 做过滤与属性设置。

router bgp 65001
 redistribute ospf 1 route-map OSPF-TO-BGP
!
route-map OSPF-TO-BGP permit 10
 match ip address prefix-list ALLOW-LIST
 set metric 100
 set community 65001:100 additive

两者的关键差异在于:network 是“白名单式”精确控制,适合对外发布少量明确前缀;redistribute 是“批量导入”,必须配合 route-map 或 prefix-list 才能避免把不该发布的路由(如内部管理网段)泄露出去。工程上常见做法是:对外通告用 network,内部互联或过渡场景用 redistribute 加严格过滤。

二、Next-Hop 处理:eBGP 与 iBGP 的分水岭

下一跳是 BGP 选路和可达性的核心。规则可以概括为:

  • eBGP:默认把下一跳改为“本端与邻居相连的接口地址”(即自己)。
  • iBGP:默认不修改下一跳,从 eBGP 学到的外部下一跳会原样传给 iBGP 邻居。

这带来一个经典问题:iBGP 邻居收到路由后,下一跳指向的是外部 AS 的地址,而本路由器可能没有到达该地址的路由,导致路由虽在 BGP 表中却不可用。解决办法有两种:一是在边界路由器上用 next-hop-self 把下一跳改为自己;二是保证内部 IGP 能到达该外部下一跳。

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

此外,多路访问网段(如以太网)上运行 eBGP 时,若第三方路由器也在同一网段,可用 next-hop-unchanged 保留原始下一跳以优化路径。下一跳是否可达,直接决定 BGP 路由能否进入 IP 路由表。

三、BGP 表与 IP 路由表:两张表,一条链

BGP 表(show ip bgp)保存的是“BGP 认为可用的候选路由”,包含本地始发、从邻居学到的所有路径及其属性。IP 路由表(show ip route)保存的是“最终用于转发的路由”。两者之间有一条明确的判定链:

  1. 下一跳必须在 IGP 或直连中可达;
  2. 该路由必须通过 BGP 的入向策略(如 filter-list、route-map);
  3. 在 BGP 表内完成优选(weight、local-preference、AS_PATH 长度、origin、MED 等);
  4. 最优路径被“安装”进 IP 路由表,管理距离为 eBGP 20、iBGP 200。

因此会出现“BGP 表里有,路由表里没有”的现象,通常就是下一跳不可达或策略拒绝。验证时应先看 show ip bgp 中该前缀的状态码:* 表示有效,> 表示最优,r 表示 RIB 失败(下一跳不可达),h 表示历史记录。

BGP 通告与优选:从路由源到转发表的判定链 路由来源 network 精确匹配 redistribute 批量引入 注入 BGP 表 (show ip bgp) 候选路径 + 属性 Weight / Local-Pref AS_PATH / Origin / MED 状态码: * > r h 优选 IP 路由表 (show ip route) 最终转发路径 eBGP AD=20 / iBGP AD=200 下一跳必须可达 B 标记 = BGP 来源 Next-Hop 处理规则 eBGP:改为本端接口地址 (默认改写) iBGP:默认不改写 需 next-hop-self 或 IGP 可达 MA 网段:next-hop-unchanged 保留原始下一跳 基本选路验证命令 show ip bgp summary 邻居状态与前缀数 show ip bgp <prefix> 查看属性与最优标记 show ip route bgp 确认是否装入转发表

四、基本选路验证:从命令到判断

验证 BGP 选路,建议按“邻居—BGP 表—路由表”的顺序推进。先确认邻居是否 Established:

show ip bgp summary
Neighbor    V   AS   MsgRcvd MsgSent  TblVer  InQ OutQ Up/Down  State/PfxRcvd
10.0.0.2    4 65001   120     118      15      0    0 00:45:12        8

PfxRcvd 为 0 说明邻居虽建立但未收到前缀,常见原因是对方未通告或本端入向策略拒绝。接着查看具体前缀:

show ip bgp 10.1.1.0/24
BGP routing table entry for 10.1.1.0/24, version 12
Paths: (2 available, best #1, table default)
  Advertised to update-groups:
     1
  65002 65003
    10.0.0.2 from 10.0.0.2 (10.0.0.2)
      Origin IGP, metric 0, localpref 100, valid, external, best
  65004
    10.0.0.6 from 10.0.0.6 (10.0.0.6)
      Origin IGP, metric 0, localpref 100, valid, external

输出中 best 标记在第一条路径上,说明它被选中。两条路径 localpref 相同,第一条 AS_PATH 更短(65002 65003 共 2 跳,第二条 65004 为 1 跳?此处示例中第一条实际更长,仅作格式演示,真实判断以 AS_PATH 长度为准)。实际排障时,应逐项比对 weight、local-preference、AS_PATH、origin、MED,定位是哪一条属性决定了结果。

最后确认是否进入转发表:

show ip route 10.1.1.0
Routing entry for 10.1.1.0/24
  Known via "bgp 65001", distance 20, metric 0
  Tag 65002, type external
  Last update from 10.0.0.2 00:12:33 ago
  * 10.0.0.2, from 10.0.0.2, 00:12:33 ago
      AS Hops 2
      Route tag 65002

若这里没有输出,而 BGP 表中该前缀有效,则问题几乎一定出在下一跳可达性或 RIB 安装环节。掌握这条“来源→BGP 表→优选→路由表”的链路,后续学习 weight、local-preference、MED 等属性时,就能清楚知道每一步在整条链上的位置与作用。