動態路由協議BGP介紹

BGP介紹

BGP(Border Gataway Protocol,邊界網關協議)是一種用於解決OSPF不適用於超大型或者跨AS的距離矢量協議,能夠路由選優、避免環路、高效傳遞路由(本身不產生路由條目,只傳遞通告進BGP內的路由)和維護大量路由

主要內容包括:BGP相關術語、BGP報文、BGP路由屬性、路由黑洞的原因、BGP路由反射器和聯盟、BGP狀態機以及BGP工作原理

BGP相關術語

IBGP:運行於同一AS區域的BGP路由器之間的關係;從IBGP設備上學習到的路由不會再發給其他IBGP設備(IBGP防環);
IBGP對等體
EBGP:運行於不同AS區域的BGP路由器之間的關係;當EBGP設備從其他EBGP設備收到路由條目後,會查看路由條目的AS-Path列表,如果發現列表中包含有本地的AS號,就會丟棄該報文(EBGP防環);
EBGP對等體
Speaking:發送BGP報文的設備,發送BGP報文給其他Speaking設備,網絡中每一臺BGP設備的都能成爲Speaking設備;

Peer:對等體,相互發送報文的Speaking設備之間稱爲對等體;

BGP路由器ID唯一標識BGP網絡中BGP設備,與OSPF的RID的作用和獲取方向相同(手動配置、環回口IP或物理接口IP);一旦選出路由器ID,除非接口地址被刪除等事件,否則即使配置了更大的IP地址也不會發生改變

BGP報文介紹

BGP協議本身不產生路由條目,只會傳遞通告的路由條目;BGP在傳遞路由條目時,會使用五種報文建立鄰居關係或者斷開鄰居關係等,這五種報文分別是:Open報文(建立)、Update報文(更新)、Notisifaction報文(通知)、Keepalive報文(保持活躍)和Route-refresh報文(路由刷新);

BGP五種報文

  • Open(建立)報文:TCP連接建立後,發送的第一個BGP報文,包含有本地Speaking信息以及後面建立對等體BGP連接的相關信息,用於建立BGP連接(BGP會話)
  • Update(更新)報文:用於對等體間路由信息的交換;
  • Notification(通告)報文用於通告錯誤狀態,如果BGP檢測到有錯誤信息就會發送此狀態,使得對等體變爲初始狀態;
  • Keepalive(保持活躍)報文:用於維持BGP對等體連接;
  • Route-Refresh(路由刷新)報文用於改變路由策略後請求對等體重新發送路由信息。只有支持路由刷新功能的路由器才能進行響應(該報文不需要BGP設備發送整個BGP路由表,只需發送發生改變的部分BGP路由表);

BGP報文結構

Open報文、Update報文、Keepalive報文、Notification報文和Route-Refresh報文采用相同的BGP包頭信息,格式如下:
BGP報頭信息

報文字段 說明
Marker 標記字段,用於標記BGP邊界報文,固定值爲所有比特均爲“1”;
Length 長度字段,標識整個報文的字節大小;
Type 報文類型字段,標識報文類型,數值爲1-5,分別對應Open、Update、Notification、Keepalive和Router-Refresh報文;

Open報文結構:
Open報文結構詳細信息

報文字段 說明
Version 版本字段,標識本地使用的BGP版本號;
My Autonomous System 本地AS號字段,標識本地設備所在的AS號,比較兩端的AS號可以知道是IBGP(AS號相同)或EBGP(AS號不同);
Hold Time 標識BGP對等體間保持連接的時間,單位爲秒,在建立對等體關係時兩端會將Hold Time同步,在該定時器裏沒有收到Update或Keepalive報文就會斷開連接;
BGP Identity BGP路由器ID字段,用來唯一標識BGP設備,與OSPF的RID相同;
Opt Parm Len 可選參數長度字段,標識可選參數的長度,有可選參數就爲可選參數長度,沒有就爲“0”;
Optional Parameters 可選參數字段,用於多協議擴展等功能,如:BGP認證;

Update報文結構:
Update報文結構信息

報文字段 說明
Unfeasible Route Length 不可達路由長度字段,標識不可達路由的長度,單位爲字節,通知對等體需要撤銷的不可達路由的長度,如果爲0,就沒有下列的Withdraw Routes字段(沒有要撤銷的路由條目);
Withdraw Routes 撤銷路由字段,長度可變,包含了要從對等體BGP路由表中要撤銷的網絡地址和前綴;
Total Path Attribute Length 整個路徑屬性長度字段,包含了路由條目的相應路徑屬性的長度,如果爲0,表示就沒有下列Path Attribute字段;
Path Attribute 路徑屬性字段,與NLRI相關的所有路徑屬性,每個路徑屬性都由TLV(Type-Length-Value)組成,用於避免環路、選路和協議擴展等;
NLRI(NetworkLayer Reachabinity Information) 網絡層可達路由字段,長度可變,包含了所有要向BGP對等體通告的可達路由條目和前綴;

Notification報文結構:
Notification報文結構信息

報文字段 說明
Error Code 差錯碼字段,指定錯誤類型;
Error Subcode 差錯子碼字段,描述錯誤類型的詳細原因;
Data 錯誤內容字段,用於輔助發現錯誤原因,內容依賴於差錯碼和差錯子碼,記錄出錯部分的數據

Keepalive報文結構:

Keepalive報文是爲了維持BGP對等體連接,因此該報文可以不用包含信息,報文格式就是BGP報頭,該報文的Type值爲4

Route-Refresh報文結構:
Route-Refresh報文結構信息

報文字段 說明
AFI 地址族標識字段,用於標識所採用的不同地址類型;
Res 保留字段,必須爲“0”;
SAFI 子地址族標識字段,用於標識不同的地址類型;

BGP的多擴展協議常使用到兩種屬性,分別是:擴展協議可達NLRI(MP_REACH_NLRI,屬性值爲14)和擴展協議不可達NLRI(MP_UNREACH_NLRI,屬性值爲15)。這兩種屬性都包含了地址族(Address Fimaly)和子地址族(Sub-Address Family)。

地址族是一種網絡層協議的配置模塊,也就是說將不同類型的網絡進行分類配置,其目的是對於運行在不同網絡層協議的網絡分別配置,便於不同網絡類型的管理

地址族使用地址族標識符(Address Family Identifier,AFI),子地址族使用子地址族標識符(Subsequent Address Family Identifier,SAFI)

MP-BGP協議族 AFI SAFI
IPv4 Unicast(IPv4單播) 1 1
IPv4 Multicast(IPv4組播) 1 2
IPv4 Lable(IPv4 MPLS) 1 4
IPv4 VPNv4(IPv4 VPN) 1 128
IPv4 MDT(IPv4組播分部樹) 1 66
IPv6 Unicast(IPv6單播) 2 1
IPv6 Multicast(IPv6組播) 2 2
L2VPN(二層VPN) 192 128
VPSL(虛擬專用局域網服務) 25 65

路由屬性分類:

  • 公選必遵:所有BGP設備都能識別該屬性(公選),該屬性必須包含進Update報文裏(必須遵守);
  • 公選任意:所有BGP設備都能識別該屬性(公選),該屬性可以不包含進Update報文裏(任意);
  • 可選過渡:BGP設備可以不識別該屬性(可選),如果BGP設備不識別該屬性,仍然會接收該屬性並通告給其他BGP設備(過渡)
  • 可選非過渡:BGP設備可以不識別該屬性(可選),如果BGP設備不識別該屬性,仍然會接收該屬性,但不會通告給其他BGP設備(非過度),僅在本地使用

BGP常見路由屬性

屬性名 屬性類型
Origin(源)
Next_Hop(下一跳)
AS_Path(AS路徑)
公選必遵
Local_Pre(本地優先) 公選任意
Community(團體) 可選過渡
MED(多出口區分)
Cluster_ID(集羣ID)
Originator_ID(始發者ID)
可選非過渡

Origin屬性

用於標識從不同的設備上學習到的路由條目,當BGP設備上有多條去往相同目的但是從不同設備上學習的,就會比較Origin屬性的優先級(i>e>?);

  • IBGP(i):從IBGP對等體設備學習到的路由條目,標記爲“i”,優先級最高;
  • EBGP(e):從EBGP對等體設備學習到的路由條目,標記爲“e”,優先級次之;
  • 非BGP設備(?):從非BGP設備學習到的路由條目,標記爲“?”,優先級最低;

Next_Hop屬性

下一跳,EBGP之間的下一跳是指下一個AS區域而不會路由器;IBGP設備間的傳遞路由條目的時候是不會發送修改下一跳;

從IBGP設備學習到的路由條目不會再發送給其他的IBGP設備(IBGP防環);

AS_Path屬性

用來標識路由條目經過的AS區域,從IBGP對等體收到的路由條目是沒有AS_Path屬性的,當EBGP設備從對等體設備收到路由條目後會查看該屬性列表中的是否有本地的AS號,如果有就丟棄報文,如果沒有就將本地AS添加進AS_Path屬性列表(EBGP設備之間的防環);

Local_Pre屬性

Local_Pref數值越大,優先級越高,用於判斷流量離開時路徑的選擇,僅在本地AS區域內通告和比較,不發送給其他AS區域(在IBGP對等體之間比較);
BGP Local_Pre作用範圍圖
當R1想要向R4發送報文時,發現兩條路由條目,一條是走R2另一條是走R3的,進一步比較屬性值後,R1走R3方向(R3方向的本地優先級屬性值更大,默認其他屬性都相同);

Community屬性

Community屬性是一組有相同特徵的BGP路由條目集合,用來簡化路由策略的應用和降低維護管理維度,可以爲團體中的成員一次性配置相同的參數和路由策略,也可以通過團體屬性進行過濾;

Community屬性可以分爲基本團體屬性和擴展團體屬性

基本團體屬性的**“Type Code”值爲8,屬性取值爲32位**,其中Ox00000000-0x0000FFFF和0xFFFF0000-0xFFFFFFFF保留(前16位表示路由的源AS號,後16位可以理解爲源AS號的子AS號,也可以用來標識路由來自不同的IGP路由類型,或本地優先級,MED值等):

基本屬性的常用屬性取值有:

  • INTERNET:默認情況下,所有的路由都屬於該團體屬性,會被通告給所有的BGP對等體設備;
  • NO_EXPORT(0xFFFFFF01):屬於該屬性值的路由條目不會將路由條目通告給本地AS之外的設備,但是會通告給聯盟的子AS號內;
  • NO_EXPORT_SUBCONFED(0xFFFFFF03):屬於該屬性值的路由條目不會將路由條目通告給本地AS之外的對等體設備,也不會發送給聯盟的子AS內;
  • NO_ADVERTISE(0xFFFFFF02):具有該屬性的路由條目被接收後,不會通告給其他任何BGP對等體;

擴展團體屬性是爲了解決原有的32位屬性值不夠用的問題,擴展團體屬性的“Type Code”爲16,屬性取值爲64位,並且添加了一個“Type”字段,使得路由策略能夠通過“Type”直接對團體屬性進行操作;

MED屬性

相當於COST值,數值越小,優先級越高,用於判斷流量進入AS區域的路徑選擇,僅在兩個AS區域之間交換
BGP MED作用範圍圖

BGP路由黑洞產生原因

BGP路由黑洞示意圖
R4與R2爲IBGP鄰居。當R1將IP地址(2.1.1.1)通告給R2之後,R2會將其通告給IBGP對等體R4,就會將路由條目發送給R3,但是R3不是BGP路由設備不會把該路由條目添加進路由表中,而是直接將路由條目發送給R4,R4收到後會將路由條目發送給EBGP對等體R5,最終R1、R2、R4和R5學習到了2.1.1.1的路由條目,R3沒有該路由條目

當R5訪問R1的2.1.1.1網絡時,會將報文發送給R4,R4查找路由條目就會將其發送給R3,但是R3收到去往2.1.1.1的報文後,查看路由表,發現自己並沒有去往2.1.1.1的路由條目(傳遞路由條目的時候,並沒有將2.1.1.1的路由加入R3的路由表),就會將報文丟棄,導致通信失敗,形成路由黑洞;

BGP路由反射器以及聯盟

爲了更簡單的解決路由黑洞問題,就產生了幾種技術,分別是路由反射器、路由聯盟和MPLS(按下不表,以後寫關於MPLS VPN的部分會講解)

解決路由黑洞的方法還有一個是AS區域內的所有路由進行IBGP的全互連,拿上述圖形來說,要解決問題就需要 R2、R3和R4都建立IBGP鄰居關係,當AS區域內的路由器多了之後,工作量也會急劇增加;

BGP路由反射器

BGP路由反射器解決路由黑洞的方式是打破從IBGP對等體學習到的路由條目不會發送給其他IBGP對等體的更新規則;
BGP路由反射器示意圖

  • 路由反射器(Route Reflector,RR):允許把從IBGP對等體學習到的路由條目反射給其他IBGP對等體;
  • 客戶機(Client):與RR(路由反射器)建立IBGP鄰居關係的BGP設備,主要與RR建立好IBGP鄰居關係後,直接會成爲客戶機;
  • 非客戶機(None-Client):既不是RR,也不是Client的IBGP設備設備。非客戶機與RR之間爲全互連,非客戶機與非客戶機之間也爲全互連
  • 集羣(Cluster):路由反射器和客戶機的集合。通過Cluster_ID防止集羣之間形成環路,一個AS區域內可以有多個集羣存在;
  • 始發者(Originator):在AS裏第一個發送IBGP路由的BGP設備。通過Originator_ID防止集羣內部形成環路,一個集羣內可以有多個RR設備;

RR向鄰居IBGP設備發佈路由的原則:

  • 從非客戶機學習到的路由條目,會通告給所有的客戶機;
  • 從客戶機學習到的路由條目,會通告給所有的非客戶機和客戶機(發起次路由條目的客戶機除外);
  • 從EBGP對等體上學習到的路由條目,會發布給所有的客戶機和非客戶機;

注:客戶端與非客戶端收到BGP路由條目時,會先發送給RR,再由RR按照發布路由原則發送路由條目。

Cluster_ID屬性防止集羣間環路的機制

  • 每經過一個集羣,就會將集羣的ID添加進Cluster_ID屬性列表裏,與AS_Path屬性的工作原理類似:
  • 當一條路由第一次被RR通告時,會將本地Cluster_ID添加進Cluster_ID屬性列表裏;
    -> 當RR收到一條路由時,會查看Cluster_ID屬性列表中是否包含本地Cluster_ID,如果包含就丟棄;如果不包含就將本地Cluster_ID添加進該屬性;

Originator_ID屬性防止集羣內環路的機制

  • Originator_ID是由RR產生的,使用的是始發者的路由器ID(RID);
  • 當一條路由第一次被RR通告時,會將本地Originator_ID添加進Originator_ID屬性列表裏;
  • 當IBGP設備收到路由條目後,會查看本地RID是否與路由條目的Originator_ID相同,如果相同,就丟棄(相當於發送此路由條目的IBGP設備,又再次收到了自己發起的路由條目,進而說明集羣內產生了環路,爲避免環路就將該路由條目丟棄)

BGP聯盟

BGP聯盟就是將一個AS區域劃分出多個子AS區域,子AS區域間的BGP設備關係爲EBGP對等體,子AS區域內的BGP設備關係爲IBGP對等體,並且保留原來的AS號作爲聯盟ID,這樣可以保留原有的IBGP屬性,如Local_Pref、MED等,並且聯盟相關的屬性在傳出聯盟時,會自動將其刪除,無需管理員手動過濾。
BGP聯盟示意圖

BGP原理

BGP的有六種狀態機:Idle(空閒)、Connect(連接)、Active(活躍)、OpenSent(Open報文已發送)、OpenConfirm(Open報文已確認)和Establish(連接已建立)

A. Idle爲BGP的初始狀態,此狀態下BGP設備拒絕鄰居發起的TCP連接請求,只有設備收到了“Start”事件後,BGP設備纔會接收TCP連接請求,並切換至Connect狀態;

注:start事件可以是配置一個BGP過程、重啓BGP進程等;

B. 在Connect狀態,BGP啓動連接重傳定時器,等待TCP連接成功

  • a) 如果TCP連接成功,本地BGP設備就會向對等體設備發送Open報文,並切換至OpenSent狀態;
  • b) 如果TCP連接失敗(BGP對等體設備沒有響應),就會切換至Active狀態,不斷嘗試TCP連接,直至連接重傳定時器超時後,BGP設備就會停留在Connect狀態;

C. 在Active狀態,BGP設備會不斷的嘗試TCP連接;

  • a) 如果TCP連接連接成功,本地BGP設備就會向對等體設備發送Open報文,並切換至OpenSent狀態;
  • b) 如果直到連接重傳定時器超時後,仍沒連接成功,就會切換並停留在Connect狀態;

D. 在OpenSent狀態,本地BGP設備等待對等體設備發送的Open報文,並對Open報文中AS號、版本號、認證碼等進行檢查;

  • a) 如果Open報文正確,本地BGP設備就會向對等體設備發送Keepalive報文,並切換至OpenConfirm狀態;
  • b) 如果Open報文信息有誤,本地BGP設備就會向對等體設備發送Notification報文,並切換至Idle狀態;

E. 在OpenConfirm狀態,本地BGP設備等待對等體設備發送的Keepalive報文或Notification報文;

  • a) 如果收到Keepalive報文,本地BGP設備就會向對等體發送Update報文,並切換至Establish狀態;
  • b) 如果收到Notification報文,本地BGP設備就切換至Idle狀態;

F. 在Establish狀態,本地BGP設備等待對等體設備發送的Keepalive報文、Notification報文或Update報文;

  • a) 如果Keeepalive報文或Update報文(Update報文內容無誤),本地BGP設備就會認爲對等體上設備處於正常,維持BGP連接狀態;
  • b) 如果收到Notification報文,本地BGP設備就切換至Idle狀態;

BGP狀態機遷移過程示意圖

注:從EBGP設備學習到的路由條目會發送給所有的EBGP和IBGP對等體;
從IBGP設備學習到的路由條目會發送給EBGP對等體,但不發送給其他IBGP對等體;
所有對等體發佈的BGP路由,BGP設備都會接收;
路由更新時(Route-Refresh報文),BGP設備只發送要更新的路由條目,而不是整個路由表;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章