BGP工作原理
一、BGP報文
1.open報文
作用:建立鄰居、協商參數
open報文只在鄰居建立時發送,不會周期發送
內容:
- version:BGP版本
- My AS:自身的AS號
- hold time:超時時間
- 180S,取最小的數值
- BGP Identifier:BGP的router id
- 拓展能力參數
- 多協議能力支持(Multiprotocol extensions capability)
- IPv4(主地址簇/AFI)
- 單播(子地址簇/sub AFI) 默認支持:ipv4-family unicast
- 組播(子地址簇/sub AFI)
- VPNV4(子地址簇/sub AFI)ipv4-family vpnv4 需要配置mpls vpn后會出現
- IPV6(主地址簇)
- 單播(子地址簇/sub AFI)
- IPv4(主地址簇/AFI)
- 路由刷新能力(Route refresh capability) 默認支持
- 是否支持4字節AS號(Support for 4-octet AS number capbility) 華為設備默認支持
- ORF出方向路由過濾 (需要手工配置)
- 多協議能力支持(Multiprotocol extensions capability)
影響BGP鄰居建立的因素
1.version需一致
2.My AS:收到報文中的My AS與在BGP進程下配置的該peer的as-number一致
3.BGP Identifier不能一致
4.擴展能力參數
- IPv4(主地址簇/AFI)需一致
- 路由刷新能力不影響
- 4字節AS號不影響
5.認證
2.keepalive報文
作用: 維護鄰居關系,用於對open報文的確認
發送間隔:60S 超時時間:180S
HOLD TIME時間決定keepalive報文的存活時間
3.update報文
作用:BGP路由更新報文,用以更新BGP路由信息 或者 撤銷BGP路由信息
攜帶豐富的路徑屬性描述路由(origin、AS path等)
發送方式:
-
鄰居建立成功后
-
觸發更新:network、import路由進入BGP
-
收到路由刷新報文(router refresh報文)
攜帶:
- 更新路由時,使用NLRI(網絡層可達信息)字段攜帶路由
- 攜帶路徑屬性
- 撤銷路由時,使用 withdraw routes攜帶撤銷的路由
- 撤銷路由時不攜帶任何路徑屬性
5.route-refresh報文
作用:用於請求鄰居再次發送update報文
路由刷新報文用在當改變路由策略后請求鄰居重新發送相關路由信息
refresh bgp all export/import ##export:發送update報文 ##import:發送router refresh報文,請求鄰居的update報文
route-refresh報文只有在輸入以上命令后,才會發送
6.notification報文
作用:用於告警,斷開鄰居關系、TCP連接
當BGP路由器檢測錯誤信息,會向鄰居發出notification,立即中斷TCP連接
組成:
- 錯誤代碼 + 錯誤子代碼組成
- 錯誤代碼2:open報文錯誤
- 錯誤子代碼2:peer as號錯誤
二、BGP狀態機
1.idle
-
初始狀態
-
拒絕所有TCP連接
-
等待start事件(配置peer命令)
- start事件:peer x.x.x.x as-number x
- 由開始start事件路由器先發起TCP連接,進入下一個狀態connect狀態
2.connect
- 啟動連接重傳定時器,等待TCP完成連接
- 如果連接成功,向對等體發送open報文,轉至opensent狀態
- 如果連接失敗,進入active狀態
- 如果連接重傳定時器超時(32s),對等體沒有回應,繼續嘗試。停留在connect狀態
3.active
- 重新發起TCP連接,啟動連接重傳定時器
- 如果連接成功,像對等體發送open報文,轉至opensent狀態
- 如果連接失敗,停留在active狀態
- 如果連接重傳定時器超時,對等體沒有回應,轉至connect狀態
4.opensent
- 發出open報文后進入該狀態
- 收到open報文,進行open報文參數的協商
- 參數協商正常,向對等體發送keepalive報文,轉至openconfirm狀態
- 參數協商失敗,向對等體發送notification報文,轉至idle狀態
5.openconfirm
- 發出keepalive報文后進入該狀態,對鄰居的open報文進行確認
- 等待鄰居的keepalive報文,需要在5s內收到
- 收到keepalive報文,轉至established狀態
- 收到notification報文,轉至idle狀態
6.established
- 鄰居建立成功
- 發送update報文
- 可以和對等體交換update、keepalive、route-refresh、notification報文
- 收到正確的update或keepalive報文。運行正常、保持TCP連接
- 收到錯誤的update或keepalive報文。發出notification報文通知對等體,進入idle狀態
- 收到notification報文,將進入idle狀態
- 收到TCP拆鏈通知。斷開TCP連接 。進入idle狀態
- route-refresh報文不會改變BGP狀態
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oy7sivn9-1616912237027)(E:\HCIE R&S\HCIE\2020.2.1 BGP基礎\bgp狀態機.png)]
- 常見狀態機
- idle
- active
- established
三、BGP路由產生方式
1.network
是逐條將IP路由表中已經存在的路由引入到BGP路由表中
注意:
-
被network的路由必須是路由表中存在的
-
轉換時,必須與路由表的 前綴+掩碼 完全匹配
bgp 100 network 5.5.5.5 32
2.import
根據運行的路由協議(RIP,OSPF,ISIS等)將路由引入到BGP路由表中,同時import命令還可以引入直連和靜態路由
bgp 100 import-route direct
如果一條路由同時被network方式和import方式引入,優選network方式
BGP的路由標識
- “*”:標識為有效路由
- “>":標識為最優路由
- i:表示為通過network的方式產生
- ?:表示為通過import的方式產生
- BGP的路由優先級為255
- network的路由只要存在在路由表中即可轉換,並非要求是設備本身的路由
四、BGP數據庫
1.IP路由表(IP-RIB)
全局路由信息庫,包括所有IP路由信息
display ip routing-table
2.BGP路由表(Loc-RIB)
BGP路由信息庫,存放從所有鄰居收到的以及本路由器產生的BGP路由,包含最優和非最優
display bgp routing-table ##查看IPV4的單播路由 display bgp vpnv4 all routing-table ##查看IPV4的VPN路由 display bgp ipv6 routing-table ##查看IPV6的單播路由
3.鄰居表
BGP對等體鄰居清單列表以及顯示鄰居的狀態機
display bgp peer ##查看IPV4的單播鄰居 display bgp vpnv4 all peer ##查看IPV4的VPN鄰居 display bgp ipv6 peer ##查看IPV6的單播鄰居
4.Adj-RIB-In
對等體宣告給本地BGP Speaker的未處理的路由信息庫,未經入方向的策略
##查看來自鄰居x.x.x.x的路由信息 display bgp routing-table peer X.X.X.X received-routes ##用於in方向路由策略發生變化時,刷新本路由器的路由 refresh bgp all import
5.Adj-RIB-Out
本地BGP Speaker宣告給指定對等體的路由信息庫,已經經過出方向路由策略
##查看要發完鄰居x.x.x.x的路由信息 display bgp routing-table peer X.X.X.X advertised-routes ##用於出方向路由策略發生變化時,刷新宣告給鄰居的路由 refresh bgp all export
BGP路由信息處理
1.接收來自對等體的更新路由信息,存儲到路由選擇信息庫(Routing Information Base, RIB)中,並指明是來自哪個對等體的(Adj-RIB-In)。
2.這些更新數據包被輸入策略引擎過濾后,路由器將會執行路徑選擇算法,來為每一條前綴確定最佳路徑
3.得出的最佳路徑被存儲到本地BGP RIB (Loc-RIB)中,然后被提交給本地IP路由選擇表(IP-RIB)
除了從對等體接收來的最佳路徑外,Loc-RIB也會包含當前路由器注入的(被稱為本地發起的路由),並被選擇為最佳路徑的BGP前綴
4.Loc-RIB中的內容在被通告給其他對等體之前,必須通過輸出策略引擎過濾。只有那些成功通過輸出策略引擎的路由,才會被安裝到輸出RIB (Adj-RIB-Out)中
輸入策略引擎、輸出策略引擎通過配置route-policy然后在peer相應鄰居時調用
五、BGP通告原則
四條通告原則
1.只將最優路由傳遞給鄰居
最優路由標識符:*、>
*:有效路由
- 成為有效路由的條件
- 下一跳地址可達
- 如果開啟同步,必須滿足同步條件
- 路由的前綴和路由的下一跳地址不能一致
“>”:最優路由
BGP默認情況下不會存在負載,如果收到多條相同路由,只會選出最優的一條
- 成為最優路由的前提:
- 路由必須有效
- 如果存在多條來自不同BGP鄰居的相同路由,根據選路規則進行比較、選出最優路由
路由必須是 有效路由(*) + 最優路由(>) 才能傳遞
2.通過EBGP學習的最優路由發送給所有BGP鄰居
發送給EBGP鄰居,改變路由下一跳為自身與對等體建立鄰居關系的更新源地址
發送給IBGP鄰居,下一跳不變
-
為什么不改變下一跳
- 將每個AS都看成一個大的路由器
- 避免次優路徑
-
可能會出現下一跳不可達,成為無效路由,無法傳遞
-
解決方案
-
使用IGP或者靜態路由使下一跳可達(該路由器的路由表中存在相關下一跳的路由信息)
-
修改下一跳(在源主機上)
-
bgp 200 peer 4.4.4.4 next-hop-local ##修改路由為本地更新源地址(針對特定鄰居) ##將EBGP路由發送給鄰居4.4.4.4時改變更新源地址為自身
-
-
-
3.通過IBGP學習的最優路由不發布給其他IBGP鄰居
主要為了避免AS內環路現象(水平分割)
- 水平分割:不將從對等體學習到的路由再發送回對等體
- 百度百科上的解釋是:水平分割法的規則和原理是,路由器從某個接口接收到的更新信息不允許再從這個接口發回去
- 水平分割防止了控制層面的環路
帶來的問題
- AS內某些路由器無法學習路由
解決方法
1.全互聯建立IBGP鄰居關系(不推薦)
2.配置反射器(RR)
-
反射器(打破水平分割)
-
將R3配置為反射器,R2、R4分別與R3建立鄰居關系,並且R3上配置反射器
-
peer 2.2.2.2 reflect-client
-
-
反射規則:非非不傳
- 從EBGP鄰居得到的路由,路由反射器會反射給所有的客戶機和非客戶機
- 從路由反射器得到的路由,路由反射器會反射給所有客戶機和非客戶機
- 從客戶機得到的路由,路由反射器會反射給所有的客戶機和非客戶機
- 從非客戶機的達到的路由,路由反射器會反射給所有客戶機
3.配置聯盟
4.BGP與IGP的同步
從IBGP鄰居學習到的路由,在IGP中也要學習到,否則路由無效
同步規則是用以解決路由黑洞的
R1、R2建立EBGP鄰居,R2、R4建立IBGP,R4、R5建立EBGP
沒有開啟BGP與IGP同步的情況下
R1身上的10.0.0.0/24路由信息成為BGP路由后,傳遞給R2、R4、R5,路由信息傳遞無問題
當R5要訪問R1 10.0.0.0/24網段時,數據經過R4到達到達R3,在R3身上會出現問題,因為R3身上並沒有10.0.0.0/24網段的路由信息,會丟棄該數據包
- 路由黑洞
- 設備路由表存在最優有效路由,但是無法訪問
同步規則默認不開啟,同步規則影響路由傳遞出現
- 如果要滿足同步的條件,往往需要將大量的BGP路由引入到IGP協議,會對AS內部的路由器造成很大的負擔
沒有同步規則的情況下該如何解決路由黑洞
-
在數據所經設備都開啟BGP協議
-
將部分的BGP路由引入到IGP(通過路由控制)
- 默認情況下IBGP路由不允許引入到IGP中,主要是為了避免環路現象
-
使用MPLS,即使中間路由器沒有路由,數據包也根據標簽轉發
-
Route recursive-lookup tunnel ##下一跳迭代進隧道
-
六、BGP的路徑屬性
作用:選擇最優路由、防環
四大屬性
屬性 | 特性 | 對應的BGP屬性 |
---|---|---|
公認必遵 | 所有BGP路由器都可以識別這一屬性,在更新路由條目時update報文一定攜帶 | origin、as-path、net-hop |
公認任意 | 所有BGP路由器都可以識別這一屬性,在更新路由條目時update報文不一定攜帶 | local_pref、atomic_aggregate |
可選過渡 | 所有BGP路由器不一定能識別這一屬性,不識別也能將這一屬性通告出去 | community、aggregator |
可選非過渡 | 所有BGP路由器不一定能識別這一屬性,不識別就不會將這一屬性通告出去 | MED、cluster_list、orginator_ID |
介紹幾種常用的屬性
1.Origin:
起源屬性,表示一條路由如何成為BGP路由
-
用於控制選路(i>e>?)
- i:network
- ?:import
- e:早期EGP路由
-
###配置舉例 ##1匹配路由 ip ip-prefix ori index 10 permit 40.1.1.1 32 ##2配置路由策略 route-policy ori permit node 10 if-match ip-prefix ori apply origin incomplete ##后綴改為? # route-policy ori permit node 20 ##放通所有,默認為拒絕所有 ##3針對鄰居調用 BGP 100 peer 1.1.1.1 route-policy ori export
2.AS_Path
用來標識BGP路由所經過的AS號,BGP路由表AS列表最左的為相鄰的AS號,最右邊為起始AS號
①AS_Sequence:默認,按矢量順序記錄路由所經過的所有AS編號;
②AS_Set:BGP路由聚合時,無序還原路由所經過的所有AS編號;
③AS_Confed_Sequence:應用於聯盟,在聯盟內傳遞路由,按矢量順序記錄路由所經過的所有AS編號;
④AS_Confed_Set:應用於聯盟,在聯盟內BGP路由聚合時,無序還原路由所經過的所有AS編號。
-
有序記錄經過AS號
- 路由發送給EBGP鄰居時,才添加本AS號到AS-path
-
用於AS間防環
- 不接收AS-path當中包含自AS號的路由
-
用於選擇最優路由(控制選路)
- 每個AS號計數為1,AS-path越短越優
-
###配置舉例 ##1匹配路由 ip ip-prefix ori index 10 permit 41.1.1.1 32 ##2配置路由策略 route-policy as permit node 10 if-match ip-prefix 41 apply as-path 200 200 additive # route-policy as permit node 20 ##3針對鄰居調用 BGP 200 network 41.1.1.1 255.255.255.255 peer 10.1.24.2 route-policy as export
注意:在使用增加AS號來控制選路時,一般是增加路由起源AS域的AS號
- 如果增加的是網絡中其他的AS號,會導致其他的AS收不到改路由(防環機制);
- 如果添加的是網絡中不存在AS號,可以添加但是不建議,考慮到后期拓展性
3.Next_hop
- 用於生成BGP路由的下一跳
- 在本地路由表上默認顯示
- 自身產生的路由:0.0.0.0
- 匯總產生的路由:127.0.0.1
- 鄰居發送的路由:鄰居的更新源地址
默認情況下,
本地始發BGP路由發送給IBGP鄰居下一跳不變,
從IBGP學習的BGP路由發送給EBGP鄰居下跳變為本地更新源地址
從EBGP學習的路由發送給IBGP鄰居下
peer x.x.x.x next-hop-invariable ##發送給鄰居x.x.x.x的路由下一跳不變 peer x.x.x.x next-hop-local ##發送給鄰居x.x.x.x的路由下一跳為本地更新源地址
PrefVal
-
華為設備的特有屬性
-
僅在本地有效
-
不會傳遞給BGP鄰居。因為協議首選值是人為主動設置的,代表本地用戶的意願,因而在BGP進行選路時會優先比較協議首選值
-
默認為0
5.Local_Pref
用於判斷流量離開AS時的最佳路由 (也可以說判斷進入AS路由的最優方式)
用於選擇最優路由
-
僅在本AS內部有效(IBGP對等體之間有效)
-
默認100,越大越優,范圍:0-2^32
-
配置時,在路由進入本AS時添加(即從EBGP接收時)
AS100內,R1,R2和R3之間分別兩兩建立IBGP對等體關系
R2和R3分別和位於AS200和AS300的路由器建立EBGP對等體關系
這樣路由器R2和R3都會從自己的EBGP對等體收到10.0.0.0/24這條路由
為了讓AS100內的三台路由器優選R2作為10.0.0.0/24這條路由在本AS的出口
我們只需要在R2和R3在接收10.0.0.0/24路由時,對該路由的Local Pref屬性進行修改,就可以達到目的
7.MED
類似於IGP的cost
用於判斷流量進入AS時的最佳路由
用於選擇最優路由
- 只在鄰居的AS內有效
- 默認為0,越小越優
- 配置時在本AS發出路由時添加
R1和R2將網段10.0.0.0/24傳遞給各自的EBGP鄰居R3和R4
R3和R4在其他條件相同的情況下,優先選擇MED值較低的路徑
即均選擇經由R1訪問網絡10.0.0.0/24
##允許BGP比較屬於任意AS的EBGP對等體的路由的MED值 compare-different-as-med
8.Community
分為基本團體屬性和拓展團體屬性
①基本團體屬性
- 自定義團體屬性
- 功能:標記路由,方便為相同特性路由做統一處理(類似IGP的tag)
- 格式:NN:MM 100:100、200:200、300:300
- 公認團體屬性
- internet:缺省屬性,所有路由都屬於Internet,此屬性的路由可以通告給所有的BGP鄰居
- no-advertise:收到該屬性的路由,不會將這條路由發布給其他的BGP鄰居
- no-export:收到該屬性的路由,不會將路由發布到其他的AS
- no-export-subconfed:在聯盟中使用,不傳出聯盟內的第三個AS
實驗配置
針對R4身上的loopback 42接口:42.1.1.1/32,在發送給R2是打上團體屬性200:100
##1.R4上創建loopback 42 interface loopback 42 ip address 42.1.1.1 32 ##2.匹配路由 ip ip-prefix 42 permit 42.1.1.1 32 ##3做策略 route-policy tag permit node 10 if-match ip-prefix 42 apply community 200:100 # route-policy tag permit node 20 ##4bgp對應鄰居調用 bgp 200 peer 10.1.24.2 route-policy tag export peer 10.1.24.2 advertise-community
R2上針對42.1.1.1這條路由修改其本地優先級
因為配置了團體屬性,這里匹配42.1.1.1/32路由時有兩種方法,一是直接匹配路由、二是匹配團體屬性
匹配團體屬性使用ip community-filter工具
##1匹配路由 ip community-filter 1 permit 200:100 ##2做策略 route-policy local permit node 10 if-match community-filter 1 apply local-preference 90 # route-policy local permit node 20 ##3對應鄰居調用 bgp 100 peer 10.1.24.4 route-policy local import
②拓展團體屬性
- MPLS VPN中使用的RT、RD值
七、BGP選路原則
當到達同一目的地存在多條路由並且下一跳可達時,BGP依照如下策略順序進行路由選擇
-
優選Preference_Value值最高的路由(私有屬性,僅本地有效)
-
優選本地優先級(Local_Preference)最高的路由
-
優選手動聚合>自動聚合>network>import>從對等體學到的
- 本地產生>從鄰居學習
-
優選AS_Path短的路由
- AS_Path的長度不包括AS_CONFED_SEQUENCE和AS_CONFED_SET
- AS_SET的長度為1,無論AS_SET中包括多少AS號
-
起源類型IGP>EGP>Incomplete
-
對於來自同一AS的路由,優選MED值小的
-
優選從EBGP學來的路由(優先級 EBGP=20>IBGP=200)
-
優選AS內部IGP的Metric最小的路由(比較路由的next_hop)。---優選設備去往BGP路由下一跳IGP cost小的
如果前面八條都無法比較出來,可以開啟負載
maximum load-balancing 2 ##針對EBGP/IBGP路由的最大負載均衡路徑為2 maximum load-balancing ibgp 2 ##只針對IBGP路由的最大負載均衡路徑為2 maximum load-balancing ebgp 2 ##只針對EBGP路由的最大負載均衡路徑為2
如果BGP進行開啟負載分擔,只會在IP 路由表顯示負載分擔,BGP 路由表依舊只會選擇一條最優的路由給BGP鄰居,即根據下面幾條規則繼續比較
-
優選Cluster_List最短的路由。(反射器場景才比較)
-
優選Orginator_ID最小的路由。(反射器場景才比較)
或者優選Router_ID最小的路由器發布的路由 -
優選具有較小IP地址的鄰居學來的路由