BGP工程实战:状态机排错、路由震荡与常见故障处理
这篇文章写给谁?
已经配过BGP、在真实网络里踩过坑的你。本文不讲原理(看入门篇),不讲考点(看备考篇),只讲出了故障怎么排。
一、BGP排错的黄金三步法
不管是哪个厂商的设备,排错思路都是通的:
1 | |
铁律:BGP的所有问题,根因必在以上三步之一。不要跳过任何一步。
二、邻居建立故障:状态机排错
BGP邻居状态用一条命令搞定(华为:display bgp peer,思科:show ip bgp summary)。
场景1:状态卡在Idle
1 | |
立即检查三层:
1 | |
常见根因:
| 原因 | 排查方向 | 修复 |
|---|---|---|
| 路由不可达 | 本地没有去往邻居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 | |
这说明TCP连接在32秒重试定时器(ConnectRetry)驱动下反复尝试。
检查步骤:
1 | |
真实案例:某次割接后BGP邻居翻Active。查了半天发现是对端忘了配peer enable——地址族里没激活邻居。
场景3:Established→Idle→Established 反复震荡
1 | |
三大嫌疑:
- 链路闪断:物理层抖动导致Hold timer超时(默认180秒×3=9分钟?不,180秒后立即断)
- 路由策略变更:应用了route-policy导致邻居重置
- Notification报文:对面发了Notification主动断
定位命令:
1 | |
三、路由缺失:为什么BGP里看不到这条路由?
排错流程(从外到内)
1 | |
关键命令
1 | |
真实案例:Next-Hop不可达
故障现象:R2从EBGP邻居R1收到了路由,但BGP表中看不到这条路由。
排查过程:
1 | |
根因:R2上没有去往10.1.12.1的路由(直连路由意外丢失了,接口down)。
教训:BGP的Next-Hop属性是EBGP邻居地址时,本地路由表必须有到该IP的路由(至少是直连路由)。
四、路由震荡:BGP Flapping
什么算震荡?
同一条路由在30秒内被撤销(Withdraw)又宣告(Update)两次以上。
震荡的危害
- 路由器CPU飙升(每条Update都要重新跑选路算法)
- 全网路由收敛时间拉长
- 极端情况下引发级联震荡——一台路由器把震荡传染给全网
解决方案:Route Dampening(路由衰减)
1 | |
衰减惩罚算法:
- 每次flap,惩罚值+1000
- 每过半衰期(15分钟),惩罚值减半
- 惩罚超过抑制阈值(2000)→ 路由被抑制,不安装也不通告
- 惩罚降到复用阈值(750)以下 → 解除抑制
注意:阻尼只对EBGP路由生效,IBGP不受影响。
真实案例:配置错误引发的震荡
某次变更后,核心路由器CPU飙到95%。排查发现:
- 有人在AS边界路由器上误配了
network 0.0.0.0——把默认路由通告给了上游ISP - 上游ISP不接受(做了过滤),发Notification拒绝
- 但边界路由器反复重试——每32秒一次,产生了大量BGP进程开销
- 同时,本地默认路由的存在又短暂地影响了本地选路,导致了出方向流量的反复切换
修复:删掉network 0.0.0.0,CPU立刻恢复正常。
五、选路异常:为什么流量”绕路了”?
场景:用户投诉”访问XX网站变慢了”
1 | |
发现BGP选了路径更长的路(AS-Path更长),而不是最短的。
为什么? 回想13条选路原则——Local-Pref和Weight在AS-Path之前。可能有人改了Local-Pref。
快速定位:
1 | |
工具:用AS-Path prepend引导入方向流量
如果你想让对端AS少走你这条路(把流量引导到另一条链路上):
1 | |
这样对端看到的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。建议先在对端确认支持。
本文是”网络工程”系列的第三篇(工程实战)。三篇覆盖从原理到排错的全链路。更多网络协议系列敬请期待。