用状态机定位问题
BGP 邻居的建立由有限状态机驱动:Idle 到 Connect、Active,再到 OpenSent、OpenConfirm,最后 Established。多数「邻居起不来」都能靠状态定位:卡在 Active 通常是 TCP 层不通或被拒;卡在 OpenSent/OpenConfirm 通常是参数不匹配(AS 号、Router ID 冲突、认证、能力协商);建立后立刻掉线则是另一类问题。先看状态再动手,比反复清邻居有效得多。
六个状态的含义
| Idle | 未启动或存在错误,等待重试 |
|---|---|
| Connect | 已发出 TCP SYN,等待握手完成 |
| Active | 正在尝试建立 TCP 连接,常见于 TCP 不通或被拒 |
| OpenSent | 已发出 OPEN 报文,等待对端 OPEN |
| OpenConfirm | 已收到 OPEN,等待对端 keepalive |
| Established | 会话正常,开始交换路由信息 |
典型排查场景
- 邻居卡在 Active:查可达性与路由、查 ACL 与防火墙、确认对端是否配置了该邻居
- OpenSent/OpenConfirm 反复循环:核对 remote-as、Router ID 冲突、认证口令与能力协商
- Established 后秒掉:查 holdtime/keepalive、查中间设备的会话老化、查 MTU 与分片
- 持续抖动:结合日志时间戳判断是长期性问题还是某个事件触发的瞬时抖动
- 恢复操作:先区分软复位与硬复位再动手,生产环境优先软复位
定位命令
定位命令
show ip bgp summary # 看每个邻居状态与收发计数
show ip bgp neighbors 10.0.0.2 # 看状态机、错误码与通知报文原因
show ip bgp neighbors 10.0.0.2 | include Last reset # 最近一次复位原因
debug ip bgp 10.0.0.2 keepalives # 按需短时开启,注意 CPU 开销
show log | include 10.0.0.2 # 日志里常有通知报文的原因说明状态定位检查点
| 状态 | 常见原因 | 优先检查 |
|---|---|---|
| Idle | 邻居被关闭或进程异常 | 路由可达性、neighbor 是否 shutdown、重启节奏 |
| Connect/Active | SYN 已发但没回应或被拒 | 179 是否放行、源地址是否正确、对端是否配置该邻居 |
| OpenSent | 等对端 OPEN 响应 | 对端 AS 号、认证口令、OPEN 参数字段 |
| OpenConfirm | 等对端 keepalive | 能力协商、认证、keepalive 是否被 ACL 丢掉 |
| Established 后掉线 | 会话建立但立即中断 | holdtime、MTU、中间设备会话老化 |
| Established 但无路由 | 地址族未激活或策略拦截 | 确认地址族已激活、检查策略与下一跳可达 |
Active 这个状态名容易误导:它不代表连接活跃,而是正在反复尝试建立 TCP。看到 Active 就把注意力放到 TCP 层——可达性、ACL、防火墙、端口,而不是沉迷于调 BGP 定时器。
复位分软硬:软复位只重算策略、不重建会话;硬复位会中断会话重新建邻并引发收敛。生产环境优先软复位,硬复位要评估影响面并选择窗口执行。
OpenSent 与 OpenConfirm 阶段最直接的证据是抓包看 OPEN 报文的字段:AS 号、holdtime、能力项一栏一栏对,比反复猜配置快得多;设备侧命令只能看到结果,看不到协商过程。