網路與 IP

BGP 協議是什麼:工作層次、連接埠號與機房裡的用法

BGP 協議全稱 Border Gateway Protocol(邊界閘道器協議),是網際網路上各個自治系統(AS)之間交換路由的協議,現行版本 BGP-4 由 RFC 4271 定義。它基於 TCP,鄰居之間透過 179 連接埠建立會話,按封裝位置算應用層,作用卻是為網路層選路。機房常說的“BGP 機房”,就是用這個協議把自有 IP 段同時宣告給多家運營商。

作者 頂聯產品團隊發布於 8 分鐘閱讀

BGP 協議的全稱是 Border Gateway Protocol,中文叫邊界閘道器協議。它解決的問題是:網際網路由幾萬個獨立運營的網路組成,每個網路叫一個自治系統(AS),各有一個 AS 號;這些網路之間需要互相告知“我這裡有哪些 IP 段”“去某個 IP 段要經過哪些 AS”,BGP 就是交換這些資訊的標準協議。現行的 BGP-4 由 RFC 4271 定義。兩台 BGP 路由器先建立一條到對方 TCP 179 連接埠的連線,再在這條連線上交換路由,所以 BGP 協議是基於 TCP 的;按 TCP/IP 的封裝位置它屬於應用層,但它的工作是為網路層的轉發提供路由。IDC 行業所說的“BGP 機房”“BGP 線路”,是用這個協議實現的一種多運營商接入方式,而協議本身在每一個公網 IP 的背後都在工作。

BGP 協議的作用,以及它工作在第幾層

作用:在 AS 之間交換“去哪、怎麼走”

BGP 是一種路徑向量協議,傳遞的每條路由都包含一個目的字首和一組路徑屬性,例如:

字首 203.0.113.0/24   下一跳 198.51.100.2   AS_PATH 64496 64500   Origin IGP

意思是:去往 203.0.113.0/24,把包交給 198.51.100.2;這條路先經過 AS 64496,最終到達宣告這個段的 AS 64500。圍繞這樣的路由,BGP 做四件事:

  1. 宣告:每個 AS 把自己持有的位址段告訴鄰居,鄰居再一層層傳出去,全網就知道了這個段在哪裡。
  2. 記錄路徑:路由每經過一個 AS,就在 AS_PATH 前面加上這個 AS 的號碼。
  3. 按策略選路:同一個字首從多個鄰居學到時,按屬性和本地策略選一條,不看鏈路頻寬和延遲。運營商之間“走不走這條路、優先走誰”的商業關係,正是透過 BGP 策略落實的。
  4. 防環:收到的 AS_PATH 裡已經有自己的 AS 號,就丟棄這條路由。

落到 IDC 的日常裡,就是多運營商接入、出入方向的流量排程、線路故障時撤銷路由自動繞行,以及被攻擊時用團體屬性通知上游丟棄發往某個 IP 的流量(黑洞路由)。

工作在第幾層:報文在應用層,作用在網路層

BGP 報文裝在 TCP 裡,所以按封裝算應用層。教材裡常把幾種路由協議放在一起對比:

路由協議 承載方式 按封裝算哪一層
RIP UDP 520 應用層
OSPF 直接封裝在 IP 裡,協議號 89 網路層
IS-IS 直接封裝在資料鏈路層上,不經過 IP 在 OSI 裡屬於網路層協議
BGP TCP 179 應用層

但 BGP 本身不轉發任何業務資料包,它只算出路由、裝進路由表,真正按目的 IP 轉發的是網路層。所以也常說它是網路層的控制面協議,兩種說法並不矛盾。選 TCP 的好處是可靠傳輸交給了 TCP,BGP 不用自己做確認和重傳:會話建立時交換一次完整路由,之後只發增量變化。代價是 TCP 不會主動告訴 BGP 對端已經失效,所以 BGP 要定時發 KEEPALIVE 探活。

BGP 協議連接埠號 179:會話怎麼建立、狀態怎麼看

179 連接埠與存取控制

兩端都監聽 TCP 179,哪一端先發起都可以:發起方用一個隨機高位連接埠連到對方的 179。所以在執行 BGP 的 Linux 上,看到的連線可能是“本地 179、對端隨機連接埠”,也可能反過來;雙方同時發起時,按 RFC 4271 保留 Router ID 較大的一方發起的那條。

# Linux 上執行 FRR、BIRD 時,檢視 BGP 的 TCP 連線
ss -tnp '( sport = :179 or dport = :179 )'
# 抓 BGP 報文,-v 會解碼出 OPEN、UPDATE、KEEPALIVE
tcpdump -i eth0 -nn -v 'tcp port 179'

179 連接埠直接決定路由,要按鄰居位址嚴格放行。下面只允許運營商的互聯位址 198.51.100.2 存取,第二條放行本端主動發起時對方從 179 回來的包:

iptables -A INPUT -p tcp -s 198.51.100.2 --dport 179 -j ACCEPT
iptables -A INPUT -p tcp -s 198.51.100.2 --sport 179 -j ACCEPT
iptables -A INPUT -p tcp --dport 179 -j DROP

協議層面還有三道常用防護:eBGP 預設 TTL 為 1,鄰居必須直連,用環回位址等非直連方式建鄰居要顯式配置多跳;GTSM(RFC 5082)讓傳送方把 TTL 設為 255,接收方只收 TTL 不低於門限的報文,遠處偽造的報文經過多跳後 TTL 不夠而被丟棄,門限的配置方式以裝置文件為準;TCP MD5 認證(RFC 2385)讓兩端用共享金鑰為每個 TCP 段計算摘要,對不上的段直接丟棄,後繼標準是 TCP-AO(RFC 5925)。

五種報文與保持時間

報文 型別號 作用
OPEN 1 會話建立時交換版本、AS 號、保持時間、Router ID 和支援的能力(如 IPv6、4 位元組 AS)
UPDATE 2 宣告新路由或撤銷舊路由,攜帶路徑屬性
NOTIFICATION 3 出錯時傳送,攜帶錯誤碼,發完立即斷開會話
KEEPALIVE 4 只有 19 位元組的報文頭,定時傳送,證明自己還在
ROUTE-REFRESH 5 請求對方重發路由,改了入方向策略不用斷開會話(RFC 2918)

保持時間在 OPEN 裡協商,取兩端配置中較小的值,KEEPALIVE 間隔一般是它的三分之一。思科、華為預設 60 秒發一次 KEEPALIVE、保持時間 180 秒;RFC 4271 建議的保持時間是 90 秒。超過保持時間沒收到對方任何報文,就發出錯誤碼為 4(保持計時器超時)的 NOTIFICATION 並斷開會話。

六個會話狀態

display bgp peer(華為)、show bgp summary(思科、FRR)裡的 State 一列,顯示的就是會話所處的狀態:

狀態 含義 長時間停在這裡的常見原因
Idle 初始狀態,或出錯後等待重試 鄰居被管理性關閉;收到的路由條數超限被斷開;配置不完整
Connect 正在發起 TCP 連線 與 Active 來回切換,說明 TCP 179 建不起來
Active TCP 連線失敗,等對方連入並定時重試 對端位址不通;對端沒把本端配成鄰居;179 被 ACL 或防火牆攔截;非直連 eBGP 沒配多跳;源位址與對端配置的鄰居位址不一致
OpenSent TCP 已建立、已發 OPEN,等對方的 OPEN 通常一閃而過;任一方不認可 OPEN 裡的引數,會發 NOTIFICATION 斷開,會話退回 Idle
OpenConfirm OPEN 校驗透過,等對方的 KEEPALIVE 通常一閃而過
Established 會話建立,開始交換路由 正常狀態

最常見的誤讀是 Active:它不是“活躍”,而是連線沒建起來、還在重試。AS 號配錯是另一類典型故障:TCP 能連上,但對方校驗 OPEN 時發現 AS 號與配置不符,回一個 NOTIFICATION(OPEN 報文錯誤,子碼 Bad Peer AS)後斷開,會話反覆建立又斷開,裝置日誌裡能看到這條通知。下面的範例裡,第一個鄰居 State/PfxRcd 列是數字,表示已建立並收到 912340 條路由;第二個顯示 Active,表示沒有建立:

Neighbor        V    AS MsgRcvd MsgSent  TblVer  InQ OutQ Up/Down  State/PfxRcd
198.51.100.2    4 64496  128734    1021  884512    0    0 3d02h          912340
198.51.100.6    4 64497       0       0       1    0    0 never    Active

AS 號與 eBGP、iBGP 的區別

AS 號是 BGP 區分網路的依據。2 位元組 AS 號共 65536 個(0–65535,0 和 65535 保留),其中 64512–65534 為私有號(RFC 6996),64496–64511 留作文件範例(RFC 5398);4 位元組 AS 號(RFC 6793)把空間擴充套件到約 42 億,4200000000–4294967294 為私有號。國內運營商的骨幹網各有自己的 AS,例如中國電信 163 骨幹網 AS4134、CN2 AS4809,中國聯通 AS4837,中國移動 AS9808。

鄰居在不同 AS 之間叫 eBGP,在同一個 AS 內部叫 iBGP,兩者行為差別很大:

對比項 eBGP iBGP
鄰居在哪裡 不同 AS 之間,如機房與運營商 同一 AS 內部,如機房的兩台邊界路由器
預設 TTL 1,要求直連 不要求直連,通常用環回位址建鄰居,靠 IGP 保證可達
AS_PATH 發出時加上本 AS 號 不改變
下一跳 改成自己的位址 預設保持不變,需要時配置 next-hop-self
防環方式 檢查 AS_PATH 裡有沒有自己的 AS 從 iBGP 鄰居學到的路由不再傳給其他 iBGP 鄰居
LOCAL_PREF 不傳給外部鄰居 在 AS 內傳遞,統一出口選擇
管理距離(思科預設) 20 200

iBGP 的防環規則帶來規模問題:每台路由器都要和其他所有路由器建立 iBGP 會話,n 台需要 n(n−1)/2 條,10 台就是 45 條、20 台是 190 條。規模稍大的網路會用路由反射器(RFC 4456)把會話數降下來。

BGP 常用屬性:四類屬性各管什麼

RFC 4271 把路徑屬性分成四類:公認必遵屬性每條 UPDATE 都必須帶,所有實現都必須認識;公認任意屬性必須認識,但可以不帶;可選過渡屬性不認識也要原樣傳給下一個 AS;可選非過渡屬性不認識就丟棄、不往下傳。

屬性 類別 含義 在機房裡怎麼用
ORIGIN 公認必遵 路由怎麼進入 BGP:IGP(i,network 宣告)、EGP(e,已淘汰)、Incomplete(?,重分發引入) 用 network 宣告自有位址段,起源為 IGP
AS_PATH 公認必遵 經過的 AS 列表 防環;人為重複新增本 AS 號(prepend),讓某個方向顯得更遠,影響入方向流量
NEXT_HOP 公認必遵 去往該字首的下一跳位址 iBGP 收到的下一跳不可達時,這條路由不可用
LOCAL_PREF 公認任意 AS 內部的出口優先順序,越大越優先 指定某類目的位址優先從某家運營商出去
ATOMIC_AGGREGATE、AGGREGATOR 公認任意、可選過渡 標記路由經過聚合,並記錄聚合者 很少需要關心
COMMUNITY 可選過渡 給路由打標籤,對方按標籤執行策略(RFC 1997) 讓上游對被攻擊的 IP 做黑洞;公認團體 NO_EXPORT 限制路由不傳出 AS
MED 可選非過渡 建議鄰居 AS 從哪個入口送流量進來,越小越優先 與同一家運營商有多條互聯時使用

選路時,路由器按固定順序逐項比較這些屬性;思科的 Weight、華為的協議首選值這類廠商私有值排在最前面,只在本台裝置上生效。

BGP 和 OSPF 有什麼區別:IGP 與 EGP 的分工

OSPF、IS-IS 屬於內部閘道器協議(IGP),負責一個 AS 內部的路由;BGP 是外部閘道器協議(EGP),負責 AS 之間的路由:

對比項 OSPF(IGP) BGP(EGP)
用在哪裡 一個 AS 內部,如機房的核心與匯聚之間 AS 之間,如機房與運營商;大型網路內部也用 iBGP 傳外部路由
演算法 鏈路狀態:每台路由器掌握全網拓撲,用 SPF 算最短路徑 路徑向量:只知道鄰居告訴它的路徑和屬性
選路依據 開銷(cost),通常由介面頻寬換算 路徑屬性和策略,不看頻寬和延遲
鄰居發現 組播自動發現 手工指定鄰居位址
路由規模 幾百到幾萬條 完整的 IPv4 網際網路路由表已在百萬條量級
故障檢測 預設幾十秒,配合 BFD 可到亞秒級 預設保持時間 180 秒,通常要配 BFD
常見故障 區域號、網路型別、MTU 不一致,鄰居起不來 AS 號、鄰居位址、TTL 配錯;出口策略錯誤造成路由洩露

機房裡兩者配合使用:OSPF 在內部傳播各裝置的環回位址和互聯位址,保證邊界路由器之間互相可達;iBGP 跑在環回位址之間,傳遞從運營商學到的外部路由;eBGP 負責與各家運營商交換路由。外部的大量路由不要引入 OSPF,否則內部裝置的路由表和 CPU 都會被拖垮。

“BGP 機房”和 BGP 協議是什麼關係

單線機房同樣離不開 BGP 協議:它的位址段由運營商用自己的 AS 宣告,再經運營商之間的 BGP 會話傳到其他網路,只是機房自己不執行 BGP。行業裡說的“BGP 機房”“BGP 多線”,指機房自己成為一個 AS、直接參與 BGP:

  1. 持有自己的 AS 號和位址段,對外宣告的 IPv4 段至少是 /24;
  2. 與兩家以上運營商各建 eBGP 會話,把同一個位址段宣告給每一家;
  3. 從每家運營商接收路由,回包按路由表從對應線路出去;某條線路斷開時,會話中斷、路由撤銷,流量自動改走其他線路。

用本文的術語說,BGP 機房就是一個多宿主的 AS。行業裡另有一種“靜態 BGP”,機房與運營商之間一般不跑 BGP 會話,而是按運營商位址庫寫靜態路由分流;這是行業叫法,不是協議裡的概念,各家實現也不完全相同。想知道一個 IP 屬於哪種接入,查宣告它的起源 AS 是運營商的還是機房自己的,再看這個 AS 有幾家上游。

在機房裡怎麼落地

BGP 以字首為單位宣告,而 IPv4 在公網上能被普遍接受的最長字首是 /24,機房持有一個 /22 時,往往要拆成 4 個 /24 分別宣告、分別排程。Toplink DCIM 的 IP 位址管理按 CIDR 錄入位址段,大段可以自動拆分為多個 /24 分別管理,管理粒度和宣告粒度一致;每個段可以按線路分組、打標籤,“BGP 多線”和“電信單線”的位址分開歸類,用量比例圖上哪條線路的位址快用完了一目瞭然;還沒宣告或預留的段可以鎖定,開通伺服器時不會被自動分配出去。宣告管的是位址段在公網上的去向,段內每個位址由誰使用,還要在接入側管住:客戶在伺服器上私自配置一個不屬於自己的位址,流量照樣能發出去。在交換器管理裡給接入連接埠開啟源位址校驗和 ARP 繫結後,交換器只放行源位址登記在該連接埠名下的流量,冒用的位址發不出包。

常見問題

BGP 和 BGP-4 是一回事嗎?

現在說 BGP 指的就是 BGP-4。BGP 最早在 1989 年釋出(RFC 1105),1994 年的第 4 版開始支援 CIDR 無類路由,2006 年由 RFC 4271 重新定義。之後 IPv6、4 位元組 AS 號等能力都靠擴充套件加入,版本號沒有再變。

BGP 能代替 OSPF 做機房內部路由嗎?

大型資料中心裡可以:RFC 7938 描述了在 Leaf-Spine 架構中完全用 eBGP 做內部路由的做法,每台或每組交換器一個私有 AS 號。普通 IDC 機房的規模用不上,內部仍以 OSPF 或靜態路由為主。

伺服器上能跑 BGP 嗎?

能。FRR、BIRD 等開源軟體可以在 Linux 上執行 BGP,常見用途是把負載均衡的 VIP 或 Anycast 位址宣告給機房交換器。前提是機房同意與這台伺服器建立會話,並在交換器上限定它只能宣告哪些字首。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88