■ 河南 劉進京
編者按:很多網絡運維工作者在實際運維中會遇到了BGP協議相關的故障,本文就將以實際網絡環境來討論不同原因引起的BGP協議故障,以及解決方法。
BGP協 議(邊界網關協議)主要負責以自治系統為單位,在網絡之間互相交換路由,并且執行路徑的選擇,其屬于主要用于大型網絡服務商的網絡協議。
在實際的網絡運維中,有時會遇到了BGP協議相關的故障,對其進行分析和有效排查,及時排除故障,對于網絡的正常運行是很重要的。
這里就以簡單的例子,來說明BGP的維護以及故障排查的方法。
路由器R1和R2組成名為AS100的自治系統,路由器R3組成自治系統AS103。在R1和R2之間使用環回口S0/0.12建立對等體關系,R1的環回口IP為172.16.1.1/24,R2的 環回 口IP為172.16.0.2/24。R2和R3之間通過物理接口S0/0.23建立對等體關系。因為R1和R2在同一個自治系統內部,所以可以使用環回接口建立對等體。
首先,在R1上執行“show running-config | section route bgp”命令,讓其嘗試和R2建立對等體關系。對于R2來說,需要執行同樣的操作,和R1與R3建立IBGP的對等體關系。執行以下命令,為R1設置下一跳信息:

然后執行“show ip bgp summary”指令,可以檢查當前的BGP的匯總信息。執行“show ip bgp neighbors”命令。來查看鄰居關系的詳細信息。
最后執行“show ip bgp”命令,來查看BGP的數據庫信息。
在網絡運維過程中,有時會遇到一些和BGP有關的故障。例如,在本例中,R1無法收到本自治系統之外的其它路由信息(例如自治系統AS103),在R3上存在172.16.0.3/24的網段,但是在R1上卻無法獲取這些信息。
首先需要檢查R1和R2之間是否可以正常的傳送路由,在R1上執行“show ip bgp summary”命令,在返回信息底部查看和R2的鄰居關系參數,在其中的“State/PfxRcd”列中顯示為“0”,表示從R2上收到了0個路由信息,但是兩者已經建立了鄰居關系。
然后執行“show bgp neighbors 172.16.0.2”命令,來查看鄰居信息,在返回信息中顯示“BGP state=Established”,說明兩者的鄰居關系沒有問題。之后檢測R2和R3之間的鄰居關系,在R2上執行以上指令,發現可以從R1上收到一定數量的路由信息,但是和R3對應的“State/PfxRcd”列 顯示的確實“Idle”信息,表示嘗試向外部發送Hello包,這說明R2并不知道到達R3的路徑。
根據以上信息,可以判斷出對方的Neighbors無法找到,無法和其進行通訊。執行“ping 172.16.23.3”命令,無法和對方進行通訊,172.16.23.3為R3的IP。執行“show ip route”命令,在R2的路由表中找不到和R3相關的路由信息。
之后排查的方法升級,首先檢測接口信息,在R2上執行“show ip interface brief”命令,在返回信息中的 和“Serial0/0.23”接 口對應的“Status”列中顯示“administratively down”內容,說明該端口被Shutdown掉了,這導致R2和R3無法進行直接的通訊,自然無法和對方建立對等體關系。
處理的方法是,執行“int s0/0.23”,“no shutdown”命令,來重啟打開該接口,之后R2就會和R3建立對等體關系。當鄰居關系建立之后,R2就可以從R3收到BGP路由信息了。

對應的,R1也可以收到相同的BGP路由信息。可以看出,該故障是由于鏈路異常造成的,導致鄰居關系無法正常建立。
如果R1無法接收來自AS103的路由信息,而且檢測和R2的鄰居關系處于正常狀態,但是在進入R2管理界面后,顯示“received from neighbor 172.16.23.3 2/2(peer in wrong AS)”之類的錯誤提示信息,說明可以從R3收到信息,但是對方配置的AS號碼是錯誤的。
這說明兩臺路由器之間的AS號碼的配置沒有對應起來,在R2上執行“show ip bgp summary”命令,在返回信息中和R3對應的“State/PfxRcd”列顯示的是“active”信息,說明在R2和R3之間可以互相發送Hello包,但是其中的參數沒有匹配和對應。造成無法協商的情況,即使用Hello包中的參數無法繼續協商建立鄰居關系。
然后執行“ping 172.16.23.3”命令,和R3可以正常通訊。在R2路由器上執行“show running-config| section route bgp”命令,根據返回信息,可以看到“neighbor 172.16.23.3 reote-as 103”信息,說明關于R3的鄰居配置關系是正確的。在R3上執行同樣的指令,顯示“neighbor 172.16.23.3 reote-as xxx”命令,可以看到雖然鄰居關系已經配置完成,但是對方的自治系統號卻是錯誤的。
因為R3向R2發送Hello包,里面會攜帶自身所識別的對方的AS號碼。在兩臺路由器之間建立對等體關系時,一些核心的必要的參數必須互相協商互相對應起來。當攜帶了錯誤的AS號碼后,自然會出現問題。
因此說,在配置BGP時對于各種參數的要求是很嚴格的。在R3上執行以下命令,將對方的AS號碼修改為正確的值:

這樣就解決了上述故障。

當R1無法收到自治系統AS3中的路由信息,可以按照上述方法查看R1和R2之間,以及R2和R3之間的BGP鄰居關系。
當確認建立了對等體關系,彼此之間滿足順利傳送路由的要求。但是在R1、R2和R3上 執 行“show ip bgp”命令,都沒有發現收到172.16.3.0/32網段的信息。因為R3的172.16.0.3/24是自身的直連網段,在R3上執 行“show ip route”命令,顯示“172.16.3.0/24 is directly connectd”內容,就說明了上述分析的正確性。該網段應該被注入到R3的BGP數據庫,注入的方法有多種,包括通過network指令將其匹配到BGP數據庫中,或者將直連網段重分發到BGP數據庫中等。
這里我們需要關注的是R3究竟采用何種方法實現注入,針對該方法是否存在配置錯誤的情況。
執 行“show runningconfig | section route bgp”命令,根據返回信息看到其嘗試使network命令,直接匹配該網段并將其注入BGP數據庫。但是顯示的“network 172.16.0.0 mask 255.255.255.0”信 息 卻與實際情況不符。
實際上,這是在注入時很容易出現的錯誤,即試圖將172.16.0.0所有網段都注入到BGP數據庫中。執行“show ip route”命令,可以看到存在很多網段信息。在上述172.16.0.0網段中的確包含172.16.3.0/24網段,但是在BGP的network配置存在非常嚴格的要求,即不允許存在包含關系,只有該network被嚴格的匹配到了路由表中的相應的條目,該路由才會被就注入BGP的數據庫中。
只有執行以下命令,才可以實現精確的放入到BGP數據庫中:

當問題被解決后,在R1和R2中就會正確的收到自治系統AS3中的路由信息。
根據以上分析,在路由器之間建立了鄰居關系后,如果在網段注入上出現問題,同樣會導致問題的發生。
另外,在將自己的路由注入到BGP數據庫時,將本地的IGP協 議(例 如OSPF等)使用重分發指令實現注入。在默認情況下,該路由協議中的所有路由都會被重分發進去。如果項重分發其中的某些路由信息,必須正確的配置過濾機制。
如果R1依然無法獲取172.16.3.0/24網段的路由,可以按照上述方法,在R1和R2以及R2和R3之間檢查對等體關系。
如果不存在問題,可以在R2上執行“show ip bgp”命令,在返回信息沒有發現172.16.3.0/24網段的信息。這可能是因為R3并沒有發送Hello包,也可能是R2在接收時將其過濾掉了。在R3上執行上述命令,可以發現存在172.16.3.0/24網段信息。而且在其前面顯示“>”號,表示是最佳路由,可以發送給鄰居。這就需要在R2上檢測過濾機制以及Route-map策略配置了,即策略也有可能影響BGP鄰居路由信息的傳似。在R2上執行“show bgp neighbors 172.16.23.3”命令,在返回信息中顯示“Inbound path policy configured”行,說明入站的路徑策略已經被配置過。
在“Route map for incoming advertisement is”欄中顯示其名稱為“FROM-AS103”。在“Local Policy Denied Prefixes”欄中顯示本地策略中拒絕的前綴,可以看到在Route-map方向上有一條路由被拒絕了。
由此分析,從R3發送方向過來的路由信息被R2上的Route-map進行了一些控制,例如對其進行了過濾,導致無法接收來自R3的路由信息。在R2上執行“show running-config | section route bgp”命令,在 返回信息中顯示“Neighbor 172.16.23.3 route-map FROM-AS103 in”行,說明該Route map的確對來自R3的路由進行了控制。如果其配置有誤,就可能造成上述問題的發生。
執行“show route-map”命令,顯示默認的規則為“DEFAULT”,將“Metric”設置為2000。執行“show ip prefix-list”命令,顯示該Default前綴列表內容,其中包括“seq 5 permit 0.0.0.0/0”行,說明如果收到默認路由,就將其Metrict的值設置的很大,而該值越大則優先級越低。
這就說明如果R2從R3那里接收到默認路由的話,則很不傾向于轉發數據包(即不傾向于將默認路由指向R3)。雖然可以看上去沒有問題,但是只存在該默認規則,在Route map當中,如果沒有被匹配到的流量,默認情況下其和訪問列表以及前綴列表的規則都是一致的。默認情況下,都會丟棄其他所有的路由。即只允許默認路由進入,其余的路由均被丟棄。
解決的方式是,執行:

添加了允許所有的規則,這樣包括R3的路由都會被放進來。執行“clear ip bgp * from in”命令,軟重置一下入站方向的策略。之后執行“show ip bgp”命令,可以看到已經可以接收來自R3的網段信息了。