冉崇書
(中國電信股份有限公司廣東公司,廣東 廣州 510080)
BGP(Border Gateway Protocol,邊界網(wǎng)關(guān)協(xié)議)是一種用于自治系統(tǒng)AS(Autonomous System)之間的動態(tài)路由協(xié)議。BGP主要用于控制路由的傳播和選擇最佳路由。用TCP作為其傳輸層協(xié)議交換整個BGP路由表。當(dāng)路由表發(fā)生變化時,發(fā)送更新信號。
BGP是一個距離向量協(xié)議,提供在管理域之間管理路由的方法。BGP經(jīng)歷了不同的發(fā)展階段,1989年、1990年和1993年分別公布了BGP協(xié)議的版本一(BGP-1)、版本二(BGP-2)和版本三(BGP-3),從1993年開始研發(fā)當(dāng)前版本BGP-4,協(xié)議標(biāo)準(zhǔn)為RFC1771。如今BGP-4已經(jīng)廣泛應(yīng)用于網(wǎng)絡(luò)中,它提供了一套新的機(jī)制以支持無類域間路由。這些機(jī)制包括支持網(wǎng)絡(luò)前綴的通告、取消BGP網(wǎng)絡(luò)中“類”的概念,BGP-4也包括AS路徑的集合,為提議的超網(wǎng)方案提供了支持。
(1)Open:你好,跟我交個朋友吧!
(2)KeepAlive:我還活著呢,別不理我
(3)Update:有新聞……
(4)Notification:我不跟你玩了!因為你@#$%#$^%%##$#$^
(5)RouteRefresh:再給我發(fā)一遍所有信息吧
(1)當(dāng)TCP連接建立成功后,發(fā)送OPEN消息進(jìn)行協(xié)商。
(2)連接建立后,如有路由需要發(fā)送或路由變化時,發(fā)送Update消息通告對端路。
(3)連后要定時發(fā)送KeepAlive消息以保持BGP連接有效性。
(4)如果因用戶配置變化等原因,希望重新得到對端曾經(jīng)發(fā)送的所有路由,并且TCP連接關(guān)系不中斷,則發(fā)送RouteRefresh請求對端發(fā)送所有路由。
(5)發(fā)現(xiàn)錯誤或用戶干預(yù)時,要發(fā)送Notification消息通告BGP對端,并中斷。
(1)配置錯誤:導(dǎo)致配置錯誤的原因有對技術(shù)細(xì)節(jié)不了解或者溝通不暢而導(dǎo)致配置錯誤。
(2)人為錯誤:打字錯誤,使用了錯誤的命令,割接方案設(shè)計的問題。
(3)“故障是否是因為軟件版本不同而導(dǎo)致的?這個功能是不是在軟件版本A是正常的,而目前配置的設(shè)備正在運行軟件版本B”。
(4)由不同廠家的兼容性問題而導(dǎo)致的故障,如不同廠家設(shè)備是否都遵循RFC1771。
(5)由對端導(dǎo)致的故障:因為其他運營商或大客戶宣告了錯誤的路由導(dǎo)致的網(wǎng)絡(luò)故障。
請記住:一個看起來很復(fù)雜的故障,從最簡單的測試或者最基礎(chǔ)的錯誤開始排查。這個方法似乎一點都不“高大上”,但往往很復(fù)雜的故障,其實都是由一些很低級的錯誤而導(dǎo)致的[1]。

圖1 BGP鄰居無法建立故障診斷流程圖
碰到BGP無法建立的問題,我們第一步需要檢查的是鄰居地址是否可達(dá)。我們可以先使用ping命令進(jìn)行檢查,但注意進(jìn)行ping操作的時候一定要帶上源地址并且設(shè)置包長為1 500。
如果建立鄰居的地址無法ping通,可能原因有:①鏈路問題,檢查鏈路互聯(lián)地址能否ping通;②路由問題,檢查建立鄰居地址路由表是否正確;③鏈路MTU限制,不允許大包通過。
如果ping測沒有問題,檢查一下TCP端口會不會被過濾。此時可以在兩端查看是否禁止TCP的179端口。如果設(shè)備過濾了179端口,也會導(dǎo)致BGP鄰居無法建立。檢查配置如下:

再檢查TCP的狀態(tài)。正常BGP建立的前提是兩臺設(shè)備的TCP需要處于esatblished的狀態(tài)。

如果有禁止TCP的179端口的ACL,需要刪除ACL相關(guān)配置,或者放通TCP 179端口。
鄰居兩端的router-id一樣時,BGP在協(xié)商時會檢測到?jīng)_突,導(dǎo)致鄰居無法建立。配置檢查如下:

通過debug BGP鄰居協(xié)議1.1.1.1的BGP報文,可以看到BGP ID無效導(dǎo)致BGP鄰居無法建立的日志。
<R2> debugging bgp all peer 1.1.1.1
Jul 15 2021 03:27:01.504 R2 %%01BGP/3/DEBUG_INFO(d):CID=0x8013046c; BGP(VPN 0): Bgp Id field in the OPEN message received from 1.1.1.1(SourceIfIndex:29)is invalid or not negotiable.
小結(jié):
(1)如果沒有顯式的配置BGP的router-id,BGP的router-id會繼承系統(tǒng)的router-id。
(2)debug BGP協(xié)議報文,看到兩端BGP鄰居無法建立的原因。
一定要和對端確認(rèn)BGP AS號,避免配置錯誤導(dǎo)致鄰居無法建立。檢查配置如下:

AS號配置錯誤,也會導(dǎo)致TCP的狀態(tài)無法建立的。
如果經(jīng)過以上4步,BGP鄰居還沒有正常建立,繼續(xù)分析其他配置,如果使用connection-interface指定用于建立BGP鄰居的源地址時出現(xiàn)指定錯誤,或在使用loopback口建立鄰居時沒有使用此命令指定相應(yīng)的loopback口,也會導(dǎo)致鄰居無法建立。檢查配置如下:

在不使用connection-interface顯示指定源地址時BGP不設(shè)置源地址,而是交給TCP來選,TCP通過查路由表來確定出接口,然后用出接口上的接口地址作為建立鄰居的源地址。
在用loopback口建立直連eBGP鄰居時一定要配置ebgp-max-hop,否則鄰居無法建立。ebgp-max-hop兩端必須都配置,建議兩端配置的跳數(shù)配置成一樣的。檢查配置如下:

如果未配置ebgp-max-hop,查看TCP鏈接,發(fā)現(xiàn)沒有和R1(1.1.1.1)成功建立TCP連接,BGP鄰居無法建立。

小結(jié):除了ebgp-max-hop,valid-ttl-hops也能達(dá)到類似目的。
上述的各種排查步驟都使用后,鄰居仍然無法建立。還有一種經(jīng)常碰到的場景是兩邊密碼配置不一致。如果MD5密碼不一致,會產(chǎn)生MD5認(rèn)證密碼信息錯誤的日志。檢查配置如下:

查看日志,BGP MD5認(rèn)證失敗,鄰居無法建立。

小結(jié):我們必須在在兩端的路由器上輸入相同的密碼,兩端的密碼要一致;檢查系統(tǒng)的日志,看看是否有密碼錯誤的提示;在設(shè)備的兩端重新輸入密碼,eBGP的鄰居建立起來了。
如果BGP的鄰居建立后馬上中斷,檢查BGP鄰居會不會配置了route-limit限制,對端發(fā)送的路由數(shù)量超過limit的條數(shù),導(dǎo)致鄰居建立后很快又down(中斷)。檢查配置如下:

查看BGP鄰居狀態(tài),處于IDLE(Ovlmt)狀態(tài),表示接收路由超限導(dǎo)致鄰居無法建立。

再看看是不是有人人為關(guān)閉了BGP鄰居。
檢查方法:查看鄰居狀態(tài),配置了peer ignore一端的鄰居會在displaylay bgp peer會顯示Idle(admin)

小結(jié):在BGP視圖下配置shutdown,也會有相同的結(jié)果,只是peer ignore只是針對一個鄰居,shutdown則是針對所有鄰居。
本文總結(jié)了BGP鄰居無法建立經(jīng)常碰到的一些原因及處理辦法,按上述步驟去排查后,絕大部分的BGP鄰居無法建立的問題都可以解決。除了上述原因,還有可能不同廠商之間對協(xié)議的理解存在差異、網(wǎng)絡(luò)路由震蕩等其他復(fù)雜問題導(dǎo)致BGP鄰居無法建立,此時就需要更深層次的分析了。只要熟練掌握BGP的原理、協(xié)議和狀態(tài)機(jī),遇到問題不慌不亂,有思路,按步驟進(jìn)行排查,問題是一定可以解決的。