用途
本技能用于 BGP 故障排查场景:当 BGP 会话中断(down)、震荡(flapping)、已建立(Established)但缺少路由,或通告了非预期前缀时使用。默认工作流是只读证据收集;策略与重置操作应属于经过审核的变更窗口。
适用时机
- BGP 邻居卡在 Idle、Connect、Active、OpenSent 或 OpenConfirm 状态。
- 会话已 Established 但缺少预期的前缀。
- route-map、prefix-list、max-prefix 限制或 AS path 策略可能过滤了路由。
- 需要为 BGP 变更收集变更前后的证据。
- 正在审查解析 BGP summary 输出的自动化。
只读分诊流程
- 确定确切的邻居、地址族、VRF 以及本地/远端 ASN。
- 捕获 summary 状态和最后一次重置原因。
- 验证到对端源地址的可达性。
- 在假定传输故障前,先检查路由策略引用。
- 在平台支持的情况下,比较通告(advertised)、接收(received)和安装(installed)的路由。
常用命令:
show bgp summary
show bgp neighbors <peer>
show ip route <peer>
show tcp brief | include <peer>|:179
show logging | include BGP|<peer>
show running-config | section router bgp
show ip prefix-list
show route-map
当设备使用 VRF、IPv6、VPNv4 或 EVPN 时,使用平台特定的地址族命令。不要假定为全局 IPv4 单播。
状态解读
| 状态 | 首要检查项 |
|---|---|
| Established 且带前缀计数 | 路由交换已通;检查策略和路由表选择 |
| Established 且前缀为零 | 检查入站策略、max-prefix、通告路由以及 AFI/SAFI |
| Active | TCP 会话未完成;检查路由、源、ACL 和对端可达性 |
| Connect | TCP 连接进行中;检查路径和远端监听 |
| OpenSent/OpenConfirm | TCP 正常;检查 ASN、认证、计时器、能力和日志 |
| Idle | 邻居可能被禁用、配置缺失、被策略阻止或处于退避计时器 |
传输检查
ping <peer> source <local-source>
traceroute <peer> source <local-source>
show ip route <peer>
show bgp neighbors <peer> | include BGP state|Last reset|Local host|Foreign host
如果对端源地址来自 loopback,确认双向都能路由到该 loopback 地址,且邻居配置使用了预期的 update source。避免通过关闭 ACL 或防火墙策略作为诊断捷径。应先读取命中计数器、日志和路径状态。
路由策略检查
show bgp neighbors <peer> advertised-routes
show bgp neighbors <peer> routes
show ip prefix-list <name>
show route-map <name>
show bgp <prefix>
某些平台需要额外配置才能使用 received-routes。除非操作员批准变更,否则不要在事件分诊期间添加该配置。
AS 路径与前缀审查
show bgp regexp _65001_
show bgp regexp ^65001$
show bgp <prefix>
show bgp neighbors <peer> advertised-routes | include Network|Path|<prefix>
谨慎使用 AS-path 正则。_65001_ 将 AS 65001 作为 token 匹配。裸写 65001 可能匹配更长的 ASN 或不相关的文本。
解析器模式
import re
from typing import Any
BGP_SUMMARY_RE = re.compile(
r"^(?P<neighbor>\d{1,3}(?:\.\d{1,3}){3})\s+"
r"(?P<version>\d+)\s+"
r"(?P<remote_as>\d+)\s+"
r"(?P<msg_rcvd>\d+)\s+"
r"(?P<msg_sent>\d+)\s+"
r"(?P<table_version>\d+)\s+"
r"(?P<input_queue>\d+)\s+"
r"(?P<output_queue>\d+)\s+"
r"(?P<uptime>\S+)\s+"
r"(?P<state_or_prefixes>\S+)$",
re.M,
)
def parse_bgp_summary(raw: str) -> list[dict[str, Any]]:
rows = []
for match in BGP_SUMMARY_RE.finditer(raw):
state_or_prefixes = match.group("state_or_prefixes")
if state_or_prefixes.isdigit():
state = "Established"
prefixes_received = int(state_or_prefixes)
else:
state = state_or_prefixes
prefixes_received = None
rows.append({
"neighbor": match.group("neighbor"),
"remote_as": int(match.group("remote_as")),
"state": state,
"prefixes_received": prefixes_received,
"uptime": match.group("uptime"),
})
return rows
优先使用结构化解析器输出(如果可用),但应将原始输出与事件记录一起保存,因为 BGP summary 格式因平台和地址族而异。
仅限变更窗口的操作
以下操作可能影响路由,不应作为自动诊断被建议:
- 清除 BGP 会话。
- 更改邻居认证、计时器、update source、route-map 或 prefix-list。
- 启用额外的 received-route 存储。
- 放宽防火墙、ACL 或控制平面策略。
如果重置获得批准,优先使用平台支持的最少干扰的 soft 或 route-refresh 选项,并明确记录为何安全。
反模式
- 假定 Active 总意味着远端已宕机。
- 忽略 VRF、地址族或 update-source 差异。
- 使用不带 token 边界的宽泛 AS-path 正则。
- 在读取最后重置原因和日志之前硬重置对端。
- 将缺少 received-routes 输出视为没有路由到达的证据。
参见
- Skill: cisco-ios-patterns
- Skill: network-config-validation
- Skill: network-interface-health