BGP路由黑洞是網路運作中非常隱密的故障類型。路由表裡有路由,ping不通,traceroute到某一跳就斷了,業務間歇性中斷。有次客戶的BGP網路出現部分網段不可達,排查了大半天才發現是下一跳不可達導致的。

BGP 的路由傳遞有一個與其他路由協議不同的特點:BGP 傳遞路由時,預設不會修改下一跳(Next Hop)屬性。
這意味著,EBGP 學習到的路由,其下一跳通常是 EBGP 對端設備的介面 IP。如果這個下一跳 IP 在 IGP(例如 OSPF、IS-IS)中不可達,那麼即使 BGP 路由已經出現在 BGP 路由表中,也不會被安裝到 IP 路由表中,因為遞迴查找下一跳失敗。
在華為設備上查看 BGP 路由詳細資訊:
display bgp routing-table 10.1.1.0/24
輸出結果中可以查看 NextHop 欄位以及 BGP 路由狀態。
如果路由在 BGP 表中顯示為 Valid 但 Not Best,或者直接顯示為 Invalid,下一跳不可達是非常常見的原因。
進一步確認下一跳是否可達:
display ip routing-table x.x.x.x
其中 x.x.x.x 代表 BGP 路由的下一跳 IP。
如果查不到對應路由,表示下一跳不可達,該 BGP 路由就無法正常生效。
那次故障的具體場景如下:
兩台核心交換機之間建立 IBGP 鄰居關係,並且各自從不同方向的 EBGP 鄰居學習到相同的路由前綴。
正常情況下,設備應該根據 BGP 選路規則選擇最佳路徑進行轉發,但突然出現部分流量被丟棄的情況。
排查後發現,其中一台核心交換機從 EBGP 學習到的路由,其下一跳仍然是 EBGP 對端介面的 IP。
這個 IP 原本透過 OSPF 發布到整個網路中,但由於某個介面配置變更,導致 OSPF 鄰居關係中斷,下一跳 IP 從路由表中消失。
此時,BGP 路由進行下一跳遞迴查找時失敗,導致該路由無法生效。
但奇怪的是,另一台核心交換機上的路由仍然正常,理論上流量應該走正常的核心設備。
經過長時間排查後發現,問題出在非對稱路由(Asymmetric Routing)。
去程流量經由正常的核心設備轉發,但回程流量因為路由策略,被導向到下一跳不可達的核心設備,最終導致資料包被丟棄。
這種非對稱路由 + 下一跳不可達的組合,會讓故障表現非常隱蔽:
- 部分流量正常
- 部分流量異常
- Ping 測試可能時通時斷
解決這類問題的標準方法,是使用 next-hop-local 命令。
在 IBGP 鄰居之間傳遞路由時,將下一跳修改為自己的更新源 IP,使下一跳可以透過 IBGP 連線本身到達,而不再依賴外部 IGP 路由。
華為設備配置:
bgp 65001
peer 10.1.1.2 next-hop-local
華三(H3C)設備命令類似:
bgp 65001
peer 10.1.1.2 next-hop-local
銳捷(Ruijie)設備:
router bgp 65001
neighbor 10.1.1.2 next-hop-self
華為使用 next-hop-local,Cisco 和銳捷使用 next-hop-self,功能基本相同,都是將下一跳修改為自身地址。
在 IBGP 配置中,這個命令通常被視為非常重要的配置。如果沒有配置,IBGP 傳遞的路由下一跳可能仍然是原始 EBGP 對端 IP,導致路由依賴 IGP 的可達性。
還有一種更隱蔽的下一跳不可達場景:
當 BGP 路由通過**路由反射器(Route Reflector,RR)**傳遞時,RR 預設也不會修改下一跳。
此時,RR 客戶端從 RR 學習到的路由,其下一跳仍然可能是原始 EBGP 鄰居的 IP。
如果 RR 客戶端與原始 EBGP 對端之間沒有 IGP 路由,那麼下一跳同樣會不可達。
因此,在 RR 上也需要配置 next-hop-local,確保傳遞給客戶端的路由下一跳修改為 RR 自己的地址。
BGP 路由故障排查的標準流程:
第一步,確認路由是否存在於 BGP 表中,並檢查狀態是否為:
- Valid
- Best
第二步,檢查下一跳 IP 是否存在於 IP 路由表中,確認遞迴查找是否成功。
如果 BGP 表中的路由狀態顯示為 Invalid,應優先檢查下一跳可達性,這通常是最常見的原因之一。
BGP 中大量故障最終都可以歸結為一個核心問題:
下一跳是否可達。
掌握這個概念,可以大幅提升 BGP 網路故障排查效率。