邊界網關協議

邊界網關協議（Border Gateway Protocol，縮寫：BGP）是網際網路上一個核心的去中心化自治路由協議。它通過維護IP路由表或「前綴」表來實現自治系統（AS）之間的可達性，屬於矢量路由協議。BGP不使用傳統的內部網關協議（IGP）的指標，而使用基於路徑、網路策略或規則集來決定路由。因此，它更適合被稱為矢量性協議，而不是路由協議。

大多數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 4271。RFC 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作為傳輸層協議。

同一個AS自治系統中的兩個或多個對等實體之間運行的BGP被稱為iBGP（Internal/Interior BGP）。歸屬不同的AS的對等實體之間運行的BGP稱為eBGP（External/Exterior BGP）。在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）、各種故障恢復模式等。

## 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上依次執行下面的準則，直至選出唯一的一條路由：

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

## BGP配置錯誤事件

BGP配置對於網際網路流量路由至關重要，配置錯誤，經過BGP的自動擴散，會導致網際網路流量紊亂甚至中斷。

- AS 7007事件
- 2018年11月14日，尼日尼亞網際網路服務商MainOne由於配置錯誤，將直連Google的網路路由洩漏到中國電信的網路，然後通過中國電信的BGP傳播到其他ISP中，導致一部分北美連接Google服務的流量通過迂迴的AS路徑傳輸。MainOne其後承認出現錯誤。
- 2019年6月6日，甲骨文的一名安全分析師發現瑞士資料中心託管商Safe Host的AS洩露了7萬個路由記錄到中國電信的網路，並通過中國電信的BGP傳播，導致部分歐洲的網際網路流量繞進了中國電信的網路，這個配置錯誤至少延續了2個小時。
- 2019年6月25日，美國網際網路運營商Verizon將其客戶Allegheny Technologies洩漏的來自DQE Communications BGP優化器的路由傳播到其他ISP中，導致北美部分地區的流量通過DQE Communications傳輸，導致網路癱瘓。
- 2021年Facebook當機事件：2021年10月4日，由於配置錯誤，Facebook的DNS權威伺服器地址通過BGP撤銷，導致使用者和Facebook其他服務的伺服器無法根據DNS獲得相應的伺服器地址，因而Facebook的網路服務中斷了6~7小時。

## 外部連結

- LinkRank University of California, Los Angeles製作的BGP路由圖形化工具
- BGP Routing Resources （包含一個專門的章節在 BGP & ISP Core Security）
- BGP表統計