BGP工程实战:状态机排错、路由震荡与常见故障处理

这篇文章写给谁?

已经配过BGP、在真实网络里踩过坑的你。本文不讲原理(看入门篇),不讲考点(看备考篇),只讲出了故障怎么排

一、BGP排错的黄金三步法

不管是哪个厂商的设备,排错思路都是通的:

1
2
3
① 邻居正常吗? → display bgp peer
② 路由收到了吗? → display bgp routing-table
③ 路由选优了吗? → display bgp routing-table x.x.x.x verbose

铁律:BGP的所有问题,根因必在以上三步之一。不要跳过任何一步。

二、邻居建立故障:状态机排错

BGP邻居状态用一条命令搞定(华为:display bgp peer,思科:show ip bgp summary)。

场景1:状态卡在Idle

1
2
Peer            V   AS  MsgRcvd  MsgSent  OutQ  Up/Down   State
10.1.12.2 4 200 0 0 0 never Idle

立即检查三层

1
2
3
4
5
6
7
8
# 1. BGP邻居的IP地址能ping通吗?
ping 10.1.12.2

# 2. 路由表里有到邻居的路由吗?
display ip routing-table 10.1.12.2

# 3. AS号配对了吗?
display current-configuration configuration bgp

常见根因

原因 排查方向 修复
路由不可达 本地没有去往邻居IP的路由 IGP宣告正确的网段
ACL拦截TCP 179 中间防火墙/ACL 放行TCP 179
AS号配错 peer x.x.x.x as-number 和对方不一致 改AS号
更新源不对 EBGP用Loopback配了但没加多跳 ebgp-max-hop

场景2:状态在Active和Connect之间反复翻转

1
2
3
4
5
10.1.12.2  4  200  0   0   0  00:00:32  Active
# 过几秒...
10.1.12.2 4 200 0 0 0 00:00:08 Connect
# 又开始翻...
10.1.12.2 4 200 0 0 0 00:00:12 Active

这说明TCP连接在32秒重试定时器(ConnectRetry)驱动下反复尝试。

检查步骤

1
2
3
4
5
# 1. TCP 179端口通不通?
telnet 10.1.12.2 179

# 2. 对面有没有配我?(去对端设备上查)
display bgp peer 10.1.12.1

真实案例:某次割接后BGP邻居翻Active。查了半天发现是对端忘了配peer enable——地址族里没激活邻居。

场景3:Established→Idle→Established 反复震荡

1
2
3
# 查看BGP日志
display bgp peer 10.1.12.2 verbose
# 关注 Hold Timer 信息

三大嫌疑

  1. 链路闪断:物理层抖动导致Hold timer超时(默认180秒×3=9分钟?不,180秒后立即断)
  2. 路由策略变更:应用了route-policy导致邻居重置
  3. Notification报文:对面发了Notification主动断

定位命令

1
2
display logbuffer | include BGP     # 查看BGP相关日志
terminal monitor # 开启实时日志监控

三、路由缺失:为什么BGP里看不到这条路由?

排错流程(从外到内)

1
2
3
4
5
6
收到Update了吗?
→ 没有 → 检查发出端:network配置?路由策略过滤?
→ 收到了
→ 入向策略拒绝了?
→ 是 → route-policy/ip-prefix/community-filter
→ 否 → 下一跳不可达 → IGP没有去往Next-Hop的路由

关键命令

1
2
3
4
5
6
7
8
# 看本路由器的BGP Loc-RIB里有没有
display bgp routing-table 10.1.0.0

# 看邻居发过来的原始路由(需要开启入向软配置)
display bgp routing-table peer 10.1.12.2 received-routes

# 看本路由器发给邻居的
display bgp routing-table peer 10.1.12.2 advertised-routes

真实案例:Next-Hop不可达

故障现象:R2从EBGP邻居R1收到了路由,但BGP表中看不到这条路由。

排查过程

1
2
3
4
5
6
7
8
9
10
11
12
# R2上查BGP路由——没有
<R2> display bgp routing-table 10.1.0.0
# 空

# 查邻居收到的路由——有!
<R2> display bgp routing-table peer 10.1.12.1 received-routes
Network NextHop MED LocPrf Path/Ogn
10.1.0.0/16 10.1.12.1 0 200i

# 查路由表——Next-Hop不可达!
<R2> display ip routing-table 10.1.12.1
# 空!

根因:R2上没有去往10.1.12.1的路由(直连路由意外丢失了,接口down)。

教训:BGP的Next-Hop属性是EBGP邻居地址时,本地路由表必须有到该IP的路由(至少是直连路由)。

四、路由震荡:BGP Flapping

什么算震荡?

同一条路由在30秒内被撤销(Withdraw)又宣告(Update)两次以上。

震荡的危害

  • 路由器CPU飙升(每条Update都要重新跑选路算法)
  • 全网路由收敛时间拉长
  • 极端情况下引发级联震荡——一台路由器把震荡传染给全网

解决方案:Route Dampening(路由衰减)

1
2
3
bgp 100
ipv4-family unicast
dampening 15 750 2000 60 # 半衰期15分钟 复用阈值750 抑制阈值2000 最大抑制60分钟

衰减惩罚算法

  • 每次flap,惩罚值+1000
  • 每过半衰期(15分钟),惩罚值减半
  • 惩罚超过抑制阈值(2000)→ 路由被抑制,不安装也不通告
  • 惩罚降到复用阈值(750)以下 → 解除抑制

注意:阻尼只对EBGP路由生效,IBGP不受影响。

真实案例:配置错误引发的震荡

某次变更后,核心路由器CPU飙到95%。排查发现:

  1. 有人在AS边界路由器上误配了network 0.0.0.0——把默认路由通告给了上游ISP
  2. 上游ISP不接受(做了过滤),发Notification拒绝
  3. 但边界路由器反复重试——每32秒一次,产生了大量BGP进程开销
  4. 同时,本地默认路由的存在又短暂地影响了本地选路,导致了出方向流量的反复切换

修复:删掉network 0.0.0.0,CPU立刻恢复正常。

五、选路异常:为什么流量”绕路了”?

场景:用户投诉”访问XX网站变慢了”

1
2
# 查BGP表
display bgp routing-table 8.8.8.0

发现BGP选了路径更长的路(AS-Path更长),而不是最短的。

为什么? 回想13条选路原则——Local-Pref和Weight在AS-Path之前。可能有人改了Local-Pref。

快速定位

1
2
display bgp routing-table 8.8.8.0 verbose
# 看每一条候选路由的各项属性值,逐条对比选路原则

工具:用AS-Path prepend引导入方向流量

如果你想让对端AS少走你这条路(把流量引导到另一条链路上):

1
2
3
4
5
6
route-policy PREPEND permit node 10
apply as-path 65001 65001 65001 additive # 增加3个AS号

bgp 65001
ipv4-family unicast
peer 10.1.1.1 route-policy PREPEND export

这样对端看到的AS-Path会变长,自然就选了另一条路。

六、运维必备命令速查表

目的 华为/H3C 思科IOS
看邻居概要 dis bgp peer show ip bgp summary
看邻居详情 dis bgp peer X verbose show ip bgp neighbors X
看BGP路由表 dis bgp routing-table show ip bgp
看某条路由详情 dis bgp routing-table X.X.X.X show ip bgp X.X.X.X
看邻居发来的路由 dis bgp routing-table peer X received-routes show ip bgp neighbors X received-routes
看通告给邻居的路由 dis bgp routing-table peer X advertised-routes show ip bgp neighbors X advertised-routes
重置邻居 reset bgp X.X.X.X clear ip bgp X.X.X.X
软重置(不中断) refresh bgp all export/import clear ip bgp X soft
看BGP日志 dis logbuffer | in BGP show log | in BGP

七、三个你可能会遇到的真坑

坑1:EBGP直连邻居,IP能ping通,邻居就是起不来
→ 可能原因:中间设备(如防火墙)的TCP MSS clamping导致TCP三次握手异常。抓包确认。

坑2:IBGP邻居状态Established,但路由就是进不来
→ 可能是IGP没有Next-Hop的路由。检查:dis ip routing-table <next-hop-ip>

坑3:路由策略用了community过滤,改完之后邻居全断了
→ Community是可选传递属性。在对端EBGP邻居上如果不识别,可能被当成错误触发Notification。建议先在对端确认支持。


本文是”网络工程”系列的第三篇(工程实战)。三篇覆盖从原理到排错的全链路。更多网络协议系列敬请期待。


BGP工程实战:状态机排错、路由震荡与常见故障处理
https://yilx.top/2026/05/19/BGP工程实战:状态机排错、路由震荡与常见故障处理/
作者
Nick
发布于
2026年5月19日
许可协议