網路 BGP 診斷 是做什麼的?
當 BGP 連線中斷、翻動、已建立但缺少路由、或廣告了非預期的前綴時,請使用此技能。預設工作流程為唯讀證據收集;政策和重置操作應在經過審查的變更窗口中進行。
使用時機
- BGP 鄰居卡在 Idle、Connect、Active、OpenSent 或 OpenConfirm 狀態。
- 連線已建立,但預期的前綴遺失。
- 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
如果對等端來源是環回介面,請確認雙向路由皆可到達環回地址,且鄰居設定使用了預期的更新來源。
避免以關閉 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 摘要格式因平台和位址系列而異。
僅限變更窗口
以下動作可能影響路由,不應作為自動診斷建議:
- 清除 BGP 連線。
- 變更鄰居驗證、計時器、更新來源、route-map 或 prefix-list。
- 啟用額外的 received-route 儲存。
- 放寬防火牆、ACL 或控制平面策略。
如果核准重設,請優先使用平台支援的最小影響軟重設或路由重新整理選項,並記錄為何此操作是安全的。
反模式
- 假設
Active狀態總是代表遠端端已中斷。 - 忽略 VRF、位址系列或更新來源的差異。
- 使用沒有 token 邊界的寬鬆 AS-path 正規表達式。
- 在讀取上次重設原因和日誌之前,就對對等端進行硬重設。
- 將缺少
received-routes輸出視為沒有路由抵達的證明。
參見
- 技能:
cisco-ios-patterns - 技能:
network-config-validation - 技能:
network-interface-health