兩臺BGP路由器之間無需直連也可建立對等體關(guān)系,只要它們具備IP連通性并且可以建立TCP連接即可。BGP的這個特點(diǎn)使得路由的傳遞更加靈活,然而稍有不慎,這個特性也可能帶來一個麻煩,例如路由黑洞。
以圖1為例,R1、R2、R3及R7均是BGP路由器,并且按照圖示建立BGP對等體關(guān)系。AS 34567內(nèi)已經(jīng)部署了OSPF,使得AS內(nèi)部的路由器能夠獲知到達(dá)該AS內(nèi)各個網(wǎng)段的路由信息。R4、R5及R6并不運(yùn)行BGP,只運(yùn)行OSPF,得益于AS34567內(nèi)運(yùn)行的OSPF,R3及R7實(shí)現(xiàn)了IP連通性(R3及R7之間并沒有直連的物理鏈路),并且建立起了IBGP對等體關(guān)系。
圖1 BGP環(huán)境中路由黑洞的產(chǎn)生背景
現(xiàn)在R1將AS 100內(nèi)的1.0.0.0/8路由發(fā)布到了BGP,然后將這條路由通告給了R3,而R3則將這條BGP路由通過IBGP連接直接通告給了R7(假設(shè)R3在將該BGP路由通告給R7時,告知了R7需經(jīng)自己到達(dá)該路由所指向的目的地,為了達(dá)到這個目的,R3將該BGP路由的Next_Hop屬性值設(shè)置為它自己的地址),R7再將其通告給R2,最終R2能夠通過BGP學(xué)習(xí)到1.0.0.0/8這條來自AS 100的路由并將其加載到自己的路由表中。
現(xiàn)在R2收到一個去往1.0.0.0/8的數(shù)據(jù)包,它查詢路由表后發(fā)現(xiàn)到達(dá)該目的地的下一跳為R7,于是將數(shù)據(jù)包轉(zhuǎn)發(fā)給R7。R7收到這個數(shù)據(jù)包后也進(jìn)行路由表查詢,結(jié)果發(fā)現(xiàn)到達(dá)該目的地的下一跳為R3,然而R3并非它的直連路由器,它意識到下一跳路由器處于一個遠(yuǎn)端網(wǎng)段,因此它將繼續(xù)在自己的路由表中查詢到達(dá)R3的路由(也即遞歸查詢)。由于AS 34567內(nèi)已經(jīng)運(yùn)行了OSPF,R7發(fā)現(xiàn)可以通過OSPF路由到達(dá)R3,而且下一跳是R4(假設(shè)當(dāng)網(wǎng)絡(luò)正常時,R7選擇經(jīng)R4到達(dá)R3)。如此一來R7意識到要將數(shù)據(jù)包送達(dá)1.0.0.0/8,需先將其轉(zhuǎn)發(fā)給R4。
當(dāng)R4收到這個發(fā)往1.0.0.0/8的數(shù)據(jù)包時,它將在自己的路由表中查詢到達(dá)該目的網(wǎng)段的路由,由于該路由是在BGP中被通告的(AS 34567內(nèi)運(yùn)行的OSPF并不知曉到達(dá)這個目的網(wǎng)段的路由),而R4恰恰沒有運(yùn)行BGP,至此在R4上就出現(xiàn)了路由黑洞,發(fā)往這個目的網(wǎng)段的數(shù)據(jù)包在R4這里被丟棄。同樣的問題也可能發(fā)生在R6上,當(dāng)R4發(fā)生故障時,R7將會把到達(dá)1.0.0.0/8的報文轉(zhuǎn)發(fā)給R6,而后者同樣存在路由黑洞問題。
為了規(guī)避路由黑洞問題,BGP引入了同步規(guī)則(BGP Synchronization)。所謂的BGP同步規(guī)則指的是:當(dāng)一臺路由器從自己的IBGP對等體學(xué)習(xí)到一條BGP路由時(這類路由被稱為IBGP路由),它將不能使用該條路由或把這條路由通告給自己的EBGP對等體,除非它又從IGP協(xié)議(例如OSPF等,此處也包含靜態(tài)路由)學(xué)習(xí)到這條路由,也就是要求IBGP路由與IGP路由同步。同步規(guī)則主要用于規(guī)避BGP路由黑洞問題。
還是以圖1為例,如果R7激活了BGP同步,那么當(dāng)它收到IBGP對等體R3通告的1.0.0.0/8路由時,缺省是不會使用該路由的,當(dāng)然也不會將其通告給EBGP對等體R2,只有當(dāng)R7又從IGP協(xié)議(例如AS 34567中運(yùn)行的OSPF)學(xué)習(xí)到1.0.0.0/8路由時,或者R7擁有到達(dá)1.0.0.0/8的靜態(tài)路由時,它才會使用這條BGP路由,并且將該BGP路由通告給R2。
此時R7的“想法”是:“我現(xiàn)在已經(jīng)通過BGP學(xué)習(xí)到了去往1.0.0.0/8的路由,而我的路由表里又存在到達(dá)該目的網(wǎng)段的OSPF路由,這樣看來網(wǎng)絡(luò)中的設(shè)備應(yīng)該都運(yùn)行了OSPF,并且也都通過OSPF發(fā)現(xiàn)了到達(dá)該目的網(wǎng)段的路由,那么如果我將到達(dá)該目的網(wǎng)段的數(shù)據(jù)包轉(zhuǎn)發(fā)出去,這些數(shù)據(jù)包應(yīng)該是可以被轉(zhuǎn)發(fā)到目的地的,因此我可以放心地使用該BGP路由并且將其通告給我的EBGP對等體了”。
在本案例中,要將R2發(fā)往1.0.0.0/8的數(shù)據(jù)包順利地轉(zhuǎn)發(fā)到目的地,可行的辦法有幾種。例如第一個辦法是在AS 34567內(nèi)的所有路由器上都運(yùn)行BGP,也就是讓R4、R5及R6也運(yùn)行BGP。
然而由于IBGP水平分割規(guī)則的存在,我們將不得不在AS34567內(nèi)實(shí)現(xiàn)IBGP對等體關(guān)系全互聯(lián),從而保證BGP路由不會丟失,此時需關(guān)閉設(shè)備上的BGP同步規(guī)則。如果AS34567內(nèi)的路由器數(shù)量特別大,那么IBGP全互聯(lián)的組網(wǎng)會給設(shè)備帶來沉重的負(fù)擔(dān),而且該網(wǎng)絡(luò)的可擴(kuò)展性也將受到制約。此時路由反射器及聯(lián)邦會是兩個不錯的解決方案。
第二個辦法是R3將BGP路由引入AS 34567中的OSPF,從而讓OSPF也能夠獲知到達(dá)1.0.0.0/8的路由。這樣對于R7而言這條路由也就滿足了同步規(guī)則~既從IBGP對等體學(xué)到,又從IGP協(xié)議獲知,而R4、R5及R6也能夠通過OSPF發(fā)現(xiàn)到達(dá)1.0.0.0/8的路由,因此路由黑洞的問題也就迎刃而解了。
當(dāng)然在R3上將BGP路由引入OSPF的操作需要非常謹(jǐn)慎地執(zhí)行,因?yàn)锽GP承載的路由信息往往是巨大的,如果不做任何限制地直接將BGP路由引入一個IGP協(xié)議,帶來的影響會很大?;谏鲜龇治?,這種辦法并非在所有場景中都適用。
第三個辦法是采用MPLS。MPLS(Multi-Protocol Label Switching,多協(xié)議標(biāo)簽交換)是一種標(biāo)簽交換技術(shù),簡單地說,就是在一個報文的IP頭部之前、數(shù)據(jù)幀頭部之后插入一個標(biāo)簽頭部,由于IP頭部“躲藏”在標(biāo)簽頭部之后,因此在數(shù)據(jù)從源被轉(zhuǎn)發(fā)到目的地的過程中,沿途的網(wǎng)絡(luò)設(shè)備只需根據(jù)標(biāo)簽頭部中的標(biāo)簽進(jìn)行選路,如此一來即使轉(zhuǎn)發(fā)設(shè)備沒有到達(dá)目的網(wǎng)絡(luò)的路由也不會影響數(shù)據(jù)轉(zhuǎn)發(fā),因?yàn)榇藭r它們是基于標(biāo)簽信息對報文進(jìn)行選路及轉(zhuǎn)發(fā)的,而不是基于目的IP地址。
綜上所述,解決BGP路由黑洞問題的方案很多,而且都比較成熟,在諸多成熟方案可供選擇的情況下,依然激活同步規(guī)則也就顯得沒有意義了,因此在華為數(shù)通產(chǎn)品上,BGP同步規(guī)則缺省是被關(guān)閉的。