BGP基礎知識

HL1329658發表於2023-02-07
   今天海翎光電的小編主要介紹一下BGP的相關基礎知識,文章淺顯易懂,適合對BGP完全沒有了解的同學。

BGP介紹
    邊界閘道器協議BGP(Border Gateway Protocol)是一種實現自治系統AS(Autonomous System)之間的路由可達,並選擇最佳路由的路徑向量路由協議。目前在IPV4環境下主要使用BGPV4,目前市場上也存在BGPV4+,BGPV4+在BGPV4的基礎上支援多個地址族,如IPv6。

    BGP協議本身不產生路由,而是轉發本地路由表中來自其他協議生成的路由條目;AS之間正常存在大量的BGP鄰居關係,且BGP協議不會計算最佳路徑;因此在BGP協議中管理員需要進行策略來干涉選路
AS-自治系統


  • AS(自治系統),由 單一的機構或組織所管理的一系列IP網路及裝置所構成集合。
  • 劃分AS的原因:1.整個地球上的 網路範圍太大,單個網路收斂很慢且網路延遲大;2.每個網路可能是某個組織或公司組建的,他們並不想將自己辛苦組建的網路交給別人管理,所以需要 自治管理
  • 為了方便對自治系統進行管理,給每一個自治系統設計了一個號,即AS號。AS號由16位二進位制構成,取值範圍:0 - 65535,其中 1 - 64511號為公有AS號, 64512 - 65534被設定為私有AS號。
  • 因為傳統的AS號存在不夠用的情況,所以,目前大部分裝置均支援 擴充的AS號,由32位二進位制構成。中國由於加入網際網路較晚,所以中國的AS號大多都是擴充套件AS號。

BGP原理概述
    想要AS之間互相通訊,我們可以使用重發布,透過重發布將AS的路由資訊匯入到其他AS以達到AS間的互通,和重發布類似,BGP也是透過傳送AS的路由資訊以實現全網可達。那為什麼AS間更多的是使用BGP而不是重發布呢?
BGP和重發布的區別

  • 重發布要求AS間需要有ASBR,ASBR同時具有兩個AS的路由資訊,透過ASBR實現路由共享;而BGP是沒有ASBR的,由於AS是自治系統,如果有ASBR,那這個ASBR歸誰管理?如果只歸一方管理,那他可以透過路由策略提高自己AS的流量的轉發速度,所以BGP是AS間各出一個或多個執行BGP的路由器,讓這些執行BGP的路由器建立鄰居關係後交換路由資訊。

  • 重發布在匯入路由時會洗掉開銷值,會造成選路不佳的問題,而BGP具備強大的路由策略,BGP為路由資訊設計了路徑屬性,透過屬性進行選路,是的選路過程更加靈活,可控性更高。

BGP特性

  • BGP協議是 無類別路徑向量協議。無類別即BGP在傳遞路由時會 攜帶子網掩碼;路徑向量,不同與距離向量,路徑向量 是以一個AS為單位,而距離向量是以一個路由為單位,距離向量是一種路由演算法,而 BGP不需要計算路由,它只需將以計算好的路由傳遞給了鄰居即可。
  • 我們對IGP(內部閘道器協議)和EGP(外部閘道器協議)的要求不同,IGP需要在一個AS內計算路由,所以我們要求IGP選路佳、收斂快、佔用資源少;而EGP不同,EGP協議只需傳遞AS以計算好的路由,所以我們 對EGP的可控性、可靠性要求更高。
  • EGP的追求:可控性:AS之間需要傳遞大量的路由資訊,所謂可控,就是可以 更方便的干涉選路,更容易做策略,以彌補重發布的不足。為了保證路由傳遞的可控性,更方便干涉選路,BGP協議 捨棄了開銷值,取而代之的是他為路由資訊設計了很多 路徑屬性。可以透過屬性進行選路,是的選路過程更加靈活,可控性更高。
  • EGP的追求: 可靠性:BGP協議裝置間需要互動大量的路由條目,但又不能選擇週期更新來佔用鏈路資源,故只能進行觸發更新;又為了保證傳輸的可靠性,直接 選擇TCP協議作為傳輸層的協議來完成資料收發,使用的是TCP 179號埠。但使用TCP協議通訊也會造成一些問題,傳輸效率降低, 只能單播通訊(TCP需要去建立會話),佔用資源會加大 ,用TCP之後, 便不能透過廣播或者組播去自動發現鄰 進行通訊了。
  • 由於BGP依靠TCP協議傳輸資料,BGP協議可以 實現非直連建鄰,非直連建鄰的前提條件是 鄰居雙方網路可達, BGP的非直連建鄰是建立在IGP的基礎上。
  • BGP的鄰居更準確的說是 BGP的對等體,我們可以根據鄰居關係的建立情況,將BGP的鄰居關係分為兩種:

  • 因為EBGP對等體之間一般採用直連建鄰的方法,所以,我們將 EBGP對等體之間的資料包中的TTL值設定為1;而IBGP對等體之間往往需要非直連建鄰,所以, IBGP對等體之間的資料包中的TTL值我們設定為255;當然,如果EBGP對等體之間需要非直連建鄰,則需要 手工修改TTL值。
  • EGP的追求::AS-BY-AS:BGP將一個AS作為一個單位來看待,以一個AS為一跳,

BGP特點總結

  • 無類別路徑向量 -----距離向量的升級版—AS–BY–AS
  • 使用單播更新來傳送所有資訊;基於TCP 179埠工作
  • 增量更新,僅觸發更新,無週期更新
  • 具有豐富的屬性來取代IGP中度量進行選路,有多個引數控制協議
  • 可以在進項和出項對流量實施強大的策略,可控性非常強大
  • 預設不被用於負載均衡-----透過各種選路規則僅僅產生一條最佳路徑
  • BGP支援認證和聚合(將現有的IP地址合併成較大的、具有更多主機地址的路由域)

BGP的資料包
    BGP協議中所有的資料包均需要在tcp會話建立後,基於TCP的會話來進行傳輸及可靠性的保障。
Open包

  • Open包主要用來建立鄰居關係,正常進收發一次即可,Open包會攜帶一些建鄰需要協商的引數,鄰居互相認同對方的引數才可以建立鄰居關係。以下為Open包會攜帶的一些引數:
  • AS號:在手工建立鄰居關係需要時宣告鄰居的AS號。對端收到後會檢查宣告的AS號是否和本地的AS號一致,一致才可以建立鄰居關係。
  • 認證:BGP在建鄰時如果做認證的話,需要比對雙方認證口令,不一致則無法建立鄰居關係。
  • Router-ID:主要區分和標定路由器。OPEN報文中攜帶RID的目的是為了確保雙方的RID不一致。確保其唯一性,如果相同,則無法正常建立鄰居關係。


這裡的RID和OPSF的格式一致,也是由32位二進位制構成,並且遵循IP地址的格式。也可以透過兩種方法獲取,一種是手工配置;另一種是自動獲取(先在自己路由器的環回介面中選擇最大的IP地址作為RID,如果沒有環回介面,則在自己物理介面中選擇IP地址最大的作為RID)。
注意:在接收鄰居資料包時,其中的 源IP地址和手工指定的鄰居的IP地址一致才可以正常建立鄰居關係。
  • holdtime:保活時間, 這個引數預設值為 180S,即180S內若收不到對方傳送的keeplive或者UPdate包則將判定BGP連結中斷。雙方建鄰時攜帶這個值,但是並不要求必須相同。但是,執行時必須相同,所以,將會選擇二者中較小的作為執行時間

keeplive包

  • 用來保活鄰居關係,預設週期1min查詢鄰居關係是否存在;實際保活TCP會話。
  • Keeplive報文的傳送週期為保活時間(hold time)的1/3,保活時間預設為180S,則週期傳送時間預設為60S。
  • KeepLive包還有一個作用:在收到對方傳送的OPEN報文後,臨時充當確認包的作用。
TCP本身具有確認機制,可以確保傳輸的可靠性,這裡的確認主要是確認OPEN報文中攜帶的引數,如果認同對方的引數,則將回復Keeplive包進行確認。

Update包

  • BGP中的更新包,用來攜帶路由條目,包括目標網段,子網掩碼資訊以及BGP的各種屬性
  • 在UPdate包中存在撤銷路由欄位,我們可以直接將不可達的路由資訊放在該欄位下進行通告,以達到傳遞失效資訊的目的。而不需要像RIP那樣採用帶毒傳輸的方式。

Notification包

  • BGP設計的一個告警機制,出現錯誤資料時收發,當BGP檢測到一個錯誤的時候,將會用這個包進行告警,告知對端錯誤點在哪

Route-refresh包

  • 用於改變路由策略後請求對等體重新傳送路由資訊,前提是對等體雙方均支援路由重新整理

BGP的狀態機
BGP的狀態機僅描述BGP對等體建立過程中的狀態變化。因為BGP可以做到建立鄰居關係和釋出路由分開完成。

  • idle狀態:空閒狀態,一旦指定鄰居,就處於idle狀態,然後BGP會首先檢查 指定的IP地址在本地路由表中是否可達,如果可達,則開始嘗試建立TCP會話,進入下一個狀態;如果不可達,則將停留在idle狀態
  • connect狀態:進行TCP會話連線的狀態。如果 TCP會話建立成功,則進入下一個狀態;如果TCP會話建立失敗,則進入Active狀態,該狀態會反覆嘗試TCP連線,如果嘗試超時,則放棄重連,退回到idle狀態。
注意:在建立TCP會話連線時,雙方都會嘗試建立連線,一方建立成功,則將建立一個雙向的TCP會話通道;雙方都建立成功,則將會出現兩個雙向通道。則需要關閉一個TCP通道。後面開始傳送OPEN報文,其中會攜帶RID,雙方將比較RID,僅保留RID大的一端發起的TCP連線,RID小的一端發起的TCP連線通道將被斷開。
  • OpenSent:開始傳送OPEN報文,報文中攜帶建立鄰居關係所需的引數。當收到對端傳送的OPEN報文後,並且報文裡的引數沒有問題,則將回復一個keeplive作為確認,進入下一個狀態;

  • OPENConfirm:在該狀態,本段在等待對端keeplive包, 當對端收到本端的Open報文且確認引數無誤,傳送keeplive包進行確認進入下一個狀態。
  • Established :建立完成狀態 ,標誌著 對等體關係的建立

BGP的工作過程

  • 配置完成後,鄰居間單播TCP三次握手,目標埠179,建立TCP的會話;之後所有的BGP協議資料包基於該會話進行傳輸
  • 會話建立後,鄰居間正常收發一次open報文,並互發keeplive包進行確認建立BGP的鄰居關係,並生成鄰居表
  • 鄰居關係建立後,預設每1min,使用keeplive週期保活鄰居關係,週期保活TCP會話
  • 鄰居關係建立後,管理員選擇性將本地路由表中透過任意來源獲取的路由條目,向BGP協議中進行宣告;使用updata資料包進行鄰居間路由共享;之後生成BGP表;
  • 本地對BGP表中的路由進行選擇,預設將最優路徑載入於路由表中(最優-僅僅基於BGP的選路規則,不一定為最佳路徑;BGP預設不支援負載均衡)
  • 若出現錯誤資訊,鄰居間將使用Notification報文進行報錯操作
  • 收斂完成,僅keeplive週期保活即可,預設保活時間為180S,週期傳送時間為60S。
  • 若發生結構突變,則將直接傳送UPdate報文進行觸發更新。

BGP的路由黑洞

  • AS間透過EBGP對等體交換路由資訊,然後透過單播將獲取到的路由資訊傳送給IBGP對等體,使AS所有執行BGP的裝置擁有了所有AS的路由資訊,如下:R3從R1學到AS100的1.0.0.0/8的路由資訊,然後透過單播傳給R7,R7傳給R2,所有AS內執行BGP的路由器都學到了1.0.0.0/8的路由資訊

  • 向量協議的特點是誰發給我這條路由,我到這條路由就找誰,如果R7想ping1.0.0.0/8,那R7就會將ping包傳送給R3,由R3轉發。在R7傳送ping包時,它首先檢視路由表查詢R3的位置,假設R7透過R4找R3,那R7就會將ping包發給R4,當這個ping包來到R4上,R4看二層是找自己的,解封裝看三層,發現這個ping包的DIP為1.0.0.0/8網段的,但R4上沒有執行BGP,沒有收到關於1.0.0.0/8網段的路由資訊,所以R4就會把這個ping包丟棄,雖然R7上有1.0.0.0/8的網段路由資訊,但無法與R1通訊,這就是BGP的路由黑洞。
  • BGP的路由黑洞:由於BGP協議可以 非直連建鄰,故可能出現BGP協議跨越未執行BGP協議的路由器,導致BGP路由傳遞後,顯示 控制層面可達,但是,資料層面 ,流量經過未執行BGP協議的路由器時,無法透過,形成路由黑洞。

解決路由黑洞
AS內的裝置全部執行BGP:既然路由黑洞是未執行BGP協議的路由器導致的,那就讓AS內所有的裝置都執行BGP獲取路由資訊。但這個方法是不現實的,可以承載越多路由資訊的路由器其價格也就越昂貴,每一臺執行BGP的路由器需要承載所有AS的路由資訊,可以承載世界上幾萬幾十萬的路由資訊的路由器價格也是上百萬的,所以,是不可能讓AS內的裝置擁有全部路由資訊的。

  • AS內執行BGP的裝置將從BGP重發布到AS內執行的IGP協議裡:透過重發布將BGP所有路由匯入到IGP協議裡,同樣需要AS內所有裝置可以承載所有AS的路由資訊,同第一條一樣不現實。
  • 物理、邏輯拓撲全連:直接讓AS內執行BGP協議的所有裝置互相連線,使IBGP間通訊不需要經過未執行BGP協議的裝置,但由一個AS地理範圍可能很大,IBGP間距離較遠,所以使用真實鏈路連線IBGP也不現實,所以我們可以用GRE/MGRE等vpn技術,透過虛擬鏈路連線IBGP對等體

  • MPLS:當前工程中主要使用的解決BGP路由黑洞方案,MPLS後續會講。
BGP為了防止BGP路由黑洞的產生,提出了BGP同步機制:即當一臺路由器從自己IBGP對等體學習到一條BGP路由時,他不能將這條路由通告給自己的EBGP對等體,除非他又從IGP協議中(包含靜態路由)學習到這條路由。也就是要求 IBGP路由和IGP路由同步。
同步要求將BGP路由重發布到IGP協議中,但我們已經說過這種方法並不現實,所以華為裝置預設關閉同步機制。


注意:在目前我們的學習情況下,我們在做BGP實驗時都是用第一種方法解決路由黑洞



BGP的防環機制—水平分割
EBGP水平分割

  • 下圖中有三個AS,其中AS:1的一條路由資訊傳給了AS:2,AS:2將這條路由資訊傳給AS:3,如果AS:3又將這條路由資訊傳回給AS:1且AS:1將這條路由資訊加表,就會導致路由環路。

  • BGP協議在路由條目中有一條專門記錄所經過的AS編號的路徑屬性,在上圖中AS:1發出的路由資訊會攜帶編號1,AS:2將這條路由資訊轉發給R3時,新增編號2;AS:3將這條路由資訊轉發給AS:1時,也會新增編號3;最終AS:1收到這條路由資訊的AS_PATH屬性記錄了1、2、3,R1發現該屬性中有自己的編號則拒絕接受這條路由資訊,避免環路產出。

IBGP水平分割

  • 下圖在AS:64513內,R2、R3、R4兩兩建鄰,如果R2釋出一條路由資訊由R4到R3,再到R2,並且R3轉發給R2的路由資訊改變了R2的路由表,則會形成環路。

  • 因為BGP的AS-BY-AS的特性,導致AS內部被認為是一個整體,在預設情況下,路由的屬性是不會發生變化的,所以,無法透過屬性來進行防環。
  • IBGP水平分割:當一個路由器從一個IBGP對等體出學習到某一條BGP路由時,他將不再把這條路由資訊通告給其他的IBGP對等體。

  • IBGP水平分割可以有效的解決 IBGP對等體之間路由回傳造成的環路問題,但是,也會 引發路由資訊傳遞障礙問題。如下圖中,如果R1學到其他AS的路由資訊,它會將這些路由資訊傳遞給R2,但由於IBGP水平分割,R2不能將這些路由資訊傳遞給R3,R3就無法獲取R1收集到的路由資訊。

  • 想要避免IBGP水平分割帶來的問題,可以讓所有AS內部執行BGP的路由器均建立IBGP對等體關係, 這種建立全連的IBGP對等體的方案並不是最佳解決方案,因為,當一個AS內執行BGP協議的路由器數量較多時,建立全連的鄰居關係,將造成大量的資源浪費,並且降低網路的可擴充套件性。
  • BGP存在兩個技術專門用於解決IBGP水平分割帶來的問題:1.路由反射器,2.聯邦。


BGP基本配置


EBGP對等體直連建鄰

  • 啟動BGP程式,1 指的時該路由器所在的AS號;因為一個路由只能屬於一個AS中,所以一個路由器只能啟動一個BGP程式
1 [r1]bgp 1
2 [r1-bgp]
  • 配置RID,BGP要求鄰居間的RID不能相同,可以手工配置,也可以自動獲取
1 [r1-bgp]router-id 1.1.1.1
  • 指定建鄰的IP地址和鄰居所在的AS的編號,指定鄰居IP後,如果該鄰居可達,則嘗試建立TCP會話。

1 [r1-bgp]peer 12.0.0.2 as-number 2 -- #鄰居關係指定是雙向的


IBGP對等體環回建鄰
由於,IBGP鄰居處於同一個AS中,正常一個AS中存在大量的備份路徑,若使用物理介面建立鄰居關係,將浪費這些備份或者負載均衡的路徑;故建議使用環回介面來進行IBGP對等體關係的建立。

1 [r2-bgp]peer 3.3.3.3 as-number 2 --- #指定建鄰的IP地址和鄰居所在的AS的編號
2 [r2-bgp]peer 3.3.3.3 connect-interface LoopBack 0 ---- #指定傳送給鄰居的資料包的源IP為該介面的IP
  • 由於鄰居在收到資料包時,會檢測該包的源IP和本地指定的鄰居IP是否相同,不同則無法建鄰。所以一旦使用環回地址作為建鄰地址,同時需要修改源IP地址未本地環回地址。

EBGP對等體環回建鄰
EBGP間使用環回建鄰首先要有一條路由可以去往鄰居的環回,一般我們使用靜態路由

1 [r1]ip route-static 2.2.2.2 32 12.1.1.2
  • 因為EBGP對等體之間一般採用直連建鄰的方法,所以,EBGP對等體之間的資料包中的TTL值設定為1,這意味著R1只能與R2的g 0/0/0口通訊而不能與R2的環回通訊,所以使用EBGP對等體環回建鄰時需要修改資料包的TTL值。
1 [r1-bgp]peer 2.2.2.2 ebgp-max-hop 2 --- #將發往該鄰居的資料包的ttl值修改為2
2 [r1-bgp]peer 2.2.2.2 ebgp-max-hop ---- #後面不加數字,相當於將TTL值改為最大值,255。

總結:再建立對等體關係時,建議EBGP對等體間直連建鄰;IBGP對等體間建議使用環回介面進行建鄰。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70012489/viewspace-2934157/,如需轉載,請註明出處,否則將追究法律責任。