網路 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
如果對等體來源是 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-path 正則表達式。_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-maps 或 prefix-lists。
- 啟用額外的 received-route 儲存空間。
- 放寬防火牆、ACL 或控制平面政策。
如果重置獲得核准,請優先選擇平台支援的、破壞性最小的軟重置或 route-refresh 選項,並記錄其安全原因。
反模式
- 假設
Active總是代表遠端已中斷。 - 忽略 VRF、地址族或更新來源的差異。
- 使用不帶記號邊界的寬泛 AS-path 正則表達式。
- 在讀取最後重置原因和日誌之前硬重置對等體。
- 將缺少
received-routes輸出當作沒有路由到達的證據。
參見
- 技能:
cisco-ios-patterns - 技能:
network-config-validation - 技能:
network-interface-health