華爲 RS BGP協議原理與配置學習筆記

BGP   Border Gateway Protocol,邊界網關協議

AS內部使用IGP來計算和發現路由,如OSPFISISRIP等。

AS之間使用BGP來傳遞和控制路由。

 如上圖所示,BGP可以跨越多跳路由器建立鄰居關係。爲實現路由按需求進行控制和優選,BGP設計了諸多屬性攜帶在路由中。BGP協議被設計運行在AS之間傳遞路由,AS之間是廣域網鏈路,數據包在廣域網上傳遞是可能出現不可預測的鏈路擁塞或丟失等情況,因此BGP使用TCP作爲其承載協議來保證可靠性。

BGP使用TCP封裝建立鄰居關係,端口號爲179,TCP採用單播建立連接,因此BGP協議並不像RIPOSPF一樣使用組播發現鄰居。單播建立連接也使BGP只能手動指定鄰居。

 

先啓動BGP的一端先發起TCP連接,如圖所示,RTB先啓動BGP協議,RTB使用隨機端口號向RTA179端口發起TCP連接。 

如果兩臺路由器同時啓動BGP協議,同時向179端口建立連接,會選擇 router id大的路由器建立起的連接。

BGP通過報文的交互完成鄰居建立、路由更新等操作,共有Open、Update、Notification、Keepalive和Route-refresh5種報文類型,如下圖所示,
Open報文:是TCP連接建立後發送的第一個報文,用於建立BGP鄰居之間的連接關係。BGP鄰居在接收到Open報文並協商成功後,將發送Keepalive報文確認並保持連接的有效性。確認後,BGP鄰居間可以進行UpdateNotificationKeepaliveRoute-refresh報文的交換。
Update報文:用於在BGP鄰居之間交換路由信息Update報文可以發佈多條屬性相同的可達路由信息,也可以撤銷多條不可達路由信息。
一條Update報文可以發佈多條具有相同路由屬性的可達路由,這些路由可共享一組路由屬性。所有包含在一個給定的Update報文裏的路由屬性適用於該Update報文中的NLRINetwork Layer Reachability Information)字段裏的所有目的地(用IP前綴表示)。
一條Update報文可以撤銷多條不可達路由。每一個路由通過目的地(用IP前綴表示),清楚地定義了BGP路由器之間先前通告過的路由。
一條Update報文可以只用於撤銷路由,這樣就不需要包括路徑屬性或者NLRI。相反,也可以只用於通告可達路由,就不需要攜帶撤銷路由信息了。
Notification報文:當BGP路由器檢測到錯誤狀態時,就向鄰居發出Notification報文,之後BGP連接會立即中斷。
Keepalive報文:BGP路由器會週期性的向鄰居發出Keepalive報文,用來保持連接的有效性
Route-refresh報文:Route-refresh用於在改變路由策略後請求對等體重新發送路由信息
 
BGP路由器報文交互過程:Idle狀態BGP初始狀態。在Idle狀態下,BGP路由器拒絕鄰居發送的連接請求。只有在收到本設備的Start事件後,BGP路由器纔開始嘗試與其鄰居進行TCP連接,並轉至Connect狀態

在Connect狀態下,BGP路由器啓動連接重傳定時器Connect Retry),等待TCP完成連接。如果TCP連接成功,那麼BGP路由器向鄰居發送Open報文,並轉至OpenSent狀態。 如果TCP連接失敗,那麼BGP路由器轉至Active狀態。 如果連接重傳定時器超時,BGP路由器仍沒有收到鄰居的響應,那麼BGP路由器繼續嘗試與其鄰居進行TCP連接,停留在Connect狀態。在Active狀態下,BGP路由器總是在試圖建立TCP連接。如果TCP連接成功,那麼BGP路由器向鄰居發送Open報文,關閉連接重傳定時器,並轉至OpenSent狀態。 如果TCP連接失敗,那麼BGP路由器停留在Active狀態。 如果連接重傳定時器超時,BGP路由器仍沒有收到鄰居的響應,那麼BGP路由器轉至Connect狀態。在OpenSent狀態下,BGP路由器等待鄰居的Open報文,並對收到的Open報文中的AS號、版本號、認證碼等進行檢查。如果收到的Open報文正確,那麼BGP路由器發送Keepalive報文,並轉至OpenConfirm狀態。 如果發現收到的Open報文有錯誤,那麼BGP路由器發送Notification報文給鄰居,並轉至Idle狀態。在OpenConfirm狀態下,BGP路由器等待KeepaliveNotification報文。如果收到Keepalive報文,則轉至Established狀態,如果收到Notification報文,則轉至Idle狀態。

在Established狀態下,BGP路由器可以和鄰居交換Update、Keepalive、Route-refresh報文和Notification報文。

生成BGP路由的方式有兩種:第一種是使用配置命令network,第二種是使用配置命令import。如圖所示,RTA上存在100.0.0.0/24100.0.1.0/24的兩個用戶網段,RTB上通過靜態路由指定去往100.0.0.0/24網段的路由,通過OSPF學到去往100.0.1.0/24的路由。RTBRTC建立EBGP的鄰居關係,RTB通過network命令宣告100.0.0.0/24,100.0.1.0/2410.1.12.0/24的路由,使對端EBGP鄰居RTC學習到RTB路由表裏的路由。

 

 

通過display命令在RTC上查看是否學到 BGP發佈的路由條目。 

 

 BGP本身並不會產生新的路由,不會自動去學習到路由,BGP就像一個大卡車,通過network或者是import的方式將IGP產生的路由裝載出去,進行傳遞。

lImport命令是根據運行的路由協議(RIPOSPFISIS等)將路由引入到BGP路由表中,同時import命令還可以引入直連和靜態路由。

 

 RTA上存在100.0.0.0/24100.0.1.0/24的兩個用戶網段,RTB上通過靜態路由指定去往100.0.0.0/24網段的路由,通過OSPF學到去往100.0.1.0/24的路由。RTBRTC建立EBGP的鄰居關係,RTB通過import命令宣告100.0.0.0/24,100.0.1.0/2410.1.12.0/24的路由,使對端EBGP鄰居學習到本AS內的路由。爲了防止其他路由被引入到BGP中,需要配置ip-prefix進行精確匹配,調用route-policyBGP引入路由時進行控制。

BGP通告原則之一 : 僅將自己最優的路由發佈給鄰居,當存在多條有效路由時,BGP路由器只將自己最優的路由發佈給鄰居。

BGP通告原則之二 : 通過EBGP獲得的最優路由發佈給所有BGP鄰居 

BGP通告原則之三 : 通過IBGP獲得的最優路由不會發布給其他的IBGP鄰居 ,在某種程度上,有一定的防環作用

BGP通告原則之四 : BGPIGP同步(華爲的設備已經將這個功能關閉了,開啓不了

如上圖所示,RTA上存在一個100.0.0.0/24的用戶網段,通過EBGP發佈給RTBRTBRTD建立了IBGP鄰居關係,RTD通過IBGP學習到該BGP路由,並將該路由發佈給EBGP鄰居RTE。當RTE訪問100.0.0.0/24的路由時,查找路由表,發現到達100.0.0.0/24路由的下一跳是RTDRTE查找出接口後,將數據包發送給RTDRTD收到數據包後,查找路由表,發現到達100.0.0.0/24路由的下一跳是RTB,出接口是RTD上與RTC相連的接口,於是將數據包發給RTCRTC查找路由表,發現沒有到達100.0.0.0/24的路由,於是將數據丟棄,形成“路由黑洞”。
BGP的通告原則:一條從IBGP鄰居學來的路由在發佈給一個BGP鄰居之前,通過IGP必須知道該路由,即BGPIGP同步。如圖所示,RTD在收到RTB發來的IBGP路由之後,如果要發佈給BGP鄰居RTE,則在發佈之前先檢查IGP協議(即OSPF協議)能否學到該條路由。如果能,則將IBGP路由發佈給RTE。在華爲路由器上,默認是將BGPIGP的同步檢查關閉的,原因是爲了實現IBGP路由的正常通告。但關閉了BGPIGP的同步檢查後會出現“路由黑洞”的問題。因此,有兩種解決方案解決上述問題:將BGP路由引入到IGP,從而保證IGPBGP的同步。但是,因爲Internet上的BGP路由數量十分龐大,一旦引入到IGP,會給IGP路由器帶來巨大的處理和存儲負擔,如果路由器負擔過重,則可能癱瘓。
解決方案:IBGP路由器必須是全互聯,確保所有的路由器都能學習到通告的路由。這樣可以解決關閉同步後導致的“路由黑洞”問題
 
BGP的豐富屬性
 
公認屬性:所有BGP路由器都必須識別並支持的屬性。所有廠商都需要支持的屬性
公認必遵:BGPUpdate消息中必須包含的屬性。
公認任意:不必存在於BGPUpdate消息中,可以根據需求自由選擇的屬性。
可選屬性:不要求所有的BGP路由器都能夠識別的屬性。
可選過渡:BGP不能識別該屬性,但可以接收該屬性並將其發佈給它的鄰居的屬性。

            可選非過渡:BGP可以忽略包含該屬性的消息並且不向它的鄰居發佈。

 

 

如圖所示,AS 200內運行OSPF協議,200.0.0.0/24網段宣告到OSPF中。RTB通過network方式將200.0.0.0/24的路由變爲BGP路由通告給RTARTC通過import方式將200.0.0.0/24的路由變爲BGP路由通告給RTA
BGPAS之間傳遞信息,承載大量的路由。如果到達同一目的IP有多條路徑,且BGP學到這些路由通過不同的方式,則Origin屬性是決定最優路徑的一個因素,用於標明路由的起源。
Origin3種屬性:
i表明BGP路由通過network命令注入;
e表明BGP路由是從EGP學來的,EGP協議在現網中很難見到,但可以通過路由策略將路由的Origin屬性修改爲e
? 即Incomplete表明BGP路由通過其它方式學到路由信息,如使用import命令引入的路由。
3Origin屬性的優先級爲:i>e>Incomplete(?)
 
 
BGP針對環路以及選擇路徑的問題,設計了AS_Path屬性,該屬性記錄了路由經過的所有AS的編號:
如上圖中RTARTB收到100.0.0.0/24的路由時,AS_Path爲(24),RTARTC收到100.0.0.0/24的路由時,AS_Path爲(354)。規定AS_Path越短(記錄的AS編號越少),路徑越優,因此RTA會優選從RTB收到的100.0.0.0/24的路由。
pRTE爲例,通過BGP發佈100.0.0.0/24的路由,路由可能通過RTE->RTB->RTC->RTD->RTE形成環路。爲了防止環路的產生,RTE在收到RTD發來的路由時會檢查AS_Path(該路由攜帶的)屬性,如果發現該路由的AS_Path中包含自己的AS號,則丟棄該路由。
AS_Path4種類型:
AS_Sequence(有序的);
AS_Set(無序的);
AS_Confed_Sequence(應用於聯盟);
AS_Confed_Set(應用於聯盟)。
 
 

 

BGP路由器將本端始發路由發佈給IBGP鄰居時,會把該路由信息的Next_hop設爲本端建立鄰居關係所使用的接口IP
如上圖所示,RTA100.0.0.0/24的網段發佈給RTB時,如果RTARTB使用直連接口建立IBGP鄰居,則Next_hopRTA上與RTB直連的接口IP;如果RTARTB使用Loopback接口建立IBGP鄰居,則Next_hopRTALoopback接口IP
BGP路由器在向EBGP鄰居發佈路由時,會把路由信息的Next_hop設置爲本端與對端建立BGP鄰居關係的接口IP
如上圖所示,RTB100.0.0.0/24的網段發佈給RTC時,Next_hopRTB上與RTC直連的接口IP
BGP路由器在向IBGP鄰居通告從EBGP學來的路由時,不改變該路由下一跳屬性。
特例:如上圖所示,RTA從RTB學到RTC發佈的200.0.0.0/24的網段時,Next_hop爲RTD的出接口IP,因爲RTB與RTD在同一網段,RTC通告給RTB的Next_hop爲RTD的出接口IP。
對於上述三種情況的解釋:
EBGP鄰居之間一般採用直連接口建立鄰居關係,EBGP鄰居在相互通告路由時會修改Next_hop爲自己的出接口IP
IBGP鄰居通常採用Loopback接口建立鄰居,當路由是本路由器起源的,在發送給鄰居之後Next_hop改爲自己的更新源地址,這樣即使網絡中出現鏈路故障,只要Next_hop可達,同樣可以訪問目的網段,提高網絡穩定性;
相對於IGP,如RIP在發佈路由時,每經過一個路由器都會修 改下一跳,發佈路由的路由器都宣稱自己能夠到達目標地址,並採用逐跳傳遞的方式將數據包發送給目標網絡,但網絡中的路由器並不知道誰是真正的始發路由器,因此會造成環路。BGPEBGP之間傳遞時才修改Next_hopIBGP發送從EBGP學來的路由給IBGP鄰居時並不修改下一跳,在一定程度上起到了防環作用

 如果在EBGP環境下,使用環回口(邏輯接口loopback)來建立BGP鄰居關係,則需要在通告路由的時候,需要修改下一跳。

 

Local_Pref屬性僅在IBGP鄰居之間有效,不通告給其他AS。它表明路由器的BGP優先級,用於判斷流量離開AS時的最佳路由。

MED(Multi-Exit-Discriminator)屬性僅在相鄰兩個AS之間傳遞,收到此屬性的AS不會再將其通告給任何其他第三方AS,用於判斷流量進入AS時的最佳路由。 

BGP的Community屬性的兩個作用:

1.限定路由的傳播範圍。

2.打標記,便於對符合相同條件的路由進行統一處理。

Community屬性分爲兩類:一類是公認團體屬性,另一類是擴展的團體屬性。

公認團體屬性分爲4類:

Internet:缺省屬性,所有路由都屬於Internet,此屬性的路由可以通告給所有BGP鄰居;

No_Export:收到此屬性的路由後,不將該路由發佈到其他AS。如圖,RTB上希望10.1.11.0/24的路由發佈給AS 12之後,不再發布給其他AS,則可將10.1.11.0/24Community屬性設置爲No_Export

No_Advertise:收到此屬性的路由後,不將該路由通告給任何其他的BGP鄰居。如圖,RTB上希望只將10.1.11.0/24的路由發佈給RTC,並且不再通告給任何其他的BGP鄰居,則可將10.1.11.0/24Community屬性設置爲No_AdvertiseNo_Export_Subconfed:在聯盟中使用

擴展的團體屬性用一組4字節爲單位的列表來表示,路由器中擴展的團體屬性格式爲aa:nn或團體號:aa:nn中,aa通常爲AS編號,nn是管理員定義的團體屬性標識;團體號範圍爲0-4294967295,在RFC1997中,0-655354294901760-4294967295爲預留值。

BGP路由器將路由通告給鄰居後,每個BGP鄰居都會進行路由優選,路由選擇有三種情況:

該路由是到達目的地的唯一路由,直接優選。
對到達同一目的地的多條路由,優選優先級最高的。
對到達同一目的地且具有相同優先級的多條路由,必須用更細的原則去選擇一條最優的。
 
一般來說,BGP計算路由優先級的規則如下:
丟棄下一跳不可達的路由。
優選Preference_Value值最高的路由(私有屬性,僅本地有效)。
優選本地優先級(Local_Preference)最高的路由。
優選手動聚合>自動聚合>network>import>從對等體學到的。
優選AS_Path短的路由。
起源類型IGP>EGP>Incomplete
對於來自同一AS的路由,優選MED值小的。
優選從EBGP學來的路由(EBGP>IBGP)。
優選AS內部IGP的Metric最小的路由。
優選Cluster_List最短的路由。
優選Orginator_ID最小的路由。
優選Router_ID最小的路由器發佈的路由。
優選具有較小IP地址的鄰居學來的路由。

 

使用靜態路由配置路由聚合的思路:
使用靜態路由將明細路由聚合成10.1.8.0/22,下一跳指向NULL 0,因爲聚合路由並不是具體的地址,發送給AS 200時只是明細路由的替代,爲了防止路由環路,所以將下一跳指向Null 0
由於使用靜態路由,路由表中產生了一條10.1.8.0/22的路由,下一跳爲Null 0。使用network命令將IP路由表中的10.1.8.0/22路由變爲BGP路由,並通告給對端BGP鄰居,達到聚合的目的。

 

自動聚合方式,在bgp的視圖下,通過  summary automatic命令進行自動聚合路由信息 

手動聚合方式:在bgp的視圖下,通過配置aggregate 10.1.8.0 255.255.252.0  detail-suppressed

detail-suppressed用來抑制明細路由的優先級

BGP路由聚合帶來的問題 - 潛在環路 ,如下圖所示,被聚合的路由丟失了原來的屬性,會有環路的風險,

 

路由聚合解決了兩類問題,一是減輕了設備傳輸和計算路由所需資源的負擔,二是隱藏了具體的路由信息,減少了路由震盪的影響。但是路由聚合後,AS_Path屬性丟失,存在產生環路的風險。 

爲了解決BGP路由聚合帶來的問題,設置了兩個AS_Path屬性:
Atomic-Aggregate:公認任意屬性,用於警告下游路由器出現了信息丟失,如圖所示,AS 200內設置了路由聚合的路由器在聚合後發生了路徑丟失的現象,此時該路由器通過Update報文攜帶該屬性通知自己的鄰居發生了路徑丟失。
Aggregator:可選過度屬性,該屬性包含發起聚合的路由器的AS號和Router-ID,表明發生聚合的位置。
AS_Path屬性有兩種類型:
AS_Sequence:表示AS_Path內的AS號是一個有序的列表。
AS_Set:表示AS_Path內的AS號是一個無序的列表。
AS_Path本身是一個有序的列表,因爲AS_Path每經過一個AS都會將AS號添加到AS_Path中,並且按經過的順序從左到右排列。
如上圖所示,AS 400AS 300通告聚合路由時,AS_Path屬性(大括號的除外)表示該聚合路由依次經過了AS 200AS 400
當發生聚合後,如果需要聚合路由攜帶所有明細路由經過的AS號來防止環路,則在配置聚合的命令後添加as-set參數。
如上圖所示,AS 200內發生了聚合並配置了as-set參數,則聚合路由會將明細路由的AS_Path信息用一個AS-Set集表示(放在中括號裏的AS號信息,該集合的AS號沒有先後順序),攜帶在聚合路由後用以防止環路。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章