关键词:BGP、路由黑洞、Next_Hop不可达、iBGP、eBGP、路由黑洞、递归查找
第93篇:BGP 路由黑洞的产生与避免
一、引言
BGP 路由黑洞是指 BGP 路由表存在某条路由条目,但该路由的 Next_Hop 地址在 IGP 路由表中不可达,导致流量到达路由器后被丢弃的现象。黑洞不产生任何告警或日志——数据包进入路由器后查表发现 Next_Hop 不可达,直接被静默丢弃。
路由黑洞是 BGP 网络中最隐蔽、最难排查的故障之一。理解黑洞产生的根因和排查方法,对维护大规模 BGP 网络至关重要。
二、核心概念
2.1 BGP 路由转发的递归查找
BGP 选路完成后,路由器需要确定数据包的实际出接口。这个过程涉及两次路由查找:

关键点:如果 IGP 中没有到达 Next_Hop 的路由,BGP 路由条目的状态为 Invalid,不会安装到 FIB(转发表),数据包到达后直接被丢弃——这就是黑洞。
2.2 黑洞的产生条件
| 条件 | 说明 |
|---|---|
| BGP 路由存在 | BGP 路由表中存在某条路由,且状态为 Valid |
| Next_Hop 不可达 | 该路由的 Next_Hop IP 在 IGP/静态路由中无匹配路由 |
| 无默认路由兜底 | 没有默认路由可以兜底转发到 Next_Hop |
2.3 iBGP 与 eBGP 的 Next_Hop 行为
Next_Hop 属性的处理方式直接影响黑洞风险:
| 场景 | Next_Hop 行为 | 黑洞风险 |
|---|---|---|
| eBGP 接收 | Next_Hop = 对等体 IP | 低(直连可达) |
| iBGP 接收(默认) | Next_Hop 不修改,保持上游 eBGP Next_Hop | 高(可能不可达) |
| iBGP(next-hop-local) | Next_Hop = 本地 IP | 低(通过 IGP 可达) |
三、技术细节
3.1 iBGP Next_Hop 黑洞(最常见)
iBGP Speaker 从 eBGP 学到路由后,通过 iBGP 传递给其他 iBGP Speaker 时,默认不修改 Next_Hop。如果接收方没有到达该 Next_Hop 的路由,就会产生黑洞。

问题:R3 从 R1 通过 iBGP 学到路由,Next_Hop 为 1.1.1.1(eBGP 对端 IP)。如果 R3 的 IGP 中没有到达 1.1.1.1 的路由,发往该目的地的流量会被 R3 丢弃。
3.2 黑洞的产生场景汇总
| 场景编号 | 场景描述 | 根因 |
|---|---|---|
| 1 | iBGP Next_Hop 不可达 | iBGP 不修改 Next_Hop,接收方 IGP 不可达 |
| 2 | Next_Hop 环回口未通告到 IGP | eBGP 使用环回口建邻接,但环回口未发布到 IGP |
| 3 | IGP 路由过滤 | 策略过滤了到达 Next_Hop 的 IGP 路由 |
| 4 | 链路故障 | Next_Hop 可达链路中断,IGP 收敛前产生黑洞 |
| 5 | 路由策略修改 Next_Hop | 手动设置的 Next_Hop 地址不可达 |
| 6 | eBGP Multihop | eBGP 多跳场景下 Next_Hop 非直连且无路由 |
3.3 黑洞的排查方法
# 步骤1:确认BGP路由状态
display bgp routing-table 10.1.1.0 24
# 关注状态标记:*> 表示有效且最优,_> 表示有效但非最优
# 步骤2:检查Next_Hop可达性
display bgp routing-table 10.1.1.0 24 verbose
# 查看 NextHop 字段
# 步骤3:验证IGP路由
display ip routing-table 1.1.1.1
# 如果无输出,说明 Next_Hop 不可达 → 黑洞
# 步骤4:确认FIB表项
display fib 10.1.1.0 24
# 如果无 FIB 表项,说明 BGP 路由未安装到转发表 → 黑洞确认
# 步骤5:检查BGP有效标志
display bgp routing-table peer 192.168.1.2 received-routes
# 关注 [Valid] 标记,Invalid 表示 Next_Hop 不可达
BGP 路由状态标记含义:
| 标记 | 含义 |
|---|---|
| * | Valid(有效),Next_Hop 可达 |
| > | Best(最优) |
| _ | 无效(Invalid),Next_Hop 不可达 |
| d | Dampened(被抑制) |
3.4 黑洞检测方法
方法一:BGP 有效性检查(默认启用)
BGP 在将路由标记为 Valid 之前,会检查 Next_Hop 的可达性。如果不可达,路由标记为 Invalid,不选为 Best。
方法二:Nexthop-Verify 检查
bgp 100
nexthop-verify enable # 启用 Next_Hop 可达性检查(华为默认启用)
方法三:Traceroute 追踪
# 从疑似黑洞路由器 traceroute 到目标网络
traceroute -a <本地源IP> 10.1.1.1
# 如果第1跳就超时,说明黑洞
四、实战配置/案例分析
4.1 场景一:iBGP Next_Hop 黑洞修复
故障拓扑:

问题:R3 从 R1 学到的 BGP 路由 Next_Hop 为 203.0.113.1,但 R3 的 IGP 中没有到达 203.0.113.1/32 的路由。
解决方案:
方案 A:修改 Next_Hop 为本地(推荐)
# R1 上配置:将 iBGP 发出的路由 Next_Hop 修改为本地
bgp 100
peer 192.168.1.2 as-number 100
peer 192.168.1.2 next-hop-local
peer 192.168.1.3 as-number 100
peer 192.168.1.3 next-hop-local
# R2 和 R3 收到的路由 Next_Hop = R1 的 iBGP 对端 IP
# 该 IP 在 IGP 中可达
方案 B:将 eBGP Next_Hop 通告到 IGP
# R1 上将 eBGP Next_Hop 发布到 OSPF
ospf 1
area 0
network 203.0.113.1 0.0.0.0
# 或使用环回口承载
interface LoopBack0
ip address 203.0.113.1 255.255.255.255
ospf 1
area 0
network 203.0.113.1 0.0.0.0
方案 C:配置默认路由兜底
# R3 上添加默认路由指向 R1
ip route-static 0.0.0.0 0 192.168.1.1
# 作为兜底,确保未知 Next_Hop 有路由可达
方案对比:
| 方案 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| next-hop-local | 简单直接,无需额外路由 | Next_Hop 改变,可能影响跨 AS 路由 | ⭐⭐⭐ |
| IGP 通告 Next_Hop | 保持原始 Next_Hop | 需管理额外 IGP 路由 | ⭐⭐ |
| 默认路由兜底 | 配置简单 | 可能影响其他流量转发 | ⭐⭐ |
4.2 场景二:环回口建邻但未发布到 IGP
故障现象:eBGP 使用环回口建立邻接关系,Next_Hop 为环回口 IP,但环回口未发布到 IGP。
# === 故障根因 ===
# R1 配置了环回口作为 eBGP 对端
bgp 100
peer 10.255.0.1 as-number 200
peer 10.255.0.1 connect-interface LoopBack0
peer 10.255.0.1 ebgp-max-hop 3
# 但 OSPF 未发布 LoopBack0
# R2 通过 BGP 学到路由,Next_Hop = 10.255.0.1(对端环回口)
# R2 的 IGP 中无 10.255.0.1 的路由 → 黑洞
# === 修复 ===
# 将环回口发布到 IGP
ospf 1
area 0
network 10.255.0.0 0.0.0.255
4.3 故障案例:策略导致的 Next_Hop 黑洞
故障现象:路由策略修改了 Next_Hop,但新 Next_Hop 地址不可达。
# 错误配置
route-policy SET-NH permit node 10
apply next-hop 10.99.99.1
# 10.99.99.1 不在 IGP 中
# 修复:确保 Next_Hop 可达
route-policy SET-NH permit node 10
apply next-hop 192.168.1.1
# 192.168.1.1 是 IGP 可达的地址
五、总结
| 黑洞类型 | 产生原因 | 修复方案 |
|---|---|---|
| iBGP Next_Hop 不可达 | iBGP 透传 eBGP Next_Hop | 配置 next-hop-local |
| 环回口未入 IGP | 环回口建邻但未发布 | 将环回口发布到 IGP |
| IGP 路由被过滤 | 策略过滤了 Next_Hop 路由 | 修正 IGP 发布策略 |
| 策略修改 Next_Hop | 手动设置的 Next_Hop 不可达 | 确保新 Next_Hop 在 IGP 可达 |
| 链路故障 | 到 Next_Hop 的链路中断 | IGP 快速收敛/部署 FRR |
黑洞预防最佳实践:
1. 在所有 iBGP 对等体上配置 next-hop-local(适用于非全互联 iBGP)
2. 确保所有 eBGP Next_Hop 地址在 IGP 中可达
3. 定期检查 BGP 路由表中是否存在 Invalid 状态的路由
4. 部署 BGP Nexthop-Verify 检测机制
5. 在边界路由器上配置默认的兜底路由
思考
- BGP 在将路由标记为 Valid 时会检查 Next_Hop 可达性,既然有这层保护,为什么还会有黑洞现象?
- iBGP 默认不修改 Next_Hop 的设计初衷是什么?为什么不是默认就改为本地 IP?
- 在多 AS 互联的复杂场景中,如何系统性排查和定位路由黑洞?
下篇预告:第94篇:eBGP 多跳与 TTL 安全