BGP 配置詳細步驟:華為、H3C、思科 eBGP 配置例項
BGP 配置的骨架在三家裝置上相同:啟動 BGP 寫本端 AS 號,指定 router-id,用 peer(思科 neighbor)寫對端位址和 AS 號,用 network 宣告自有網段,用 display bgp peer 或 show ip bgp summary 確認鄰居 Established。最容易錯的兩處:H3C 必須在位址族裡啟用鄰居;network 宣告的網段在路由表裡必須有掩碼一致的路由。
BGP 配置最常見的場景,是機房用自己的 AS 號與運營商建立 eBGP 會話,把自有位址段宣告出去,同時接收運營商下發的路由。完成這件事分五步:配好互聯介面位址;為要宣告的網段準備一條路由,通常是指向 NULL0 的靜態路由;啟動 BGP 程序,寫本端 AS 號和 router-id;用 peer 或 neighbor 指定對端位址和 AS 號;用 network 宣告網段,並加上出方向過濾,保證只發出自己的位址段。下面先列出要準備的引數,講清 AS 號、router-id、network 與 import-route 各管什麼,再給出華為、H3C、思科三家的完整命令和驗證方法。範例中的公網位址和 AS 號都是文件專用值,替換成運營商開通單上的實際值即可。
BGP 配置前要準備哪些引數
動手之前,把下面這張表填滿。任何一項不確定,會話都可能建不起來,或者建起來以後宣告錯路由:
| 引數 | 本文範例 | 從哪裡來 |
|---|---|---|
| 本端 AS 號 | 64510 | 自己申請的 AS 號;用上游分配的私有 AS 時以上游通知為準 |
| 對端 AS 號 | 64496 | 運營商開通單 |
| 互聯位址 | 本端 192.0.2.1/30,對端 192.0.2.2/30 | 運營商分配 |
| 要宣告的網段 | 203.0.113.0/24 | 自有或獲得授權的位址段,按運營商要求準備授權檔案或路由登記 |
| router-id | 10.255.255.1 | 自己規劃,通常取 LoopBack0 的位址 |
| 對端下發的路由 | 只給預設路由 | 開通時約定,也可能是本網路由或完整路由表 |
| 認證金鑰 | 雙方約定 | 運營商要求啟用 MD5 認證時提供 |
範例拓撲如下。203.0.113.0/24 在機房內部被拆成多個小網段分給各個 VLAN,邊界路由器上並沒有一條完整的 /24 路由,這一點後面會用到:
運營商 AS 64496
192.0.2.2/30
|
192.0.2.1/30 介面 GE0/0/1
[ 機房邊界路由器 AS 64510 LoopBack0 10.255.255.1 ]
|
機房內部:203.0.113.0/24 拆成 /26、/27 分給各業務 VLAN
AS 號、router-id 和 network、import-route 的區別
AS 號寫在兩個地方
本端 AS 號寫在啟動 BGP 程序的命令裡(華為、H3C 是 bgp 64510,思科是 router bgp 64510),一台裝置的一個 BGP 例項只有一個本端 AS;對端 AS 號寫在每個鄰居上。裝置據此判斷會話型別:對端 AS 與本端不同就是 eBGP,相同就是 iBGP,不需要另外宣告。
4 位元組 AS 號有兩種寫法:整數形式(asplain),如 4200000001;點分形式(asdot),把高 16 位和低 16 位用點隔開,同一個號寫作 64086.59905(64086 × 65536 + 59905 = 4200000001)。華為、思科都能接受兩種輸入,運營商開通單上寫的是哪種,配置時照抄即可,不要自己換算出錯。AS 號填錯的表現是 TCP 連線能建立,但對方校驗 OPEN 報文時發現 AS 號對不上,回一條 NOTIFICATION(OPEN Message Error / Bad Peer AS)後斷開,會話反覆重試,始終到不了 Established。
router-id:手工指定,不要依賴自動選擇
router-id 是一個寫成 IPv4 位址形式的 32 位標識,在 AS 內必須唯一,不要求可達,也不需要宣告出去。不手工指定時,裝置會按規則自動挑一個介面位址,通常優先取 Loopback 介面中最大的位址。問題在於自動選出的值會隨介面增刪而變化,而修改 router-id 會讓 BGP 會話全部重建。所以生產環境一律手工指定,習慣上取 LoopBack0 的位址,這個介面不會因為某個物理口斷開而消失。兩台裝置誤用了同一個 router-id 時,部分裝置會直接拒絕建立會話,規劃位址時一併分配好。
network 與 import-route:兩種把路由放進 BGP 的方式
| 對比項 | network | import-route(思科叫 redistribute) |
|---|---|---|
| 宣告什麼 | 命令裡指定的那一個字首 | 某個來源(直連、靜態、OSPF 等)的全部路由,可用路由策略篩選 |
| 前提條件 | IP 路由表裡必須有一條字首和掩碼都完全一致的路由 | 路由表裡有該來源的路由 |
| Origin 屬性 | IGP,路由表裡標 i | Incomplete,標 ? |
| 預設路由 | 可以用 network 0.0.0.0 宣告 | 預設不引入,華為需要 default-route imported,思科需要 default-information originate |
| 主要風險 | 小,掩碼寫錯通常只是宣告不出去 | 不加策略會把網際網路段、內網段一起帶出去 |
| 適合 | 自有位址段等少量固定字首 | 需要隨業務動態增減的大量字首,例如客戶自帶的位址段 |
network 的“完全一致”是最常見的坑。範例中 203.0.113.0/24 在內部拆成了 /26、/27,路由表裡沒有完整的 /24,network 203.0.113.0 255.255.255.0 寫上去什麼也不會發生。解決辦法就是加一條指向 NULL0 的靜態路由,讓 /24 出現在路由表裡;內部更具體的 /26、/27 按最長匹配優先轉發,這條黑洞路由只兜住還沒分配出去的位址,順帶防止去往空閒位址的流量在邊界上來回繞圈。思科還有一個細節:network 不寫 mask 時按 A、B、C 類的自然掩碼處理,203.0.113.0 碰巧是 C 類能對上 /24,換成 10.0.0.0 就成了 /8。
確實要用 import-route 時,必須掛一條路由策略,只放行要宣告的字首。華為寫法(H3C 的 if-match 寫成 if-match ip address prefix-list OWN-NET):
route-policy STATIC-TO-BGP permit node 10
if-match ip-prefix OWN-NET
quit
bgp 64510
ipv4-family unicast
import-route static route-policy STATIC-TO-BGP
思科寫法:
route-map STATIC-TO-BGP permit 10
match ip address prefix-list OWN-NET
router bgp 64510
address-family ipv4 unicast
redistribute static route-map STATIC-TO-BGP
路由策略只寫了 permit 節點時,沒匹配上的路由一律不引入,這正是想要的效果。
BGP 配置命令:華為、H3C、思科完整例項
三段配置實現的是同一件事:建立到 192.0.2.2 的 eBGP 會話,宣告 203.0.113.0/24,出方向只放行這一個字首,限制對端發來的路由條數。命令以華為 VRP V200R、H3C Comware V7、思科 IOS/IOS-XE 為準,其他版本以裝置文件為準。
華為 BGP 配置例項
system-view
interface LoopBack0
ip address 10.255.255.1 255.255.255.255
quit
interface GigabitEthernet0/0/1
description To-ISP-A
ip address 192.0.2.1 255.255.255.252
quit
ip route-static 203.0.113.0 255.255.255.0 NULL0
ip ip-prefix OWN-NET index 10 permit 203.0.113.0 24
bgp 64510
router-id 10.255.255.1
peer 192.0.2.2 as-number 64496
peer 192.0.2.2 description ISP-A
peer 192.0.2.2 password cipher <與運營商約定的金鑰>
ipv4-family unicast
network 203.0.113.0 255.255.255.0
peer 192.0.2.2 enable
peer 192.0.2.2 ip-prefix OWN-NET export
peer 192.0.2.2 route-limit 1000
return
save
幾點說明:
- 華為的鄰居在 IPv4 單播位址族裡預設已啟用,
peer 192.0.2.2 enable寫上無妨。 - 邊界裝置如果是 S 系列交換器,物理口預設是二層口,要先在介面下執行
undo portswitch切成三層口(部分型號不支援),或者把連接埠划進一個 VLAN,在 VLANIF 上配置互聯位址。 route-limit 1000表示對端發來的路由超過 1000 條時斷開會話。對端只給預設路由時這個值綽綽有餘;接收完整路由表時要按實際條數加餘量設定,並考慮改成只告警不斷開。
H3C BGP 配置例項
system-view
interface LoopBack0
ip address 10.255.255.1 32
quit
interface GigabitEthernet1/0/1
port link-mode route
description To-ISP-A
ip address 192.0.2.1 30
quit
ip route-static 203.0.113.0 24 NULL0
ip prefix-list OWN-NET index 10 permit 203.0.113.0 24
bgp 64510
router-id 10.255.255.1
peer 192.0.2.2 as-number 64496
peer 192.0.2.2 description ISP-A
peer 192.0.2.2 password cipher <與運營商約定的金鑰>
address-family ipv4 unicast
network 203.0.113.0 24
peer 192.0.2.2 enable
peer 192.0.2.2 prefix-list OWN-NET export
peer 192.0.2.2 route-limit 1000
return
save
和華為相比,H3C Comware V7 有三處要注意:
- 位址族裡的
peer 192.0.2.2 enable不能省。V7 的鄰居不會自動加入 IPv4 單播位址族,漏了這一步,IPv4 路由不會交換,有的版本連會話都不建立。 - 字首列表叫
ip prefix-list,出方向過濾寫peer 位址 prefix-list 名稱 export;華為叫ip ip-prefix。 - 交換器的連接埠要先切成三層:
port link-mode route放在介面配置的最前面執行,切換模式會把介面上原有的配置恢復為預設;不支援三層模式的型號,改在 VLAN 介面上配置互聯位址。
思科 BGP 配置例項
configure terminal
interface Loopback0
ip address 10.255.255.1 255.255.255.255
interface GigabitEthernet0/0/1
description To-ISP-A
ip address 192.0.2.1 255.255.255.252
no shutdown
ip route 203.0.113.0 255.255.255.0 Null0
ip prefix-list OWN-NET seq 10 permit 203.0.113.0/24
router bgp 64510
bgp router-id 10.255.255.1
bgp log-neighbor-changes
neighbor 192.0.2.2 remote-as 64496
neighbor 192.0.2.2 description ISP-A
neighbor 192.0.2.2 password <與運營商約定的金鑰>
address-family ipv4 unicast
network 203.0.113.0 mask 255.255.255.0
neighbor 192.0.2.2 activate
neighbor 192.0.2.2 prefix-list OWN-NET out
neighbor 192.0.2.2 maximum-prefix 1000
exit-address-family
end
write memory
bgp log-neighbor-changes 讓鄰居每次起落都寫一條日誌,排障時很有用。IOS 預設會把鄰居自動加入 IPv4 單播位址族,配置了 no bgp default ipv4-unicast 時才必須 activate。如果裝置是 IOS XR,規則不同:沒有配置路由策略的 eBGP 鄰居預設不收也不發任何路由,必須為每個鄰居寫好入、出方向的 route-policy。
三家 BGP 配置命令對照
| 作用 | 華為 VRP | H3C Comware V7 | 思科 IOS/IOS-XE |
|---|---|---|---|
| 啟動 BGP、寫本端 AS | bgp 64510 |
bgp 64510 |
router bgp 64510 |
| 指定 router-id | router-id 10.255.255.1 |
router-id 10.255.255.1 |
bgp router-id 10.255.255.1 |
| 建立鄰居、寫對端 AS | peer 192.0.2.2 as-number 64496 |
peer 192.0.2.2 as-number 64496 |
neighbor 192.0.2.2 remote-as 64496 |
| 進入 IPv4 位址族 | ipv4-family unicast |
address-family ipv4 unicast |
address-family ipv4 unicast |
| 啟用鄰居 | 預設已啟用 | peer 192.0.2.2 enable,必須 |
預設已啟用 |
| 宣告網段 | network 203.0.113.0 255.255.255.0 |
network 203.0.113.0 24 |
network 203.0.113.0 mask 255.255.255.0 |
| 引入其他路由 | import-route static route-policy 名稱 |
import-route static route-policy 名稱 |
redistribute static route-map 名稱 |
| 字首列表 | ip ip-prefix 名稱 index 10 permit 203.0.113.0 24 |
ip prefix-list 名稱 index 10 permit 203.0.113.0 24 |
ip prefix-list 名稱 seq 10 permit 203.0.113.0/24 |
| 出方向過濾 | peer 位址 ip-prefix 名稱 export |
peer 位址 prefix-list 名稱 export |
neighbor 位址 prefix-list 名稱 out |
| MD5 認證 | peer 位址 password cipher 金鑰 |
peer 位址 password cipher 金鑰 |
neighbor 位址 password 金鑰 |
| 路由條數上限 | peer 位址 route-limit 1000 |
peer 位址 route-limit 1000 |
neighbor 位址 maximum-prefix 1000 |
| 儲存配置 | save |
save |
write memory |
驗證:鄰居 Established、路由發出與收到
配置完成後,按“會話、發出、收到、生效”四步檢查,每一步都有明確的期望結果:
| 檢查項 | 華為 | H3C | 思科 | 期望結果 |
|---|---|---|---|---|
| 鄰居狀態 | display bgp peer |
display bgp peer ipv4 |
show ip bgp summary |
華為、H3C 顯示 Established;思科 State/PfxRcd 列顯示數字 |
| BGP 路由表 | display bgp routing-table |
display bgp routing-table ipv4 |
show ip bgp |
自有網段前有 *>,Origin 為 i |
| 發給對端的路由 | display bgp routing-table peer 192.0.2.2 advertised-routes |
display bgp routing-table ipv4 peer 192.0.2.2 advertised-routes |
show ip bgp neighbors 192.0.2.2 advertised-routes |
只有 203.0.113.0/24 |
| 從對端收到的路由 | display bgp routing-table peer 192.0.2.2 received-routes |
display bgp routing-table ipv4 peer 192.0.2.2 received-routes |
show ip bgp neighbors 192.0.2.2 routes |
約定好的路由,本例只有 0.0.0.0/0 |
| 是否裝進路由表 | display ip routing-table protocol bgp |
display ip routing-table protocol bgp |
show ip route bgp |
預設路由的下一跳是 192.0.2.2 |
華為上會話正常時的輸出類似這樣(範例):
<Border-R1> display bgp peer
BGP local router ID : 10.255.255.1
Local AS number : 64510
Total number of peers : 1 Peers in established state : 1
Peer V AS MsgRcvd MsgSent OutQ Up/Down State PrefRcv
192.0.2.2 4 64496 732 729 0 12:05:31 Established 1
PrefRcv 為 1,對應運營商只下發了一條預設路由。再看 BGP 路由表(範例):
<Border-R1> display bgp routing-table
Total Number of Routes: 2
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 0.0.0.0 192.0.2.2 0 0 64496i
*> 203.0.113.0/24 0.0.0.0 0 0 i
* 表示路由有效,> 表示被選為最優,只有最優路由才會發給鄰居。自有網段的下一跳是 0.0.0.0,說明它由本機產生;Path/Ogn 只有一個 i,說明是 network 宣告、AS_PATH 為空,發給運營商時才會加上 64510。思科 show ip bgp 裡本機產生的路由下一跳同樣是 0.0.0.0,Weight 為 32768。
裝置上的檢查只能說明“我發出去了”,運營商有沒有接受,要從外部確認:請運營商在他們的裝置上查收到的字首,或者從其他網路對 203.0.113.0/24 裡的位址做路由追蹤,看路徑是否經過這家運營商進入你的機房。
BGP 配好了卻不通:按現象排查
| 現象 | 配置上的常見原因 | 先看什麼 |
|---|---|---|
| 鄰居一直停在 Idle | 沒有到對端位址的路由;H3C 漏了位址族裡的 peer enable;鄰居被管理性關閉;路由條數超限後被斷開,等待重連 |
華為 display current-configuration configuration bgp,思科 show running-config | section bgp |
| 在 Active、Connect 之間來回切換 | 互聯位址不通;對端位址寫錯;ACL 攔了 TCP 179;用 Loopback 建鄰居卻沒放開跳數;MD5 金鑰兩端不一致 | 帶源位址 ping 對端:華為 ping -a 192.0.2.1 192.0.2.2,思科 ping 192.0.2.2 source GigabitEthernet0/0/1;再看日誌裡有沒有 MD5 認證失敗的記錄 |
| 進入 OpenSent 後又退回 Idle 或 Active,反覆重試 | 對端 AS 號寫錯(Bad Peer AS);部分裝置上兩端 router-id 相同(Bad BGP Identifier) | 裝置日誌裡的 NOTIFICATION 錯誤碼;華為 display bgp peer 192.0.2.2 log-info |
| Established,但 PrefRcv 為 0 | 運營商還沒下發;本端入方向策略把路由過濾光了;IOS XR 沒寫路由策略 | 查收到的路由,再對照入方向策略 |
| 自有網段沒有宣告出去 | network 的掩碼和路由表不一致;缺少 NULL0 靜態路由;出方向字首列表沒匹配上 | 華為 display ip routing-table 203.0.113.0 24,確認路由表裡有完全一致的條目 |
| 宣告了不該宣告的網段 | import-route 沒掛路由策略;出方向沒有過濾 | advertised-routes,立即補上過濾 |
| 執行一段時間後斷開 | 保持時間內沒收到報文;對端發來的路由超過 route-limit;鏈路 MTU 不一致導致大的 UPDATE 報文丟失 | 斷開時的日誌和錯誤碼,思科 show ip bgp neighbors 192.0.2.2 | include Last reset |
Active 和 Idle 都不是“正常但空閒”的意思,看到它們就說明會話沒建立。排查順序固定為:先保證三層可達,再核對兩端的位址和 AS 號,最後看認證和策略。
在機房裡怎麼落地
BGP 配置寫在路由器上,但宣告哪些網段、每個網段是否已經對外發布,需要一個地方統一記錄,否則換一個人接手就說不清楚。Toplink DCIM 的 IP 位址管理按 CIDR 錄入位址段,大段可以自動拆分成多個 /24 分別管理,和 BGP 宣告的粒度一致;每個段可以按線路分組、打上“已宣告 · ISP-A”之類的標籤,尚未宣告的段可以鎖定,開通伺服器時不會被自動分配出去。邊界裝置是 DCIM 已納管的三層交換器時,修改 BGP 配置可以在交換器管理裡直接開啟瀏覽器 SSH 終端,會話全程錄影並記錄命令日誌,哪條 network、哪條字首列表由誰在什麼時候改過,出了問題能直接回放核對。
常見問題
改了 BGP 路由策略,要重啟會話才生效嗎?
不用重啟會話,做一次軟復位即可:華為 refresh bgp 192.0.2.2 import(出方向用 export),H3C refresh bgp 192.0.2.2 import ipv4,思科 clear ip bgp 192.0.2.2 soft in(出方向用 out)。不帶 soft 的 clear ip bgp 和 reset bgp 會斷開會話、中斷業務,只在必要時使用。
IPv6 的 BGP 怎麼配?
步驟相同,換成 IPv6 位址族。華為在 bgp 檢視下 peer 2001:db8:1::2 as-number 64496,再進入 ipv6-family unicast 執行 peer 2001:db8:1::2 enable 和 network 2001:db8:100:: 48;思科在 address-family ipv6 unicast 下執行 neighbor 2001:db8:1::2 activate 和 network 2001:db8:100::/48。IPv6 字首同樣需要路由表裡有一條掩碼一致的路由。
能用 Loopback 位址和運營商建 eBGP 嗎?
可以,但需要雙方都同意。eBGP 預設要求對端直連(TTL 為 1),用 Loopback 建鄰居時兩端都要放開跳數,並指定源介面:華為、H3C 用 peer 位址 ebgp-max-hop 2 和 peer 位址 connect-interface LoopBack0,思科用 neighbor 位址 ebgp-multihop 2 和 neighbor 位址 update-source Loopback0,還要有一條到對端 Loopback 的靜態路由。