网络BGP诊断 是做什么的?
当BGP会话中断、振荡、已建立但缺少路由,或广播异常前缀时,使用本技能。默认工作流仅为只读证据收集;策略修改和重置操作应在经过审核的变更窗口中进行。
何时使用
- BGP邻居卡在Idle、Connect、Active、OpenSent或OpenConfirm状态。
- 会话已建立(Established),但预期前缀缺失。
- 可能存在路由映射(route-map)、前缀列表(prefix-list)、最大前缀限制(max-prefix limit)或AS路径策略导致路由被过滤。
- 需要收集BGP变更前后的证据。
- 审查解析BGP摘要输出的自动化脚本。
只读排查流程
- 确认确切的邻居、地址族、VRF以及本地/远程AS号。
- 捕获摘要状态和最后一次重置原因。
- 验证与对端源地址的可达性。
- 在假设传输层故障前,先检查路由策略引用。
- 在支持的平台上,比较通告路由、接收路由和已安装路由。
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正常;检查AS号、认证、计时器、能力和日志 |
| 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
如果对端源地址来自环回接口,请确认两个方向的路由都能到达环回地址,并且邻居配置使用了预期的更新源。
避免将禁用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可能匹配更长的AS号或不相关的文本。
解析器模式
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会话。
- 更改邻居认证、计时器、更新源、路由映射或前缀列表。
- 启用额外的接收路由存储。
- 放宽防火墙、ACL或控制平面策略。
如果重置操作获得批准,优先选择平台支持的、干扰最小的软重置或路由刷新选项,并明确记录其安全性依据。
反模式
- 假设
Active状态总是意味着对端宕机。 - 忽略VRF、地址族或更新源差异。
- 使用不含令牌边界的宽泛AS路径正则。
- 在读取最后一次重置原因和日志之前,直接硬重置对等体。
- 将缺失的
received-routes输出作为没有路由到达的证据。
参见
- 技能:
cisco-ios-patterns - 技能:
network-config-validation - 技能:
network-interface-health