
关于
仅诊断型 BGP 故障排除模式,涵盖邻居状态、路由交换、前缀策略、AS 路径检查和安全证据收集。
name: network-bgp-diagnostics description: 仅诊断性的 BGP 故障排除模式,用于邻居状态、路由交换、前缀策略、AS 路径检查和安全证据收集。 origin: community
网络 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 且有前缀计数 | 路由交换正常;检查策略和表选择 | | 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
如果对端源自环回接口,确认双向都路由到环回地址,且邻居配置使用了预期的 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 路径正则表达式。_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 会话。
- 更改邻居认证、定时器、update source、route-map 或 prefix-list。
- 启用额外的 received-route 存储。
- 放宽防火墙、ACL 或控制平面策略。
如果重置被批准,优先使用最小破坏性的 soft 或 route-refresh 方法而非硬重置。
限制
- 仅在任务明确匹配上述范围时使用此技能。
- 不要将输出视为环境特定验证、测试或专家审查的替代品。
- 如果缺少必需的输入、权限、安全边界或成功标准,请停下来要求澄清。

