1. 程式人生 > >BGP選路原則

BGP選路原則

選路原則

選路的意義:只有最優路由才會被寫入主路由表(配置了maximum-path時例外),只有最優路由才會通告給鄰居。

準備工作1、忽略下一跳不可達的路由(包括沒有路由和迴圈遞迴路由)。

只有預設路由匹配下一跳時也算下一跳可達。

預設情況下拒絕接收從EBGP鄰居學習到的下一跳不可達的路由,但是不會拒絕從IBGP鄰居學習到的下一跳不可達的路由,這是為什麼呢?因為預設情況下,將路由通告給EBGP鄰居時,會修改地址為自己的介面地址,這個介面對接收者來說通常是直連可達的,所以下一跳不可達的路由會被拒絕,如果配置了多跳EBGP,那麼就允許接收下一跳不可達的路由了。因為IBGP鄰居預設情況下可以跨越多跳,所以允許接收下一跳不可達的路由,現在雖然不可達,但是可能待一會兒可能就可達了。

準備工作2、忽略還沒有達到同步的IBGP路由。

預設情況下,忽略這一步,因為預設情況下起了BGP程序之後就自動產生no synchronization這條配置,而且通常不啟用同步功能。如果啟用了同步,如果某條路由它的同步條件還沒有達到,那麼這條路由不是最優路由,也不會通告給EBGP鄰居。

 

BGP在選路時是兩條路由一直比,直到有路由勝出,再拿優勝者和其它路由比。這樣可能出現因為MED比較這一步選路結果隨路由接收順序的不同而不同的情況。如果配置了bgp deterministic-med之後,就不會出現這個問題,首先根據路由是從哪個AS學習到的進行分組,然後在組內進行成對比較,最後再進行組間比較。這一點參見quagga0.99.18 bgp_best_selection()。通常建議配置bgp deterministic-med。

 

下面是成對比較的選路原則。可以參考:quagga0.99.18 bgp_info_cmp()。

1、選擇WEIGHT值最大的路由。

2、選擇LOCAL_PREF值最大的路由。

Quagga0.99.18的處理方式是沒有LOCAL_PREF屬性的話,LOCAL_PREF看作是100來處理。

3、優選路由器自己產生的路由,包括本地network、redistribute、aggregate引入的路由,同為自己產生的路由,優先順序為network > redistribute > aggregate。即靜態注入和半靜態注入優於動態注入。Aggregate產生的路由並非原始的路由資訊,屬性資訊可能有損失,比如MED值,所以優先順序最低。

4、選擇AS path長度小的路由。一個AS_SET被計數為1,不管其中包含多少個自治系統。AS_CONFED_SEQUENCE和AS_CONFED_SET不算在在AS_PATH長度中。

如果配置了bgp bestpath as-path ignore,則不比較AS path的長度。

Quagga0.99.18中配置了命令bgp bestpath as-path confed後,則AS_CONFED_SEQUENCE和AS_CONFED_SET也算在AS_PATH長度中。

5、選擇ORIGIN值最小的路由 (IGP < EGP < Incomplete)。即優選network進入BGP的路由,次選通過重發布命令進入BGP的路由。原因是靜態注入和半靜態注入優於動態注入。至於aggregate得到的聚合路由,ORINGIN可能是IGP,也可能是incomplete,如果具體路由中有incomplete路由,則聚合路由是incomplete,否則聚合路由是IGP。參考quagga0.99.18 bgp_aggregate_add()。

6、選擇MED值最小的路由。

沒有MED屬性的路由MED值看作是0參與比較,如果配置了bgp bestpath med missing-as-worst則MED值看作是2的32次方-1。

Quagga0.99.18裡按如下順序判斷

第一步:如果配置了bgp always-compare-med,則不管情況怎樣,都對這兩條路由進行MED值比較。

第二步:如果配置了bgp bestpath med confed,對於只包含AS_CONFED_SEQUENCE和AS_CONFED_SET的路由(聯邦內子AS間路由)進行比較MED值的比較(不管最左邊的子AS號是否相同)。

第三步:如果兩條路由的AS_PATH的AS_SEQUENCE最左邊的AS號相同(忽略AS_CONFED_SEQUENCE和AS_CONFED_SET),則對這兩條路由進行MED值比較。如果AS_PATH最左邊是AS_SET,則暫時不比較這兩條路由,繼續第四步。

第四步:如果兩條路由的AS_CONFED_SEQUENCE最左邊的子AS號相同,就對這兩條路由進行MED值比較。如果AS_PATH最左邊是AS_CONFED_SET,則暫時不比較這兩條路由,繼續第五步。

第五步:如果兩條路由的AS_PATH中都沒有AS號(即AS內部路由,有沒有子AS號沒有影響),則對這兩條路由進行MED值比較。

註釋1:我覺得第五步應該要求沒有AS_CONFED_SEQUENCE和AS_CONFED_SET號比較合適。否則,因為有第五步所描述的情況包含了第二步所描述的情況,第二步的處理就沒有意義了。

註釋2:可以看出來bgp bestpath med confed是bgp always-compare-med的功能子集。

7、優選EBGP路由,次選IBGP路由和從聯邦內的EBGP peer學習到的路由。不用擔心本AS中的網段也會走了EBGP路由,因為這種EBGP路由AS path長度大。這一條就是用來比較其它AS的路由的。

8、選擇下一跳IGP度量值小的路由。如果到下一跳的IGP度量值發生了變化,要重新進行選路。用於比較通過多個不同的IBGP peer學習到的路由。

RFC4271中,接下來兩步是:

9、選擇BGP ID小的speaker發來的路由。

10、選擇低IP地址發來的路由。

實際cisco12.4和quagga0.99.18發現IBGP是這樣處理的。但是對於EBGP路由,預設Prefer the oldest route。這樣處理是為了減少route-flap,但是同時也帶來了網路管理者難以預期誰是最優路由的問題。如果配置了bgp bestpath compare-routerid,則選擇BGP ID小的speaker發來的路由。

需要說明:如果IBGP路由中有ORIGINATOR_ID,則使用ORIGINATOR_ID來代替Router ID。

 

關於maximum-path命令

配置maximum-path,對於前8步打平手,並且AS-path完全相同時,才會將多條路由寫入主路由表,不夠BGP路由表中仍然只有一條最優路由。

 

選路原則與distance

RT1上到網路B的有兩條路由,1條是MED 20的EBGP,1條是MED 10的IBGP路由。RT1會選擇MED 10的IBGP路由。原因是BGP選路時先考慮MED值,後考慮路由型別(EBGP、IBGP)。有人會問EBGP DISTANCE是20,IBGP是200呀。當有多條路由要放入主路由表,他們是不同路由協議提供的,這個時候根據distance值來決定把誰學到的路由放入主路由表。也就是說首先是路由協議決定把一條路由放進主路由表,然後才能根據distance來進行選擇,現在BGP的選路過程中就已經把MED 20的EBGP剔除掉了,還根本就沒到比較distance的時候。