网络BGP诊断 是做什么的?
当BGP会话断开、振荡、已建立但路由缺失,或通告了意外前缀时,请使用此技能。默认工作流为只读证据收集;策略和重置操作应属于经过审核的变更窗口。
何时使用
- BGP邻居卡在Idle、Connect、Active、OpenSent或OpenConfirm状态。
- 会话处于Established状态,但预期的前缀缺失。
- route-map、prefix-list、max-prefix限制或AS路径策略可能正在过滤路由。
- 需要对BGP变更进行前后证据对比。
- 正在审查解析BGP摘要输出的自动化脚本。
只读故障排查流程
- 确定确切的邻居、地址族、VRF以及本地/远端ASN。
- 捕获摘要状态和上次重置原因。
- 验证对等体源地址的可达性。
- 在假设传输故障之前,检查路由策略引用。
- 在平台支持的命令范围内,比较通告、接收和安装的路由。
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 且 prefix count > 0 | 路由交换正常;检查策略和表选择 |
| Established 且 prefix count = 0 | 检查入站策略、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地址,并且邻居配置使用了预期的更新源。
避免以诊断捷径为由禁用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路径正则。_65001_将AS 65001匹配为一个令牌。纯文本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摘要格式因平台和地址族而异。
仅限变更窗口
以下操作可能影响路由,不应作为自动诊断建议:
- 清除BGP会话。
- 更改邻居认证、定时器、更新源、route-map或prefix-list。
- 启用额外的received-route存储。
- 放宽防火墙、ACL或控制平面策略。
如果重置获得批准,请优先选择平台支持的最小破坏性软重置或路由刷新选项,并记录其安全原因。
反模式
- 假设
Active状态总是意味着远端故障。 - 忽略VRF、地址族或更新源差异。
- 使用不带令牌边界的宽泛AS路径正则。
- 在读取上次重置原因和日志之前,对对等体进行硬重置。
- 将缺失的
received-routes输出视为没有路由到达的证据。
参见
- 技能:
cisco-ios-patterns - 技能:
network-config-validation - 技能:
network-interface-health