總有人在私信里抱怨,BGP實(shí)在是太難了!
一是這玩意兒本來(lái)就很復(fù)雜,需要處理大量的路由信息和復(fù)雜的算法;再一個(gè)是需要你有一定的實(shí)戰(zhàn)經(jīng)驗(yàn)才能深入理解運(yùn)作。
雖然BGP確實(shí)有一定難度,但你總得先從技術(shù)理論開(kāi)始吃透它吧?
學(xué)習(xí)掌握了BGP,對(duì)工作中提高網(wǎng)絡(luò)性能、增強(qiáng)網(wǎng)絡(luò)穩(wěn)定性以及安全性等等多方面,都挺關(guān)鍵的。
想吃透BGP,繞不開(kāi)我今天要說(shuō)的這些基礎(chǔ)概述和實(shí)例!
01
基礎(chǔ)概述
說(shuō)BGP之前,我們先從計(jì)算機(jī)網(wǎng)絡(luò)的基礎(chǔ)開(kāi)始說(shuō)起。
當(dāng)前所使用的計(jì)算機(jī)網(wǎng)絡(luò)中,一個(gè)網(wǎng)絡(luò)通常用一個(gè)IP網(wǎng)段來(lái)表示。
要將所有網(wǎng)絡(luò)連接起來(lái),并且要通信,就需要將這些IP網(wǎng)段連接起來(lái),讓每個(gè)IP網(wǎng)段都知道其它IP網(wǎng)段的信息,就可以實(shí)現(xiàn)全網(wǎng)通信。
將網(wǎng)絡(luò)與網(wǎng)絡(luò)連接起來(lái)的設(shè)備都是路由器,只要網(wǎng)絡(luò)中每一臺(tái)路由器都得知所有的IP網(wǎng)段信息,就可以為全網(wǎng)提供數(shù)據(jù)轉(zhuǎn)發(fā)。
如果某一臺(tái)路由器不能得知所有的IP網(wǎng)段信息,也就表示這臺(tái)路由器所連接的網(wǎng)絡(luò)不能與其他網(wǎng)段通信。
為了幫助路由器獲得全網(wǎng)IP網(wǎng)段信息,因此路由協(xié)議工作在路由器與路由器之間,讓網(wǎng)絡(luò)中每一臺(tái)路由器都擁有全網(wǎng)完整的路由信息,從而實(shí)現(xiàn)全網(wǎng)可達(dá)。
從上可以看出,路由協(xié)議在路由器之間傳遞路由信息,是保證網(wǎng)絡(luò)通信的基礎(chǔ)。
如果路由器協(xié)議傳遞了錯(cuò)誤的路由信息,或者沒(méi)有傳遞路由信息,將導(dǎo)致某些網(wǎng)絡(luò)通信的中斷,所以路由協(xié)議從一臺(tái)路由收到路由更新后,必須毫不保留地傳遞給其它路由器。
而當(dāng)一個(gè)網(wǎng)絡(luò)失效后,也必須告知其它路由器該網(wǎng)段不可達(dá),需要將相應(yīng)路由器刪除。
當(dāng)全網(wǎng)每一臺(tái)路由器都需要擁有所有的路由信息,并且完全一致時(shí),這種狀態(tài)被稱為收斂狀態(tài),一個(gè)網(wǎng)絡(luò)只有在收斂狀態(tài)時(shí),才能保證全網(wǎng)可達(dá)。
而當(dāng)今所使用的龐大的互聯(lián)網(wǎng),是由數(shù)萬(wàn)臺(tái)路由器連接起來(lái)的。
如果每一臺(tái)路由器都擁有互聯(lián)網(wǎng)中的每一條路由信息,那么就意味著每一臺(tái)路由器都將擁有數(shù)十萬(wàn)甚至數(shù)百萬(wàn)條路由條目,這個(gè)數(shù)量是驚人的。
但是由于路由協(xié)議的特征以及互聯(lián)網(wǎng)全網(wǎng)通信的需求,就必須讓互聯(lián)網(wǎng)中每一臺(tái)路由器將自己的路由信息與其它路由器互換,使整個(gè)互聯(lián)網(wǎng)的達(dá)到收斂狀態(tài)。
雖然這是鐵定的要求,但是請(qǐng)仔細(xì)想一下,這是萬(wàn)萬(wàn)不可能的。
因?yàn)橐粋€(gè)擁有數(shù)萬(wàn)臺(tái)路由器組建起來(lái)的超大型網(wǎng)絡(luò),永遠(yuǎn)不可能達(dá)到收斂狀態(tài)。
當(dāng)某個(gè)網(wǎng)絡(luò)斷開(kāi)時(shí),先得知的路由器需要將這個(gè)信息告知給其它所有路由器,因?yàn)樾畔⑹且慌_(tái)傳一臺(tái)傳過(guò)去的,所以一個(gè)網(wǎng)絡(luò)斷開(kāi)的信息要讓數(shù)萬(wàn)臺(tái)路由器都知道,這需要很長(zhǎng)的時(shí)間。
并且可能在這個(gè)信息還沒(méi)有傳遍整個(gè)網(wǎng)絡(luò)時(shí),這個(gè)之前中斷的網(wǎng)絡(luò)就恢復(fù)了正常。
那么這時(shí),先知道的路由器又要重新向網(wǎng)絡(luò)中通告該網(wǎng)段恢復(fù)正常的信息。
如此一來(lái),互聯(lián)網(wǎng)中不斷變化的網(wǎng)絡(luò),會(huì)讓所有路由器不停地傳遞路由信息,結(jié)果是導(dǎo)致網(wǎng)絡(luò)中路由信息的不一致,也將導(dǎo)致龐大的路由更新影響所有路由器的性能。
因此,互聯(lián)網(wǎng)中,一個(gè)網(wǎng)絡(luò)的中斷與恢復(fù),實(shí)在沒(méi)有必須通告給數(shù)以萬(wàn)計(jì)的路由器。
而網(wǎng)絡(luò)的信息,必須向其它路由器通告。
那么,一臺(tái)路由器的路由信息,既然沒(méi)有必須向網(wǎng)絡(luò)中每一臺(tái)路由器通告,它究竟該通告給哪些路由器呢?
或者換句話說(shuō),它的路由更新通告的范圍究竟有多大呢?
基于以上種種原因,所以我們將–臺(tái)路由器的路由更新限制在一定的范圍內(nèi),也只有這樣,一個(gè)被劃分為更小范圍的網(wǎng)絡(luò),才能達(dá)到收斂狀態(tài)。
所以現(xiàn)實(shí)情況是,我們的互聯(lián)網(wǎng)被劃分成了一個(gè)一個(gè)更小范圍的網(wǎng)絡(luò)。
任何一臺(tái)路由器的路由更新,被限制在這個(gè)特定的范圍內(nèi),而這個(gè)特定的范圍,就是你應(yīng)該知道的被稱為自治系統(tǒng)的網(wǎng)絡(luò)范圍,即autonomous system (AS)。
互聯(lián)網(wǎng)中路由協(xié)議的更新只應(yīng)該在一一個(gè)AS內(nèi)部傳遞。
但是互聯(lián)網(wǎng)是需要全網(wǎng)通信的,所以必須讓每一個(gè)AS都能夠獲得其它AS的路由信息才行。
因此,路由協(xié)議被定義為兩種截然不同的種類,即只在一一個(gè)AS內(nèi)部更新的路由協(xié)議,稱為Interior Gateway Protocol(IGP) 。
以及在AS 與AS之間更新的路由協(xié)議,稱為 Border Gateway Protocol (BGP)。
需要更多的解釋,將互聯(lián)網(wǎng)劃分成多個(gè)AS,目的并不僅僅是將路由協(xié)議的更新限制在特定的范圍內(nèi);
還有一個(gè)重要的原因是,將互聯(lián)網(wǎng)劃分成若千個(gè)小范圍的網(wǎng)絡(luò)后,那么這每一個(gè)小網(wǎng)絡(luò)就可以單獨(dú)定義各自的路由策略與安全策略,并且這樣不需要干擾其它AS,也不受其它AS干擾。
比如網(wǎng)絡(luò)中若干的ISP,這些ISP對(duì)自己的網(wǎng)絡(luò)需要制定自己的策略,又需要讓這些策略保持私有性而不與其它ISP互相干擾,所以劃分AS,幫他們實(shí)現(xiàn)了這個(gè)目的。
只能在一個(gè)AS內(nèi)部傳遞更新的IGP路由協(xié)議有RIP, EIGRP, OSPF, IS-IS, 可以在AS之間傳遞更新的路由協(xié)議目前只有BGP。
但是有個(gè)特別之處是,EIGRP 也使用了AS的概念來(lái)工作。
運(yùn)行EIGRP的網(wǎng)絡(luò)也會(huì)被劃分成多個(gè)AS,雖然默認(rèn)情況下,EIGRP不能在AS與AS之間更新路由信息,但是EIGRP也可以實(shí)現(xiàn)AS之間的路由更新。
需要說(shuō)明的是,EIGRP概念中的AS與BGP的AS并無(wú)任何關(guān)聯(lián),它們之間沒(méi)有任何共同操作性。
真正的AS是指BGP的AS,而EIGRP不管有什么樣的AS特征,它永遠(yuǎn)被限制在BGP的單一AS之中。
02
BGP AS
對(duì)于BGP的AS號(hào)碼的分配,是由Internet Assigned Number Authority(IANA)機(jī)構(gòu)來(lái)統(tǒng)一規(guī)劃和分配的。
IOS中運(yùn)行的BGP,目前最多支持4字節(jié)長(zhǎng)度的AS號(hào)碼,但并不表示所有AS號(hào)碼都能任意配置。
在2009年1月之后,(IANA)決定使用4字節(jié)長(zhǎng)度AS范圍是65535-4294967295。
當(dāng)前,通常還是使用2字節(jié)長(zhǎng)度的AS,也就是1-65535,所以不對(duì)4字節(jié)的AS號(hào)碼做太多討論。
因?yàn)锽GP是使用在互聯(lián)網(wǎng)之中的,互聯(lián)網(wǎng)由多個(gè)BGP AS域組成,所以互聯(lián)網(wǎng)中不能出現(xiàn)AS號(hào)碼相同的域。
如果一臺(tái)路由器要接入互聯(lián)網(wǎng)并運(yùn)行BGP,那么必須向IANA申請(qǐng)合法的AS號(hào)碼。
為了考慮到某些大型企業(yè)需要使用BGP與ISP對(duì)接,而又沒(méi)有足夠的AS號(hào)碼用來(lái)給企業(yè)用戶,所以將AS號(hào)碼劃分為公有AS和私有AS。
公有AS的范圍是1-64511,私有AS范圍是64512-65534。
公有AS只能用于互聯(lián)網(wǎng),并且全球唯一,不可重復(fù),而私有AS可以在得不到合法AS的企業(yè)網(wǎng)絡(luò)使用,可以重復(fù)。
很顯然,因?yàn)樗接蠥S可以被多個(gè)企業(yè)網(wǎng)絡(luò)重復(fù)使用,所以這些私有AS不允許傳入互聯(lián)網(wǎng),ISP在企業(yè)用戶邊緣,需要過(guò)濾掉帶有私有AS號(hào)碼的路由條目。
03
BGP 鄰居
如果你在自己的PC上從某個(gè)FTP服務(wù)器下載文件,那么你的PC只要和FTP服務(wù)器是通暢的即可。
也就是說(shuō)你的PC只要ping得通FTP服務(wù)器就行,不管距離有多遠(yuǎn),因?yàn)椴豢赡軓腇TP服務(wù)器上下載文件的PC都與之是直接連在一起的。
PC從FTP服務(wù)器下載文件時(shí),使用的是TCP傳輸,當(dāng)數(shù)據(jù)在中途出現(xiàn)丟包時(shí),被丟棄的數(shù)據(jù)包能夠得到重新傳遞,從而保證下載的文件是完整的。
由于BGP運(yùn)行在整個(gè)互聯(lián)網(wǎng),傳遞著數(shù)量龐大的路由信息,因此需要讓BGP路由器之間的路由傳遞具有高可靠性和高準(zhǔn)確性;
所以BGP路由器之間的數(shù)據(jù)傳輸使用了TCP協(xié)議,端口號(hào)為179,并且指的是會(huì)話目標(biāo)端口號(hào)為179,而會(huì)話的目標(biāo)端口號(hào)為179,而會(huì)話源端口號(hào)是隨機(jī)的。
正因?yàn)锽GP使用了TCP協(xié)議傳遞,所以兩臺(tái)運(yùn)行BGP的路由器只要通信正常,也就是說(shuō)只要ping得通,而不管路由器之間的距離有多遠(yuǎn),都能形成BGP鄰居,從而互換路由信息。
一個(gè)配置BGP進(jìn)程的路由器只能稱為BGP-Speaker,當(dāng)和其它運(yùn)行了BGP的路由器形成鄰居之后,就被稱為BGP-Peer。
如果一個(gè)網(wǎng)絡(luò)中的多臺(tái)路由器都運(yùn)行OSPF之后,那么這些路由器會(huì)在相應(yīng)網(wǎng)段去主動(dòng)發(fā)現(xiàn)OSPF鄰居,并主動(dòng)和對(duì)對(duì)方形成OSPF鄰居。
而一個(gè)路由器運(yùn)行BGP后并不會(huì)主動(dòng)去發(fā)現(xiàn)和尋找其它BGP鄰居,BGP的鄰居必須手工指定。
BGP和其它路由協(xié)議一樣,傳遞的是網(wǎng)絡(luò)層協(xié)議,如IP協(xié)議,除此之外,BGP還能夠傳遞除IP協(xié)議之外的其它網(wǎng)絡(luò)層協(xié)議,能夠傳遞的協(xié)議如下:
!!IP Version 4 (IPv4) IP Version 6 (IPv6)
Virtual Private Netwoks version 4 (VPNv4)
Connectiononless Network Service (CLNS)
Layer 2 VPN(L2VPN)
這些協(xié)議都被為 address family,配置時(shí),需要進(jìn)入相應(yīng)的協(xié)議 address family 模式,而IPv4除外。
所有命令在address family 中獨(dú)立配置,獨(dú)立生效,并且都擁有獨(dú)立的數(shù)據(jù)庫(kù)。
正常的BGP配置模式被稱為NLRI模式中配置,在NLRI模式中配置的參數(shù)只對(duì)IPv4單播生效。
IOS支持四個(gè)AFI模式,為IPv4,IPv6,CLNS,VPNv4,并且IPv4和IPv6還有單播和組播之分。
思科路由器運(yùn)行的BGP為version4,一臺(tái)路由器只能運(yùn)行一個(gè)BGP進(jìn)程,并且整臺(tái)路由器只能屬于一個(gè)AS;
但是一臺(tái)路由器可以承載多個(gè)address Family,而一個(gè)支持多個(gè)address family 的BGP和一個(gè)不支持的可以正常通信,但這也僅限于IPv4。
一臺(tái)BGP路由器運(yùn)行在一個(gè)單一的AS內(nèi),在和其它BGP路由器建立鄰居時(shí),如果對(duì)方路由器和自己屬于相同AS,則鄰居關(guān)系為 Internal BGP(iBGP),如果屬于不同AS,則鄰居關(guān)系為external BGP (eBGP)。
BGP要求eBGP鄰居必須直連,而iBGP鄰居可以任意距離,但這些都是可以改變的。
在BGP形成鄰居后,開(kāi)始會(huì)交換所有路由信息,但是之后都采用增量更新,也就是只有在路由有變化時(shí)才更新,并且只更新有變化的路由。
BGP建立鄰居后,開(kāi)始后,會(huì)通過(guò)相互發(fā)送類似hello包的數(shù)據(jù)來(lái)維持鄰居關(guān)系,這個(gè)數(shù)據(jù)包稱為Keepalive,便認(rèn)為鄰居丟失,則斷開(kāi)與鄰居的連接。
BGP之間建立鄰居,需要經(jīng)歷如下幾個(gè)過(guò)程:
Idle——BGP 進(jìn)程被啟動(dòng)或被重置,這個(gè)狀態(tài)是等待開(kāi)始,比如等于指定一個(gè)BGPpeer,當(dāng)收到TCP連接請(qǐng)求后,便初始化另外一個(gè)事件,當(dāng)路由器或peer重置,都會(huì)回到idle狀態(tài)。
Connect——檢測(cè)到有peer要嘗試建立TCP連接。
Active——嘗試和對(duì)方peer建立TCP連接,如有故障,則回到idle狀態(tài)。
OpenSent——TCP 連接已經(jīng)建立,BGP發(fā)送了一個(gè)0PEN消息給對(duì)方peer,然后切換到OpenSent狀態(tài),如果失敗,則切換到Active狀態(tài)。
OpenReceive——收到對(duì)方peer的OPEN消息,并等待keepalive消息,如果收到keepalive,則轉(zhuǎn)到Establ ished狀態(tài),如果收到notification,則回到idle狀態(tài),比如錯(cuò)誤或配置改變,都會(huì)發(fā)送notification而回到idle狀態(tài)。
Established——從對(duì)端peer收到子keepalive,并開(kāi)始交換數(shù)據(jù),收到keepalive后,holdtimer都會(huì)被重置,如果收到notification,就回到idle 狀態(tài)。
05
BGP 更新源
BGP并不能主動(dòng)在網(wǎng)絡(luò)中尋找鄰居,必須手工指定BGP鄰居的地址,那么BGP才會(huì)將數(shù)據(jù)包發(fā)往指定的地址來(lái)請(qǐng)求建立鄰居。
與此同時(shí),BGP發(fā)出的請(qǐng)求數(shù)據(jù)包除了寫明目標(biāo)IP地址外,還要寫上自己的IP地址,即BGP源地址。
路由器自己產(chǎn)生流量后從接口發(fā)出時(shí),流量從哪個(gè)接口被發(fā)出,那么這些數(shù)據(jù)包的源IP地址就是哪個(gè)接口的地址。
因此當(dāng)BGP發(fā)出數(shù)據(jù)包尋找鄰居時(shí),這些數(shù)據(jù)包從那些接口被發(fā)出,那么BGP源IP地址就是哪個(gè)接口的地址。
要兩臺(tái)BGP路由器要正常建立鄰居,必須雙方路由器都相互指定鄰居,相互發(fā)送數(shù)據(jù)包才行。
當(dāng)一臺(tái)BGP路由器收到建立鄰居的請(qǐng)求后,如果發(fā)現(xiàn)數(shù)據(jù)包的目標(biāo)IP不是自己的BGP源地址。
那么就拒絕該連接的請(qǐng)求后,只有當(dāng)請(qǐng)求數(shù)據(jù)包的目標(biāo)與自己的BGP源地址相同時(shí),才可建立BGP鄰居。
需要注意的是,這個(gè)條件只在兩個(gè)鄰居之間,任意一個(gè)鄰居滿足條件即可,并不需要雙方都滿足;
也就是說(shuō)一方收到的數(shù)據(jù)包目標(biāo)IP與自己的BGP源地址相同即可;
另一方收到的數(shù)據(jù)包目標(biāo)IP與它的BGP源地址不同也沒(méi)關(guān)系,只要單方面符合條件就行,但我們通常都將BGP兩端的源與目標(biāo)保持一致。
BGP 的源地址是可以隨意更改的,但只能是路由器上的接口地址。如下圖:
在上圖中,R1與R2之間有兩條鏈路。
當(dāng)配置BGP鄰居時(shí),如果R1指定鄰居地址為12. 1.1.2, R2指定鄰居地址為12. 1.1.1。
那么在建立鄰居過(guò)程中,R1 將請(qǐng)求數(shù)據(jù)包從接口F0/0發(fā)出,數(shù)據(jù)包的目標(biāo)IP為12. 1. 1.2, BGP 源地址為F0/0的接口地址12. 1.1.1。
當(dāng)R2將請(qǐng)求數(shù)據(jù)包從接口F0/0發(fā)出時(shí),數(shù)據(jù)包的目標(biāo)IP為12.1. 1.1, BGP 源地址為F0/0的接口地址12. 1.1.2。
由于R1發(fā)出的數(shù)據(jù)包目標(biāo)IP12. 1.1.2與R2的BGP源地址12. 1. 1.2完全相同,所以最終能夠正常建立BGP鄰居。
R1在檢測(cè)地址時(shí),R2的目標(biāo)IP與R1的源也完全相同,通常我們都保證雙方一致。
當(dāng)R1與R2之間的直連接口F0/0中斷后,如果雙方將數(shù)據(jù)包從S0/0發(fā)出,那么R1的源地址就是10. 1. 1.1, R2的源地址就是20. 1.1.2;
由此可以看出,雙方發(fā)出的數(shù)據(jù)包的目標(biāo)IP都與對(duì)方的源地址不符,所以無(wú)法建立BGP鄰居。
雖然在上面的網(wǎng)絡(luò)環(huán)境中,雙方路由器之間都擁有多條鏈路,在中斷某條鏈路之間,仍然可以通信,但是這并不能保證BGP鄰居的永久連接。
為了使擁有多條鏈路的BGP鄰居之間永遠(yuǎn)保持連接,考慮到路由器的loopback口在設(shè)備正常工作的情況下,不會(huì)像物理接口那樣出現(xiàn)中斷,所以建議在BGP鄰居之間使用loopback 接口的地址來(lái)建立TCP連接。
當(dāng)指定鄰居時(shí),不再將鄰居的地址指定為對(duì)方物理接口地址,而改為指定對(duì)方的loopback地址。
這樣一來(lái),既然物理接口中斷,只要還有通暢的鏈路,那么BGP鄰居仍然可以保持連接。
在將BGP鄰居地址指定為對(duì)方loopback地址時(shí),為了使數(shù)據(jù)包的目標(biāo)IP與對(duì)方的BGP源地址相同,所以鄰居也要將BGP源地址更改為自己的loopback接口地址,從而使得雙方正常建立BGP連接。
在上圖中,當(dāng)R1指定鄰居地址為2.2.2.2,BGP 源地址為1.1.1.1, 而R2指定鄰居地址為1.1.1.1, BGP源地址為2.2.2.2,這樣一來(lái),雙方的目標(biāo)IP都與對(duì)方的BGP源地址相同。
所以可以正常建立鄰居,并且在雙方鏈路中,任何一條鏈路斷開(kāi),都不影響鄰居的會(huì)話,BGP 的連接仍然保持而不會(huì)中斷,實(shí)現(xiàn)了連接的冗余性和穩(wěn)定性。
06
BGP TTL
BGP的路由可能會(huì)從一個(gè)AS發(fā)往另外一個(gè)AS,從而穿越多個(gè)AS。
但是由于運(yùn)行BGP的網(wǎng)絡(luò)會(huì)是一個(gè)很大的網(wǎng)絡(luò),路由從一個(gè)AS被發(fā)出,可能在經(jīng)過(guò)轉(zhuǎn)發(fā)之后,又回到了開(kāi)始的AS之中,形成路由環(huán)路。
所以出于防止環(huán)路的目的考慮,BGP 在將路由發(fā)往其它AS時(shí),也就是發(fā)給eBGP鄰居時(shí),需要在路由中寫上自己的AS號(hào)碼。
下一個(gè) AS收到路由后,再發(fā)給其它AS時(shí),除了保留之前的AS號(hào)碼之外,也要添加上自己的AS號(hào)碼。
這樣寫在路由中的AS被稱為AS -path,如果BGP收到的路由的AS_ PATH中包含自己的AS號(hào)碼,就認(rèn)為路由被發(fā)了回來(lái),以此斷定出現(xiàn)了路由環(huán)路,就會(huì)丟棄收到的路由。
BGP只有在將路由發(fā)給eBGP時(shí),才會(huì)在AS- path中添加自己的AS號(hào)碼,而在發(fā)給iBGP時(shí),是不會(huì)添加AS號(hào)碼的。
因?yàn)閕BGP鄰居在同一個(gè)AS中,即使要添加,AS 號(hào)碼全是一樣的,所以沒(méi)有必要。
在上圖中,當(dāng)路由穿越各個(gè)AS時(shí),所有發(fā)給eBGP鄰居的路由,都會(huì)在AS-path中添加自己的AS,自己的AS總是添加在AS-path的前面。
例如:
一條路由從AS10被發(fā)往AS 20,則AS-path為“10”,當(dāng)AS 20 將路由發(fā)往AS 30時(shí),添加上自己的AS號(hào)碼20之后,AS- path變成“20, 10”,當(dāng)AS 30將路由發(fā)往AS 50時(shí),AS 50收到的路由的AS-path為“30, 20, 10”。
當(dāng)AS 30將路由發(fā)給AS 40, AS 40再將路由發(fā)給AS 10時(shí),路由的AS- path為“40, 30,20, 10”;
由于AS 10 在收到路由后,發(fā)現(xiàn)AS- path中包含自己的AS號(hào)碼10,所以認(rèn)為出現(xiàn)環(huán)路,便丟棄收到的所有路由。
在IGP協(xié)議中,我們將路由協(xié)議分成兩大類:距離矢量路由協(xié)議和鏈路狀態(tài)路由協(xié)議,而B(niǎo)GP被劃分為路徑矢量路由協(xié)議(path-vector routing) ,路徑矢量算法結(jié)合了距離矢量特性與AS- path防環(huán)特性。
因?yàn)锽GP在將路由發(fā)給eBGP鄰居時(shí),會(huì)將自己的AS號(hào)碼添加到AS- path中,所以可以以此來(lái)防止環(huán)路。
而在將路由發(fā)給iBGP時(shí),是不會(huì)往AS -path添加AS號(hào)碼的,因此在iBGP之間傳遞路由時(shí),沒(méi)有防止環(huán)路的機(jī)制。
考慮到為iBGP之間的路由傳遞也加入防環(huán)機(jī)制,因而強(qiáng)制將BGP路由在AS內(nèi)部只傳一跳。
具體操作為:
一臺(tái)BGP路由器從eBGP鄰居收到路由,發(fā)給iBGP鄰居之后,iBGP鄰居收到后就不能再傳給其它任何iBGP鄰居,只能傳遞給eBGP鄰居。
此規(guī)則被多數(shù)人稱為BGP的水平分割,就是一臺(tái)BGP路由器從iBGP鄰居收到的路由,不能傳遞給其它iBGP 鄰居,只能傳給eBGP鄰居。如下圖:
在上圖中,當(dāng)R1從eBGP鄰居R6那里收到路由后,可以發(fā)給任何iBGP鄰居,包括R3和R4。
當(dāng)R3從iBGP鄰居R1那里收到路由后,不可以轉(zhuǎn)發(fā)給任何iBGP鄰居,只可以轉(zhuǎn)發(fā)給eBGP鄰居,所以R3從R1收到路由后,只能轉(zhuǎn)發(fā)給eBGP鄰居R5。
由于R3和R4從R1收到路由后,都不可以轉(zhuǎn)發(fā)給iBGP鄰居R2。
在上圖環(huán)境中,終造成R2無(wú)法接收任何路由,要讓R2收到路由,建議在R1與R2之間再建立一條BGP會(huì)話。
所以如此一來(lái),在同一個(gè)AS中,要將路由全網(wǎng)傳遞,就需要在iBGP鄰居之間配置全互聯(lián),最終AS 20內(nèi)的鄰居關(guān)系如下圖:
在AS內(nèi)部,除了建立全互聯(lián)的iBGP鄰居關(guān)系外,還可以通過(guò)BGP Reflector (BGP反射器)和BGP Confederation(BGP聯(lián)邦)的方式來(lái)實(shí)現(xiàn)路由全網(wǎng)傳遞,將在后續(xù)介紹。
07
BGP路由表
當(dāng)路由器之間建立BGP鄰居之后,就可以相互交換BGP路由。
一臺(tái)運(yùn)行了BGP協(xié)議的路由器,會(huì)將BGP得到的路由與普通路由分開(kāi)存放,所以BGP路由器會(huì)同時(shí)擁有兩張路由器:
一張是存放普通路由的路由表,被稱為IGP路由表。
就是平時(shí)我們使用命令show ip route 看到的路由表,IGP 路由表的路由信息只能從IGP協(xié)議和手工配置獲得,并且只能傳遞給IGP協(xié)議。
另外一張就是運(yùn)行BGP之后創(chuàng)建的路由表,稱為BGP路由表。
需要通過(guò)命令show ip bgp才能查看,BGP路由表的路由信息只能傳遞給BGP協(xié)議,如果兩臺(tái)BGP鄰居的BGP路由表為空,就不會(huì)有任何路由傳遞。
在初始狀態(tài)下,BGP 的路由表為空,沒(méi)有任何路由,要讓BGP傳遞相應(yīng)的 路由,只能先將該路由導(dǎo)入BGP路由表,之后才能在BGP鄰居之間傳遞。
默認(rèn)情況下,任何路由都不會(huì)自動(dòng)進(jìn)入BGP路由表,BGP路由表的路由獲得有多種方式:
可以從BGP鄰居獲得,也可以手工將IGP路由導(dǎo)入BGP路由表,還可以將其它路由重分布進(jìn)BGP。
只要BGP的路由不是從鄰居學(xué)習(xí)到的而是手工導(dǎo)入的,那么這樣的路由被稱為BGP本地路由。
因?yàn)锽GP的鄰居類型分為兩種:
eBGP和iBGP,所以BGP路由的AD值也有區(qū)分,如果BGP的路由是從eBGP學(xué)習(xí)到的,AD值為20。
可以發(fā)現(xiàn),從eBGP鄰居學(xué)習(xí)到的路由,將優(yōu)于任何IGP協(xié)議:從iBGP學(xué)習(xí)到的路由的AD值為200,同樣可以發(fā)現(xiàn),此類路由的優(yōu)先級(jí)低于任何IGP協(xié)議。
BGP 除了以上兩種AD值之外,如果BGP 路由是從本地手工導(dǎo)入的,即BGP本地路由,則BGP本地路由的AD值為200,與iBGP路由的AD值相同,優(yōu)先級(jí)低于任何IGP協(xié)議。
如果某一條相同的路由同時(shí)從eBGP和iBGP以及本地路由學(xué)習(xí)到,那么究竟哪條路由會(huì)被選擇為最優(yōu)路徑呢?
路由的AD值并不一定會(huì)影響到路徑選擇,因?yàn)锽GP并不會(huì)在一開(kāi)始,就通過(guò)比較AD值來(lái)選擇最優(yōu)路徑。
08
BGP 同步
BGP鄰居之間的通信與交流運(yùn)行在TCP的基礎(chǔ)上,在兩個(gè)節(jié)點(diǎn)之間,只要網(wǎng)絡(luò)是通的,就能夠建立TCP。
網(wǎng)絡(luò)的連通,可以是任何IGP路由協(xié)議,甚至是靜態(tài)路由,總之,只要網(wǎng)絡(luò)是通的,TCP 連接就一定能夠建立起來(lái)。
只要讓兩臺(tái)路由器之間連通,保證TCP能夠正常連接,就能夠保證BCP的通信。
在一個(gè)AS中,除了需要建立BGP連接之外,同時(shí)還需要運(yùn)行FGP協(xié)議。
其中運(yùn)行BGP的目的是為了在大型網(wǎng)絡(luò)中傳遞龐大的路由表或路由信息,而運(yùn)行IGP協(xié)議的目的可想而知,并不是為了傳遞龐大的路由信息;
在AS中運(yùn)行IGP的根本目的是為了讓BGP路由器之間能夠建立TCP連接,從而為BGP的通信服務(wù)。
因此可以看出,BGP 就像是 一輛運(yùn)貨的卡車,BGP 的路由就是卡車要運(yùn)的貨,而IGP協(xié)議就是為了在站與站之間鋪平道路,如果沒(méi)有IGP去讓道路連通,那么BGP就無(wú)法在站與站之間運(yùn)送貨物。
因?yàn)锽GP在建立鄰居時(shí),BGP的源地址可以是任意地址,這些地址可以不是直連的,只要是能通信的,能建立TCP連接即可。
當(dāng)BGP在向鄰居發(fā)送流量時(shí),只要將流量發(fā)往鄰居的對(duì)端地址,因?yàn)猷従拥牡刂凡⒉灰欢ㄊ侵边B的,所以要找到去往鄰居地址的路徑,可能需要查詢IGP路由表,因?yàn)镮GP為BGP的通信與連接提供了保證。
由此可見(jiàn),BGP 要將數(shù)據(jù)發(fā)給鄰居,BGP 在查詢?nèi)ネ従拥穆窂綍r(shí),采用的是遞歸查詢,BGP 查詢?nèi)ネ従拥倪^(guò)程中,可能要多次查詢IGP路由表;
只要在IGP路由表中找到了去往鄰居地址的相應(yīng)路徑或相應(yīng)下一跳,那么就會(huì)將數(shù)據(jù)發(fā)給這個(gè)下一跳。
在上圖的網(wǎng)絡(luò)中,R1與R4建立eBGP連接,R3與R5建立eBGP連接,而R1與R3建立iBGP連接。
在R1與R3建立iBGP連接時(shí),R1通過(guò)目標(biāo)地址3.3.3.3找到鄰居R3, R1的BGP源地址為1.1.1.1, 而R3也通過(guò)目標(biāo)地址1. 1. 1.1找到鄰居R1,R3的BGP源地址為3.3.3.3;
為了讓1.1. 1.1和3.3. 3.3能夠正常通信,從而建立TCP連接,R1、R2、R3之間啟用了IGP協(xié)議0SPF, OSPF的目的只是為了使1.1.1.1能夠與3.3.3.3通信,并不傳遞AS中龐大的路由信息。
當(dāng)AS 10中的R4將網(wǎng)段10. 1.1.0/24通告給AS 20中的R1后,因?yàn)镽1與R3之間是iBGP鄰居,所以R1將路由10.1.1.0/24傳遞給R3,最終R3將路由10.1.1.0/24傳遞給AS30中的R5。
當(dāng)R5將目的地為10.1.1.0/24的流量發(fā)給R3時(shí),R3在查詢路由表后得知,去往10.1. 1. 0/24的數(shù)據(jù)包需要發(fā)給iBGP鄰居1.1.1.1才能夠到達(dá);
于是R3便執(zhí)行遞歸查詢,查詢?nèi)绾稳ネ?.1.1.1,正因?yàn)镽1與R3之間的通信是靠OSPF提供的,所以R3得知去往1.1.1.1必須將數(shù)據(jù)包交給R2;
即給下一跳23.1.1.2,因?yàn)镽2只運(yùn)行了OSPF為BGP服務(wù),所以R2沒(méi)有BGP的路由10. 1.1.0/24,當(dāng)R2發(fā)現(xiàn)數(shù)據(jù)包的目標(biāo)地址為10. 1. 1. 0/24后,只能將數(shù)據(jù)包全部丟棄,這就類似于路由黑洞。
從以上情況中可以看出,當(dāng)BGP從iBGP收到路由時(shí),因?yàn)猷従又g可能跨越了多臺(tái)IGP路由器。
所以BGP在將數(shù)據(jù)包發(fā)往目的地時(shí),通常會(huì)發(fā)給一臺(tái)只運(yùn)行了 IGP的路由器,而只運(yùn)行IGP的路由器并沒(méi)有BGP的路由,因而最終導(dǎo)致數(shù)據(jù)包丟失,造成路由黑洞。
要杜絕此類問(wèn)題的發(fā)生,其實(shí)答案很明了,就是讓AS中只運(yùn)行IGP的路由器同時(shí)也擁有BGP的路由表即可。
由于以上原因,在BGP路由傳遞中,有以下一條規(guī)則:當(dāng)BGP要將從iBGP鄰居學(xué)習(xí)到的路由信息傳遞給其它鄰居之前(這個(gè)鄰居通常是eBGP鄰居),這些路由必須在IGP路由表中也能學(xué)到,否則認(rèn)為此路由無(wú)效而不能發(fā)給其它鄰居。
此規(guī)則稱為iBGP與IGP路由同步。
在上圖環(huán)境中,在R3將從iBGP鄰居R1學(xué)習(xí)到的路由傳遞給eBGP鄰居R5之前,必須確定這條路由在自己的IGP路由表中也存在,否則不使用該路由。
要查看路由在IGP路由表中是否存在,使用命令show ip route 即可。
注意,只有從iBGP鄰居學(xué)習(xí)到的路由,才受iBGP與IGP路由同步規(guī)則的限制,如果路由是從eBGP鄰居學(xué)習(xí)到的,則不受此規(guī)則限制,并且此規(guī)則可以手工開(kāi)啟或關(guān)閉。
BGP同步默認(rèn)是開(kāi)啟的,在IOS 12.2(8)T 以及之后的版本默認(rèn)都是關(guān)閉的。
-
算法
+關(guān)注
關(guān)注
23文章
4587瀏覽量
92500 -
路由器
+關(guān)注
關(guān)注
22文章
3693瀏覽量
113426 -
BGP
+關(guān)注
關(guān)注
0文章
83瀏覽量
15305
原文標(biāo)題:吃透BGP,永遠(yuǎn)繞不開(kāi)這些基礎(chǔ)概述,看完再也不怕BGP了!
文章出處:【微信號(hào):網(wǎng)絡(luò)工程師筆記,微信公眾號(hào):網(wǎng)絡(luò)工程師筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論