■ 河南 劉進(jìn)京
編者按:很多網(wǎng)絡(luò)運(yùn)維工作者在實(shí)際運(yùn)維中會(huì)遇到了BGP協(xié)議相關(guān)的故障,本文就將以實(shí)際網(wǎng)絡(luò)環(huán)境來(lái)討論不同原因引起的BGP協(xié)議故障,以及解決方法。
BGP協(xié) 議(邊界網(wǎng)關(guān)協(xié)議)主要負(fù)責(zé)以自治系統(tǒng)為單位,在網(wǎng)絡(luò)之間互相交換路由,并且執(zhí)行路徑的選擇,其屬于主要用于大型網(wǎng)絡(luò)服務(wù)商的網(wǎng)絡(luò)協(xié)議。
在實(shí)際的網(wǎng)絡(luò)運(yùn)維中,有時(shí)會(huì)遇到了BGP協(xié)議相關(guān)的故障,對(duì)其進(jìn)行分析和有效排查,及時(shí)排除故障,對(duì)于網(wǎng)絡(luò)的正常運(yùn)行是很重要的。
這里就以簡(jiǎn)單的例子,來(lái)說(shuō)明BGP的維護(hù)以及故障排查的方法。
路由器R1和R2組成名為AS100的自治系統(tǒng),路由器R3組成自治系統(tǒng)AS103。在R1和R2之間使用環(huán)回口S0/0.12建立對(duì)等體關(guān)系,R1的環(huán)回口IP為172.16.1.1/24,R2的 環(huán)回 口IP為172.16.0.2/24。R2和R3之間通過(guò)物理接口S0/0.23建立對(duì)等體關(guān)系。因?yàn)镽1和R2在同一個(gè)自治系統(tǒng)內(nèi)部,所以可以使用環(huán)回接口建立對(duì)等體。
首先,在R1上執(zhí)行“show running-config | section route bgp”命令,讓其嘗試和R2建立對(duì)等體關(guān)系。對(duì)于R2來(lái)說(shuō),需要執(zhí)行同樣的操作,和R1與R3建立IBGP的對(duì)等體關(guān)系。執(zhí)行以下命令,為R1設(shè)置下一跳信息:
然后執(zhí)行“show ip bgp summary”指令,可以檢查當(dāng)前的BGP的匯總信息。執(zhí)行“show ip bgp neighbors”命令。來(lái)查看鄰居關(guān)系的詳細(xì)信息。
最后執(zhí)行“show ip bgp”命令,來(lái)查看BGP的數(shù)據(jù)庫(kù)信息。
在網(wǎng)絡(luò)運(yùn)維過(guò)程中,有時(shí)會(huì)遇到一些和BGP有關(guān)的故障。例如,在本例中,R1無(wú)法收到本自治系統(tǒng)之外的其它路由信息(例如自治系統(tǒng)AS103),在R3上存在172.16.0.3/24的網(wǎng)段,但是在R1上卻無(wú)法獲取這些信息。
首先需要檢查R1和R2之間是否可以正常的傳送路由,在R1上執(zhí)行“show ip bgp summary”命令,在返回信息底部查看和R2的鄰居關(guān)系參數(shù),在其中的“State/PfxRcd”列中顯示為“0”,表示從R2上收到了0個(gè)路由信息,但是兩者已經(jīng)建立了鄰居關(guān)系。
然后執(zhí)行“show bgp neighbors 172.16.0.2”命令,來(lái)查看鄰居信息,在返回信息中顯示“BGP state=Established”,說(shuō)明兩者的鄰居關(guān)系沒(méi)有問(wèn)題。之后檢測(cè)R2和R3之間的鄰居關(guān)系,在R2上執(zhí)行以上指令,發(fā)現(xiàn)可以從R1上收到一定數(shù)量的路由信息,但是和R3對(duì)應(yīng)的“State/PfxRcd”列 顯示的確實(shí)“Idle”信息,表示嘗試向外部發(fā)送Hello包,這說(shuō)明R2并不知道到達(dá)R3的路徑。
根據(jù)以上信息,可以判斷出對(duì)方的Neighbors無(wú)法找到,無(wú)法和其進(jìn)行通訊。執(zhí)行“ping 172.16.23.3”命令,無(wú)法和對(duì)方進(jìn)行通訊,172.16.23.3為R3的IP。執(zhí)行“show ip route”命令,在R2的路由表中找不到和R3相關(guān)的路由信息。
之后排查的方法升級(jí),首先檢測(cè)接口信息,在R2上執(zhí)行“show ip interface brief”命令,在返回信息中的 和“Serial0/0.23”接 口對(duì)應(yīng)的“Status”列中顯示“administratively down”內(nèi)容,說(shuō)明該端口被Shutdown掉了,這導(dǎo)致R2和R3無(wú)法進(jìn)行直接的通訊,自然無(wú)法和對(duì)方建立對(duì)等體關(guān)系。
處理的方法是,執(zhí)行“int s0/0.23”,“no shutdown”命令,來(lái)重啟打開(kāi)該接口,之后R2就會(huì)和R3建立對(duì)等體關(guān)系。當(dāng)鄰居關(guān)系建立之后,R2就可以從R3收到BGP路由信息了。
對(duì)應(yīng)的,R1也可以收到相同的BGP路由信息??梢钥闯觯摴收鲜怯捎阪溌樊惓T斐傻?,導(dǎo)致鄰居關(guān)系無(wú)法正常建立。
如果R1無(wú)法接收來(lái)自AS103的路由信息,而且檢測(cè)和R2的鄰居關(guān)系處于正常狀態(tài),但是在進(jìn)入R2管理界面后,顯示“received from neighbor 172.16.23.3 2/2(peer in wrong AS)”之類的錯(cuò)誤提示信息,說(shuō)明可以從R3收到信息,但是對(duì)方配置的AS號(hào)碼是錯(cuò)誤的。
這說(shuō)明兩臺(tái)路由器之間的AS號(hào)碼的配置沒(méi)有對(duì)應(yīng)起來(lái),在R2上執(zhí)行“show ip bgp summary”命令,在返回信息中和R3對(duì)應(yīng)的“State/PfxRcd”列顯示的是“active”信息,說(shuō)明在R2和R3之間可以互相發(fā)送Hello包,但是其中的參數(shù)沒(méi)有匹配和對(duì)應(yīng)。造成無(wú)法協(xié)商的情況,即使用Hello包中的參數(shù)無(wú)法繼續(xù)協(xié)商建立鄰居關(guān)系。
然后執(zhí)行“ping 172.16.23.3”命令,和R3可以正常通訊。在R2路由器上執(zhí)行“show running-config| section route bgp”命令,根據(jù)返回信息,可以看到“neighbor 172.16.23.3 reote-as 103”信息,說(shuō)明關(guān)于R3的鄰居配置關(guān)系是正確的。在R3上執(zhí)行同樣的指令,顯示“neighbor 172.16.23.3 reote-as xxx”命令,可以看到雖然鄰居關(guān)系已經(jīng)配置完成,但是對(duì)方的自治系統(tǒng)號(hào)卻是錯(cuò)誤的。
因?yàn)镽3向R2發(fā)送Hello包,里面會(huì)攜帶自身所識(shí)別的對(duì)方的AS號(hào)碼。在兩臺(tái)路由器之間建立對(duì)等體關(guān)系時(shí),一些核心的必要的參數(shù)必須互相協(xié)商互相對(duì)應(yīng)起來(lái)。當(dāng)攜帶了錯(cuò)誤的AS號(hào)碼后,自然會(huì)出現(xiàn)問(wèn)題。
因此說(shuō),在配置BGP時(shí)對(duì)于各種參數(shù)的要求是很嚴(yán)格的。在R3上執(zhí)行以下命令,將對(duì)方的AS號(hào)碼修改為正確的值:
這樣就解決了上述故障。
當(dāng)R1無(wú)法收到自治系統(tǒng)AS3中的路由信息,可以按照上述方法查看R1和R2之間,以及R2和R3之間的BGP鄰居關(guān)系。
當(dāng)確認(rèn)建立了對(duì)等體關(guān)系,彼此之間滿足順利傳送路由的要求。但是在R1、R2和R3上 執(zhí) 行“show ip bgp”命令,都沒(méi)有發(fā)現(xiàn)收到172.16.3.0/32網(wǎng)段的信息。因?yàn)镽3的172.16.0.3/24是自身的直連網(wǎng)段,在R3上執(zhí) 行“show ip route”命令,顯示“172.16.3.0/24 is directly connectd”內(nèi)容,就說(shuō)明了上述分析的正確性。該網(wǎng)段應(yīng)該被注入到R3的BGP數(shù)據(jù)庫(kù),注入的方法有多種,包括通過(guò)network指令將其匹配到BGP數(shù)據(jù)庫(kù)中,或者將直連網(wǎng)段重分發(fā)到BGP數(shù)據(jù)庫(kù)中等。
這里我們需要關(guān)注的是R3究竟采用何種方法實(shí)現(xiàn)注入,針對(duì)該方法是否存在配置錯(cuò)誤的情況。
執(zhí) 行“show runningconfig | section route bgp”命令,根據(jù)返回信息看到其嘗試使network命令,直接匹配該網(wǎng)段并將其注入BGP數(shù)據(jù)庫(kù)。但是顯示的“network 172.16.0.0 mask 255.255.255.0”信 息 卻與實(shí)際情況不符。
實(shí)際上,這是在注入時(shí)很容易出現(xiàn)的錯(cuò)誤,即試圖將172.16.0.0所有網(wǎng)段都注入到BGP數(shù)據(jù)庫(kù)中。執(zhí)行“show ip route”命令,可以看到存在很多網(wǎng)段信息。在上述172.16.0.0網(wǎng)段中的確包含172.16.3.0/24網(wǎng)段,但是在BGP的network配置存在非常嚴(yán)格的要求,即不允許存在包含關(guān)系,只有該network被嚴(yán)格的匹配到了路由表中的相應(yīng)的條目,該路由才會(huì)被就注入BGP的數(shù)據(jù)庫(kù)中。
只有執(zhí)行以下命令,才可以實(shí)現(xiàn)精確的放入到BGP數(shù)據(jù)庫(kù)中:
當(dāng)問(wèn)題被解決后,在R1和R2中就會(huì)正確的收到自治系統(tǒng)AS3中的路由信息。
根據(jù)以上分析,在路由器之間建立了鄰居關(guān)系后,如果在網(wǎng)段注入上出現(xiàn)問(wèn)題,同樣會(huì)導(dǎo)致問(wèn)題的發(fā)生。
另外,在將自己的路由注入到BGP數(shù)據(jù)庫(kù)時(shí),將本地的IGP協(xié) 議(例 如OSPF等)使用重分發(fā)指令實(shí)現(xiàn)注入。在默認(rèn)情況下,該路由協(xié)議中的所有路由都會(huì)被重分發(fā)進(jìn)去。如果項(xiàng)重分發(fā)其中的某些路由信息,必須正確的配置過(guò)濾機(jī)制。
如果R1依然無(wú)法獲取172.16.3.0/24網(wǎng)段的路由,可以按照上述方法,在R1和R2以及R2和R3之間檢查對(duì)等體關(guān)系。
如果不存在問(wèn)題,可以在R2上執(zhí)行“show ip bgp”命令,在返回信息沒(méi)有發(fā)現(xiàn)172.16.3.0/24網(wǎng)段的信息。這可能是因?yàn)镽3并沒(méi)有發(fā)送Hello包,也可能是R2在接收時(shí)將其過(guò)濾掉了。在R3上執(zhí)行上述命令,可以發(fā)現(xiàn)存在172.16.3.0/24網(wǎng)段信息。而且在其前面顯示“>”號(hào),表示是最佳路由,可以發(fā)送給鄰居。這就需要在R2上檢測(cè)過(guò)濾機(jī)制以及Route-map策略配置了,即策略也有可能影響B(tài)GP鄰居路由信息的傳似。在R2上執(zhí)行“show bgp neighbors 172.16.23.3”命令,在返回信息中顯示“Inbound path policy configured”行,說(shuō)明入站的路徑策略已經(jīng)被配置過(guò)。
在“Route map for incoming advertisement is”欄中顯示其名稱為“FROM-AS103”。在“Local Policy Denied Prefixes”欄中顯示本地策略中拒絕的前綴,可以看到在Route-map方向上有一條路由被拒絕了。
由此分析,從R3發(fā)送方向過(guò)來(lái)的路由信息被R2上的Route-map進(jìn)行了一些控制,例如對(duì)其進(jìn)行了過(guò)濾,導(dǎo)致無(wú)法接收來(lái)自R3的路由信息。在R2上執(zhí)行“show running-config | section route bgp”命令,在 返回信息中顯示“Neighbor 172.16.23.3 route-map FROM-AS103 in”行,說(shuō)明該Route map的確對(duì)來(lái)自R3的路由進(jìn)行了控制。如果其配置有誤,就可能造成上述問(wèn)題的發(fā)生。
執(zhí)行“show route-map”命令,顯示默認(rèn)的規(guī)則為“DEFAULT”,將“Metric”設(shè)置為2000。執(zhí)行“show ip prefix-list”命令,顯示該Default前綴列表內(nèi)容,其中包括“seq 5 permit 0.0.0.0/0”行,說(shuō)明如果收到默認(rèn)路由,就將其Metrict的值設(shè)置的很大,而該值越大則優(yōu)先級(jí)越低。
這就說(shuō)明如果R2從R3那里接收到默認(rèn)路由的話,則很不傾向于轉(zhuǎn)發(fā)數(shù)據(jù)包(即不傾向于將默認(rèn)路由指向R3)。雖然可以看上去沒(méi)有問(wèn)題,但是只存在該默認(rèn)規(guī)則,在Route map當(dāng)中,如果沒(méi)有被匹配到的流量,默認(rèn)情況下其和訪問(wèn)列表以及前綴列表的規(guī)則都是一致的。默認(rèn)情況下,都會(huì)丟棄其他所有的路由。即只允許默認(rèn)路由進(jìn)入,其余的路由均被丟棄。
解決的方式是,執(zhí)行:
添加了允許所有的規(guī)則,這樣包括R3的路由都會(huì)被放進(jìn)來(lái)。執(zhí)行“clear ip bgp * from in”命令,軟重置一下入站方向的策略。之后執(zhí)行“show ip bgp”命令,可以看到已經(jīng)可以接收來(lái)自R3的網(wǎng)段信息了。