前文我們瞭解了BGP防環機制和路由聚合相關話題,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/15458110.html;今天我們來聊一聊BGP路由屬性和選路規則相關話題;
BGP路由屬性
先來看一看BGP路由表
提示:BGP路由表主要顯示了BGP路由,其中主要由路由狀態程式碼,目標網路地址,下一跳,med屬性值,本地優先順序,路由首選值,以及路由的AS_path和起源屬性組成;狀態程式碼中,星號(*)表示該路由可用,如果沒有星號,表示該路由不可用,一般情況不可用的BGP主要有下一跳地址不可達,即沒有去往下一跳的路由;其次還有可能是對應路由已經在IGP路由裡學習到了,因為IGP路由的優先順序要比BGP高,所以在ip路由表裡存在的就是IGP路由,而對於BGP來說,就不可用(因為有IGP路由更優);大於號(>)表示最優路由,即當一個網路有多個下一跳時,首選的路由;d表示,抑制,懲罰;即對應路由有懲罰機制;BGP路由是有懲罰機制的,如果一條路由不穩定,一會好,一會不好,此時對應路由就可能被懲罰(如果開啟了懲罰機制);即懲罰一段時間不可用,等懲罰時間過去以後,對應路由才會從抑制狀態變為可用;s表示抑制,即該路由不被通告給其他鄰居;只存在本地bgp路由表中;起源屬性(Origin),i表示本地宣告,即network宣告的路由;?表示匯入外部路由,即引入宣告的路由;e表示從egp學習到的(BGP前身,目前已被淘汰);起源屬性優先順序是本地宣告大於引入 宣告;
BGP路由屬性分類
提示:BGP路由屬性主要從公認屬性和可選屬性分類,其中公認屬性中又分必選和可選;可選屬性中有分可過渡和非過渡;公認必遵表示所有BGP都可以識別的屬性,並且是必須存在Update訊息中的;比如起源屬性,as_path,下一跳這些屬性就是所有BGP路由器在更新訊息中必須要有的屬性;換句話說這些屬性是不可省略,必須存在;公認任意就是指所有bgp路由器都可以識別,當不要求必須存在update訊息中,即這些屬性可以存在,也可以不存在,取決對應路由的需求,不是必須強制要求存在update訊息中;比如本地優先順序,自動聚合;可選過渡是指不被所有BGP路由器識別,如果無法識別,對應屬性是可以正常傳遞給鄰居的;比如手動聚合,團體屬性;可選非過渡是指不能被所有BGP路由器識別,如果不能識別,則對應屬性丟棄(只是對應路由的對應屬性丟棄,並不是對應路由被丟棄);比如med,med就類似ospf裡的開銷,這個屬性在bgp裡是私有屬性,所以不是被所有BGP路由器識別(華為是med,思科是metric,但兩者作用都是一樣的);
BGP路由屬性圖解
1、PrefVal:優選值,數字越大越優先;預設0;私有屬性,主要作用是定義本地路由的優先順序,作用範圍只限於本地有限,不傳遞給鄰居;
提示:當去往同一網路有多個下一跳時,我們可以通過調整很優選值來影響去往對應網路的路由;如上所示,我們希望RTA去往RTD經過RTC,那麼我們可以將RTA去往RTC的首選值調大;
2、Origin:起源屬性,主要用來描述對應BGP路由的產生方式;
提示:起源屬性優先順序順序是,本地通過network宣告的路由,要優於引入宣告的路由;
3、AS_Path:AS路徑,主要用來描述BGP路由在傳輸的路徑中所經歷的AS的列表;該屬性會在EBGP傳遞時更新(即傳遞給EBGP鄰居時,會在對應路由更新中加上自己所在AS的號碼),同時AS_Path這個屬性也是EBGP防環的一個屬性,即丟棄AS_Path屬性中包含本端as號的路由;該屬性是數量越少越優先(一個as我們可以理解為RIP裡的跳數,經過多跳數越小,對應路由就越優);as_path除了能夠防止as間環路,同時它也可以用作路由過濾,比如as_path filter;
提示:如上圖所示,針對as100去往RTA,如果從RTA--->RTB--->RTD--->AS100,那麼對於AS100收到的路由更新中對應AS_path的值為65201,65223,65101;如果從RTA--->---RTC--->AS100,對應as100收到R他的路由更新中as_path的值為65330,65101,相對於上面的路由,對應AS_Path的長度要略小,所以as100去往RTA會經過RTC到達RTA,而不會走經過RTD,RTB在到達RTA;
4、Next Hop下一跳,主要用來描述對應去往目標網路的下一跳屬性 ,即發出路由更新的路由器(更新源);
提示:如上所示,RTD釋出路由更新,對應下一跳就會是本地出介面ip地址(如果是物理口建立鄰居),而對應IBGP型別鄰居,預設更新不會更改更新源,即RTC收到RTD的路由更新,對應下一跳還是RTD,即RTC向EBGP傳送對應路由更新,其下一跳不會更改為RTC,而還是RTD;對於RTB收到RTC的路由更新,因為RTB和RTA是EBGP鄰居,所以RTB收到RTC的路由更新以後,會把對應的下一跳修改為自己,然後再傳遞出去;同樣的道理,RTA收到RTB的路由更新,因為RTA和RTF或RTE是IBGP鄰居,所以RTA收到RTB的路由更新以後,向鄰居傳播時,它不會更改更新源,即下一跳地址還是會是RTB;所以我們在RTF看到去往8.0.0.0/24的路由裡,對應下一跳屬性會是RTB的介面地址;
5、Local-Preference:本地優先順序,該屬性值在IBGP鄰居傳遞,數字越大越優先,預設是100;主要用於控制流量怎樣流出AS,即對出站路由的控制;
提示:如上圖所示,對於RTD要想去往R他的路由,我們可以在RTC或RTB上更改本地優先順序屬性來影響RTD去往R他的路由路徑;如果我們想要讓RTD的流量經過RTC到達RTA,那麼我可以在RTC上將對應本地優先順序屬性調大,從而達到影響as65101的出站路由;
6、MED:Multi-Exit-DISC,該屬性類似IGP裡的度量值(cost),主要用於區別到達同一鄰居AS的多條入口鏈路;數字越小越優先;該屬性僅在相鄰的兩個AS之間傳遞,收到此屬性的AS不會在通告給任何其他第三方AS;該屬性常用語控制流量怎樣進入AS,即控制AS入站路由;
提示:如上圖所示,我們想要控制AS65330的入站路由,我們可以在RTB和RTC上修改med的值,如果我們希望AS65101和AS65330之間的流量走RTB,我們可以將RTC的med調大,或者降低RTB的med值,從而讓RTA學習到的路由對應下一跳為RTB;預設情況下,不允許對比來自不同AS鄰居的路由資訊中的med值,除非能夠確認不同AS採用了同樣的IGP路由選擇方式,我們可以使用命令compare-different-as-med來比較不同AS鄰居的MED值;如下所示
提示:針對192.10.0.0/16這個網路來說,它從as500和as600傳送的MED不會被as700作為選路對比條件;因為med只會被來自同一AS到達多個相鄰鄰居入站路由對比條件;像這種不同AS是不被採用;當然如果能夠確定AS500和as600都是使用相同的IGP路由協議(比如都是用ospf作為IGP路由協議)和路由選擇方式(路由策略等),那麼我們也可以使用命令compare-different-as-med來對比來自不同AS中med的值;
BGP路由優選規則
BGP選路規則分三種情況
1、如果該路由到達目的地的路由是唯一的,則直接優選;
2、如果達到同一目的地的多條路由,優選優先順序最高的,即比較優先順序,優先順序最高被優選;
3、如果達到統一目的地的且具有相同優先順序的多條路由時,則使用如下更細的原則比較
提示:BGP路由優選的首要條件是對應路由的下一跳必須可達,即只會在BGP路由表中對應路由有星號的路由上進行優選;滿足下一跳可達的前提下,首先優選首選值(Preference_Value)最高的路由(該屬性為私有屬性,僅在本地有效,一般不長修改來影響路由選路);如果首選值一樣,則對比本地優先順序(Local_Preference),本地優先順序最高的路由被優選;如果本地優先順序一樣,則比較聚合方式,聚合方式是手動聚合大於自動聚合,大於本地network宣告,大於引入宣告,大於從鄰居學習到的路由;如果聚合方式一樣,則比較AS_Path長度,AS_Path最短的路由被優選(這裡的AS_Path最短是指經過的as數量最少,並非as號碼長度);如果AS_Path長度一樣,則比較起源屬性,起源屬性優先順序是本地宣告大於引入宣告;如果起源屬性也一樣,則比較來自同一AS的路由,優選MED最小的路由;如果MED也一樣,則比對鄰居型別,鄰居型別優選順序是EBGP型別鄰居大於IBGP型別鄰居;如果鄰居型別也一樣,則優選AS內部IGP的開銷最小的路由;即比較去往對應下一跳的開銷;去往對應下一跳開銷小的路由被優選;如果去往對應下一跳的開銷一樣,則比較cluster_list,優選cluster_list最短的路由,如果cluster_list長度一樣,則優選orginator_Id最小的路由;cluster_list和orginator_id這個是路由反射器中的屬性,目前不特別介紹;如果上述屬性都一樣,則比較router-id,優選router-id最小的路由器釋出的路由;如果router-id也一樣,則優選ip地址最小的鄰居學習到的路由;
從上面的BGP路由優選規則來說,BGP不管怎樣它都會選出一條最優的路由來,在BGP裡沒有等價路由;預設情況下BGP是不允許有負載分擔的,即負載分擔的功能是關閉的;當然如果在滿足上述前9條規則的前提下,且AS_Path是一模一樣(當然AS_Path不一樣,我們也可以使用命令忽略AS_Path不一樣的情況,強制開啟負載分擔;在bgp程式模式下使用load-balancing as-path-ignore來忽略as_path不一樣的情況;),我們可以視為對應路由為等價路由;可以使用命令開啟BGP負載分擔功能(在bgp程式下使用maximum load-balancing 2開啟負載分擔,預設只允許1路負載,最大支援8路負載);
BGP聚合方式對選路的影響
提示:預設情況下,如果手動聚合和自動聚合開啟了,對同一網路路由的聚合如果不是一樣,則手動聚合和自動聚合不衝突;如果自動聚合和手動聚合,聚合後的路由一模一樣,則手動聚合優先順序高於自動聚合;如上圖所示在RTB上開啟了自動聚合,同時也手動聚合200.0.0.0/24;此時手動聚合和自動聚合後的路由一模一樣,則優先通告手動聚合後的路由,對於自動聚合的路由不會通告給任何鄰居;
鄰居型別對BGP選路的影響
提示:如上圖所示,對於RTA來說,它從RTC通過EBGP學習到達200.0.0.0/24網路,同時也從RTB通過IBGP學習到達200.0.0.0/24的路由;此時RTA會優選通過EBGP鄰居型別學習到的200.0.0.0/24的路由;原因很簡單,因為RTB和RTA是IBGP鄰居;即在同一AS內;那麼對於同一AS內的路由器來說,路由更新只傳遞一跳,如果RTB從內部其他路由器學習到200.0.0.0/24的路由,此時是不會傳送給R他的;所以RTB能夠學習到達200.0.0.0/24網路的路由,肯定是從其他AS學習過來的;這樣一來,RTA從其他as直接學習到達200.0.0.0/24網路的路由,肯定優於RTB從其他AS學習到達200.0.0.0/24網路路由後,再次傳遞給RTA;所以BGP選路原則中對於同一目標網路來說,從EBGP鄰居學習到的路由要優於從IBGP鄰居學習到的路由;
AS內部IGP開銷對BGP選路的影響
提示:如上圖所示,針對200.0.0.0/24網路來說,RTA通過BGP能夠學習到達200.0.0.0/24網路的下一跳有兩個;在其他條件都一樣的情況下,此時內部asIGP的開銷是可以作為BGP選路的一個評判標準;如圖RTA如果走RTB,則對應鏈鋸的頻寬為50M,而走RTC則對應鏈路頻寬為100M;很明顯走RTC的鏈路更優;所以在其他條件都一樣的情況下,對比去往對應下一跳的開銷就作為選路的標準;即as內部IGP開銷越小,對應鏈鋸就更優,對應的BGP路由也就更優;
Router-ID與IP地址對BGP選路的影響
提示:如上圖所示,如果在優選值,本地優先順序,聚合方式,as_path,起源屬性,med以及內部IGP開銷對比都一樣的情況下;此時會對比對應路由的router-id;即傳送對應路由的路由更新路由器id,router-id最小被優選;如圖,對於RTA去往200.0.0.0/24的路由來說,在R他的BGP路由表中會有三個下一跳,一個是RTC,兩個為RTB(RTB和RTA建立兩個鄰居,所以對應下一跳也會有兩個);首先在三個下一跳中對比router-id,router-id小者被優選;所以RTC不會被優選(router-id大於RTB);但對於RTA來說,下一跳為12網段和21網段的router-id都是同一路由器,所以router-id一樣;此時比較ip地址,ip地址最小的被優選;所以對於RTA去往200.0.0.0/24網路的的最優路由是下一跳為10.1.12.2,而非10.1.21.2;原因就是10.1.12.2小於10.1.21.2;