SuperAPI AI 工具集

network-bgp-diagnostics

部署与运维

查看项目

更新于 10-15 08:37

技能介绍

用途

本技能用于 BGP 故障排查场景:当 BGP 会话中断(down)、震荡(flapping)、已建立(Established)但缺少路由,或通告了非预期前缀时使用。默认工作流是只读证据收集;策略与重置操作应属于经过审核的变更窗口。

适用时机

  • BGP 邻居卡在 Idle、Connect、Active、OpenSent 或 OpenConfirm 状态。
  • 会话已 Established 但缺少预期的前缀。
  • route-map、prefix-list、max-prefix 限制或 AS path 策略可能过滤了路由。
  • 需要为 BGP 变更收集变更前后的证据。
  • 正在审查解析 BGP summary 输出的自动化。

只读分诊流程

  1. 确定确切的邻居、地址族、VRF 以及本地/远端 ASN。
  2. 捕获 summary 状态和最后一次重置原因。
  3. 验证到对端源地址的可达性。
  4. 在假定传输故障前,先检查路由策略引用。
  5. 在平台支持的情况下,比较通告(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