邊界閘道器協定(英語:Border Gateway Protocol,縮寫:BGP)是互聯網上一個核心的去中心化自治路由協定。它通過維護IP路由表或「字首」表來實現自治系統(AS)之間的可達性[1],屬於向量路由協定。BGP不使用傳統的內聯網關協定(IGP)的指標,而使用基於路徑、網絡策略或規則集來決定路由。因此,它更適合被稱為向量性協定,而不是路由協定。

自治系統(AS)以邊界閘道器路由互聯

大多數ISP必須使用BGP來與其他ISP建立路由連接(尤其是當它們採取內送流量備援容錯機制連接時)。因此,即使大多數互聯網用戶不直接使用它,但是與7號信令系統——即通過PSTN的跨供應商核心響應設置協定相比,BGP仍然是互聯網最重要的協定之一。特大型的私有IP網絡也可以使用BGP。例如,當需要將若干個大型的OSPF開放最短路徑優先)網絡進行合併,而OSPF本身又無法提供這種可延伸性時。使用BGP的另一個原因是其能為內送流量備援容錯機制的單個或多個ISP(RFC 1998)網絡提供更好的冗餘

歷史

BGP是為了取代外部閘道器協定(EGP)協定而建立的,其允許執行一個完全分散的路由系統,從ARPANET模型的核心路由系統過渡到包括NSFNET骨幹網及其相關區域網絡的分散系統。這使得互聯網成為一個真正的分權制度。自1994年以來,第四版的BGP在互聯網上使用,所有以前的版本現在都已過時且不可用。第4版中主要的增強功能是通過支援無類別域間路由和路由聚合來減少路由表的大小。第4版(BGP-4)是在早期的 RFC 1771 第4版的基礎上編纂,通過20多個草案修改,最終在2006年1月通過,形成 RFC 4271RFC 4271 版本糾正了一些錯誤,澄清模糊之處,帶來了更接近工業級應用標準的RFC行業慣例。

IPv6 BGP在1995年被 RFC 1883 定義,在1998年的 RFC 2283 中有所改進。它使得BGP-4能夠支援諸如IPv4、IPv6等一系列的地址類型,也被稱為多協定BGP(Multiprotocol BGP,MP-BGP)。

BGP執行

BGP的鄰居關係(或稱通訊對端/對等實體,peer)是通過人工組態實現的,對等實體之間通過TCP埠179建立對談交換數據。BGP路由器會周期地傳送19位元組的保持存活(keep-alive)訊息來維護連接(預設周期為60秒)。在各種路由協定中,只有BGP使用TCP作為傳輸層協定。[2]

同一個AS自治系統中的兩個或多個對等實體之間執行的BGP被稱為iBGP(Internal/Interior BGP)。歸屬不同的AS的對等實體之間執行的BGP稱為eBGP(External/Exterior BGP)。[3]在AS邊界上與其他AS交換資訊的路由器被稱作邊界路由器(border/edge router),邊界路由器之間互為eBGP對端。在Cisco IOS中,iBGP通告的路由距離為200,優先級比eBGP和任何內聯網關協定(IGP)通告的路由都低。其他的路由器實現中,優先級順序也是eBGP高於IGP,而IGP又高於iBGP。

iBGP和eBGP的區別主要在於轉發路由資訊的行為。例如,從eBGP peer獲得的路由資訊會分發給所有iBGP peer和eBGP peer,但從iBGP peer獲得的路由資訊僅會分發給所有eBGP peer。所有的iBGP peer之間需要全互聯。

BGP也可以執行於VPN之上,使得位置上相隔較遠的站點也能安全地交換路由資訊。

協定擴充協商

在peer的握手過程中,通過OPEN訊息來協商所支援的協定擴充,例如多協定擴充(多協定BGP英語Multiprotocol BGP)、各種故障恢復模式等。

BGP路由聯通性和路由學習

同一AS內如果有多個路由器參與BGP路由,則它們之間必須組態成全連通的網狀網格結構:任意兩個路由器之間都必須組態成對等實體。這樣做會帶來擴充方面的問題,因為所需要的(TCP)連接數是(BGP)路由器數量的平方。為緩減這個問題,BGP支援兩種選項:route reflectors (RFC 4456)和confederations(RFC 5065)。下面討論了在全連通的IBGP網格中的基本更新處理(UPDATE)。

基本更新過程

NLRI(Network Layer Reachability Information網絡層可達資訊)。

一個BGP路由器可以從多個鄰居接收NLRI更新資訊,並且將(自己擁有的)NLRI資訊通告給自己的鄰居們(與收到NLRI更新訊息的鄰居可以不一致)。BGP維護自己的主路由表,稱為Loc-RIB(本地路由資訊庫),注意與路由器的主路由表的區別。針對每一個鄰居,當前BGP的行程(可以理解成本地BGP實體)維護一個Adj-RIB-In(鄰接路由資訊庫,入站),記錄從該鄰居收到的NLRI訊息;還要維護一個Adj-RIB-Out(出站),記錄從本地BGP實體傳送給該鄰居的NLRI資訊。

在上一段中提到的Loc-RIB, Adj-RIB-In和Adj-RIB-Out的具體實現(這些RIB的物理儲存和結構)都由不同的廠商在實現BGP時自行決定。雖然本地路由器上往往通過管理指令查詢這些RIB,但BGP路由器並不關心其他BGP路由器是如何實現這些RIB的。具體實現方法可以不同,大家往往把兩個Adj-RIBs和loc-RIB存在同一個數據結構中,依靠每個RIB表項後附加的額外資訊來區分。BGP行程可以從附加資訊中得知很多資訊,例如哪些表項是屬於為某個特定鄰居準備的Adj-RIBs,Loc-RIB表項是否有資格被遞交給本地路由器的路由表管理行程,逐鄰接路由選擇行程收到的Loc-RIB是否符合策略。

如果Loc-RIB表項有資格被提交給本地路由器的路由表管理行程,BGP會把自認為最佳的多條路由遞交給主路由表行程。所遞交的BGP路由是否被選用,則是完全由上述行程的具體實現決定的。例如,如果從路由器的本地埠獲知某一字首與本路由器直接相連,則通常會選擇直接轉發的路由。只要直連的埠還在正常工作,去向該目的字首的BGP路由就不會被真正納入路由表(主路由表)。如果直連埠無法正常工作,並且不存在優先級較高的路由,則Loc-RIB路由表項就會被載入主路由表。之前有一個常見的誤解,認為BGP傳送各種策略。實際上BGP只傳送資訊,基於這些資訊,BGP行程可以做決策。有些資訊顯然是用於決策的,例如communities和multi-exit discriminators (MED)。

路由選擇

在選擇合適的NLRI加入loc-RIB時,BGP標準規定了很多決策準則。評價NLRI的第一個準則就是判斷它的下一跳屬性必須是可達(reachable或resolvable)。下一跳可達還可以做如下解釋:在本路由器的主路由表中,有一條活動可用的路由,指向下一跳地址所在的字首。換句話說,必須有一條活動可用的路由去向下一跳。

其次,針對每個鄰居,本地BGP行程可以採用不同的標準和廠商自訂的原則決定哪些路由可以加入該鄰居對應的Adj-RIB-in。鄰居可以把去向某個目的地的多條路由發給你,but the first level of preference is at the neighbor level。對於某個目的地,只有一條路由會被加入所謂的Adj-RIB-In(註:在本地,針對每個鄰居都有一個Adj-RIB-In)。如果鄰居復原了任何路由,該BGP行程還要負責從Adj-RIB-In中刪除對應的條目(如果有)。

如果某個Adj-RIB-In發生變化,本地的主BGP行程將判斷對應的鄰居通告的新路由是否比Loc-RIB中現有路由更好。如是,將進行替換。如果某個路由被鄰居復原,而且沒有別的路由指向相應的目的地,則需要從Loc-RIB中刪除相應的路由表項,並且BGP不再將該表項遞交給主路由表管理器。如果OSPF或其他非BGP協定也沒能為本路由器找到一條指向該目的地的路由,則相應的路由表項將從主路由表中刪除。

逐鄰居選擇

如果某條路由資訊(NLRI)來自一個本域內的對等實體(IBGP),BGP標準規定的第一條準則就是檢查LOCAL_PREFERENCE(以下簡稱LOCAL_PREF)屬性。如果來自鄰居(同一AS域)的多條IBGP路由指向同一目的字首,則選擇具有最高LOCAL_PREF的那條路由。如果恰巧有多條路由都具有相同的最高LOCAL_PREF,則執行下一條準則。標準中規定LOCAL_PREF為第一準則,一旦確定了下一跳(NEXT_HOP)可達,Cisco和其他幾個廠商首先考慮了本地路由器定義的WEIGHT值(該屬性僅在本地路由器有效,不會通過BGP擴散),即選擇具有最大WEIGHT的路由。

可以通過本地組態或控制軟件能夠操縱LOCAL_PREF、WEIGHT以及其他的準則。標準中並未定義這樣的操縱,但在實際產品中廣泛存在。例如,BGP選擇行程(selection process)並不直接使用COMMUNITY屬性(見下面)。但BGP鄰居行程(neighbor process)可以根據手動組態的規則來設置LOCAL_PREF或別的factor的屬性值。例如,當COMMUNITY屬性值滿足某種模式匹配準則(或者說具有某種模式)時,BGP鄰居行程就可以修改LOCAL_PREF的值。如果某條路由是從相鄰AS的某個對等實體(BGP)獲知的,per-neighbor BGP process會根據本地的策略規則計算該路由的LOCAL_PREF,並且與來自同一鄰居的其他路由的LOCAL_PREF比較大小。

如果不考慮廠商自己對規則的修改,在BGP協定中,per-neighbor level上依次執行下面的準則,直至選出唯一的一條路由:

  1. 選擇具有最短AS_PATH的路徑。AS_PATH是由到達通告中的目的地所必須經過的AS號組成。例如:AS1-AS2-AS3比AS4-AS5-AS6-AS7短。
  2. (如果多條路由具有相同的AS_PATH長度)選擇具有最小ORIGIN值的路由。
  3. (如果多條路由具有相同的ORIGIN)選擇具有最小MED值的路由。

BGP組態錯誤事件

BGP組態對於互聯網流量路由至關重要,組態錯誤,經過BGP的自動擴散,會導致互聯網流量紊亂甚至中斷。

  • AS 7007事件
  • 2018年11月14日,尼日尼亞互聯網服務商MainOne由於組態錯誤,將直連Google的網絡路由泄漏到中國電信的網絡,然後通過中國電信的BGP傳播到其他ISP中,導致一部分北美連接Google服務的流量通過迂迴的AS路徑傳輸。MainOne其後承認出現錯誤。[4][5]
  • 2019年6月6日,甲骨文的一名安全分析師發現瑞士數據中心寄存商Safe Host的AS泄露了7萬個路由記錄到中國電信的網絡,並通過中國電信的BGP傳播,導致部分歐洲的互聯網流量繞進了中國電信的網絡,這個組態錯誤至少延續了2個小時。[6]
  • 2019年6月25日,美國互聯網運營商Verizon將其客戶Allegheny Technologies泄漏的來自DQE Communications BGP最佳化器的路由傳播到其他ISP中,導致北美部分地區的流量通過DQE Communications傳輸,導致網絡癱瘓。[7]
  • 2021年Facebook死機事件:2021年10月4日,由於組態錯誤,Facebook的DNS權威伺服器地址通過BGP復原,導致用戶和Facebook其他服務的伺服器無法根據DNS獲得相應的伺服器地址,因而Facebook的網絡服務中斷了6~7小時。

參見

參考文獻

外部連結

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.