HCNP Routing&Switching之BGP防環機制和路由聚合
- 2021 年 10 月 25 日
- 筆記
- AS內(IBGP)防環機制, AS間(EBGP)防環機制, BGP, BGP手動路由聚合, BGP自動路由聚合, BGP路由聚合, BGP防環機制, BGP靜態路由聚合, HCNP Routing&Switching, 解決水平分割帶來的路由學習不完整方案
前文我們了解了BGP路由宣告相關話題,回顧請參考//www.cnblogs.com/qiuhom-1874/p/15440860.html;今天我們來聊一聊BGP防環機制和路由聚合相關話題;
BGP防環機制
我們知道BGP的鄰居類型分IBGP和EBGP,對於不同類型鄰居關係,它們宣告路由的規則各有不同,對於鄰居類型為IBGP,它們宣告路由只會傳遞一跳;對於鄰居類型為EBGP,它們宣告路由是可以傳遞多跳和IGP傳遞路由相似,同時IBGP傳遞路由時,它們不會更改更新源,即宣告者是誰,對應學習的路由下一跳就是誰,我們可以通過命令強制修改更新源為自己,即對端學習到相關路由的下一跳指向自己;對於EBGP來說,EBGP之間傳遞路由,會自動修改更新,即從哪裡學習到對應路由,其下一跳會自動修改為對端;對於BGP防環來說,我們也是從兩種鄰居類型分別來討論;
AS內(IBGP)防環機制
水平分割,從IBGP收到的更新不會發布給IBGP(IBGP更新只傳遞一跳)
提示:如上圖所示,對於在同一AS內的4個路由器,RTA,RTB,RTC,RTD,它們手拉手建立鄰居,對於RTA發布的更新,對於RTD來說它是學習不到的,原因是IBGP鄰居關係,對應更新只傳一跳;同樣的道理,RTD發布更新,RTA也是學習不到的,對於RTB和RTC來說,是能夠正常學習到;
解決水平分割帶來的路由學習不完整方案
1、IBGP鄰居全互聯
提示:如上圖所示,RTA,RTB,RTC,RTD兩兩相互建立鄰居,這樣實現鄰居全互聯,不管哪個路由器發布更新,對應其他路由器都能夠收到更新;這樣雖然理論上解決了水平分割帶來的路由學習不完整,但同時這樣也給管理員帶來很多不便,比如我們要增加一台路由,對應所有路由器都要更改配置,這樣配置和維護的開銷太大;一般路由器眾多的情況下不推薦使用這樣方式;
2、路由反射器(Route Reflector)
提示:路由反射器(Route Reflector),這個技術有點類似ospf里的DR;即在一個AS內,其中一台路由器作為路由反射器RR(Route Reflector),其它路由器作為客戶端(Client)與路由反射器之間建立IBGP連接。路由反射器在客戶機之間傳遞(反射)路由資訊,而客戶端之間不需要建立BGP連接。這樣一來相比全互聯就大大簡化了配置和維護上的開銷;
3、聯盟(confederation)
提示:聯盟就是將一個大的AS分割成多個小的AS,AS之間建立EBGP鄰居,從而實現一個路由器發布更新,能夠傳遞個其他所有路由器(其他小AS之間建立EBGP);
AS間(EBGP)防環機制
AS間建立的都是EBGP鄰居,它的防環機制主要依靠AS_PATH這個屬性,as_path是BGP更新內的一個重要屬性,它主要用來描述一條路由所經過的AS;如果接受路由器發現AS_PATH里有與本地AS號,則對應路由就會被丟棄;
提示:如上圖所示,RTB發送一條更新,對應AS_PATH就會記錄對應的AS號,對應RTC收到RTB的更新,首先要看看AS_PATH里是否有自己as號,如果沒有則接受此更新,如果有就丟棄;RTC接受了RTB的更新後,它會繼續向它的其他EBGP發送此更新,即RTC會向RTA和RTB發送此更新;同樣的道理RTA和RTB都會檢查對應更新中as_path里是否有自己的as號,如有,則丟棄,如果沒有則接收;這樣一來發出去的路由就不可能回到發出更新路由器所在as,即環路也就無法產生;
總結:BGP的防環機制主要從兩種鄰居類型來說,對於IBGP來說,主要依靠水平分割機制,即IBGP間,路由更新只傳遞一跳;對於EBGP來說,主要依靠AS_Path這個屬性來防止環路,即收到路由更新的BGP路由器,發現AS_Path 里有自己的AS號,則對應路由會被丟棄;
BGP路由聚合
BGP的路由聚合有三種方式,分別是靜態聚合、自動聚合和手動聚合;聚合的目的就是精簡路由表,從而優化路由器的性能;
BGP靜態路由聚合
所謂靜態聚合是指我們手動在BGP路由器上手動配置一條聚合後的靜態路由,其出介面指向NULL0口,然後在通過network在BGP里進行宣告;我們知道對於BGP路由宣告規則中,對應宣告的路由必須存在路由表才可以被宣告;為了解決這樣的限制,我們手動配置一條聚合後的靜態路由,這樣一來就解決了路由不存在路由表的限制,然後通過network宣告聚合後的路由即可;其他路由器收到的更新就只有聚合後的路由,從而實現路由聚合;
BGP自動路由聚合
BGP自動路由聚合,只能對引入的IGP路由進行主類掩碼聚合,而原引入的明細路由被抑制,不會被有選和發布給BGP鄰居;開啟自動聚合命令summary automatic;
BGP手動路由聚合
手動路由聚合是指通過命令對引入和本地路由進行聚合,聚合命令aggretage;優先順序順序是手動聚合大於自動聚合;
實驗:如下拓撲配置BGP,分別對明細路由進行靜態路由聚合、自動路由聚合和手動路由聚合;
R1的配置


sys sys R1 int g0/0/0 ip add 12.0.0.1 24 int lo 1 ip add 172.16.0.1 24 int lo 2 ip add 172.16.1.1 24 int lo 3 ip add 172.16.2.1 24 int lo 4 ip add 172.16.3.1 24 int lo 11 ip add 1.1.1.1 32 ospf 1 router-id 1.1.1.1 area 0 net 12.0.0.1 0.0.0.0 net 1.1.1.1 0.0.0.0 bgp 12 router-id 1.1.1.1 peer 2.2.2.2 as 12 peer 2.2.2.2 con lo 11
View Code
R2的配置


sys sys R2 int g0/0/0 ip add 12.0.0.2 24 int g0/0/1 ip add 23.0.0.2 24 int lo 22 ip add 2.2.2.2 32 ospf 1 router-id 2.2.2.2 area 0 net 12.0.0.2 0.0.0.0 net 2.2.2.2 0.0.0.0 ip route-s 3.3.3.3 32 23.0.0.3 bgp 12 router-id 2.2.2.2 peer 1.1.1.1 as 12 peer 1.1.1.1 con lo 22 peer 3.3.3.3 as 3 peer 3.3.3.3 con lo 22 peer 3.3.3.3 ebgp-max-hop
View Code
R3的配置


sys sys R3 int g0/0/0 ip ad 23.0.0.3 24 int lo 33 ip add 3.3.3.3 32 int lo 1 ip add 192.168.0.1 24 int lo 2 ip add 192.168.1.1 24 int lo 3 ip add 192.168.2.1 24 int lo 4 ip add 192.168.3.1 24 ip route-s 2.2.2.2 32 23.0.0.2 bgp 3 router-id 3.3.3.3 peer 2.2.2.2 as 12 peer 2.2.2.2 con lo 33 peer 2.2.2.2 ebgp-max-hop
View Code
驗證BGP鄰居狀態
提示:可以看到BGP鄰居都正常建立起來;
在R1上使用靜態聚合的方法將172.16網段路由聚合後宣告
1、創建聚合後的靜態路由,出介面指向NULL 0 口
2、通過network在bgp里宣告聚合後的路由
驗證:在R2和R3上查看bgp路由表,看看是否學習到R1聚合後的路由呢?
提示:可以看到R2和R3上都能正常學習到R2聚合後的路由;不同的是R2學習聚合後的路由其下一跳指向R1,而R3學習到聚合後的路由下一跳指向R2,原因是R2和R3是EBGP類型鄰居,在同步路由時會自動修改更新源為自己,即下一跳會自動修改為自己;
在R1上使用自動聚合的方法將172.16網段路由聚合
在R1上取消將172.16網段聚合後在bgp里宣告
在R1上開啟自動聚合
提示:開啟自動聚合時,系統會提示我們自動聚合只能對引入的路由進行聚合,本地宣告的路由是不能聚合的;
驗證:在R1上將172.16網段路由引入至BGP
驗證:在R1上查看引入的路由
提示:可以看到開啟自動聚合後,對應引入的172.16網段路由,自動被聚合為172.16.0.0/16,而明細路由被抑制;
驗證:在R2和R3上查看bgp路由表,看看是否學習到R1自動聚合後的路由呢?
提示:可以看到R2和R3都能正常學習到R1自動聚合後的路由;
在R3上使用手動聚合聚合192.168網段路由
1、將直連路由引入只bgp
驗證:查看R3bgp路由表,看看192.168網段路由是否引入至BGP
提示:可以看到192.168.網段路由已經引入至BGP;
2、手動聚合192.168網段路由
驗證:查看bgp路由表,看看對應明細路由是否被聚合?
提示:可以看到bgp路由表中多了一條被聚合後端路由;但明細路由沒有被抑制;這是因為默認情況下,手動聚合明細路由不會被抑制;必須手動使用detail-suppressed參數來抑制明細路由;
使用detail-suppressed參數來抑制明細路由
驗證:查看bgp路由表,看看明細路由是否被抑制?
提示:可以看到加了detail-suppressed參數以後,對應明細路由就被抑制了;
驗證:在R2和R1上查看bgp路由表,看看是否學習到R3手動聚合的路由呢?
提示:可以看到R1和R2都能正常學習到R3手動聚合後的路由,但R1上不可用,原因是R3沒有去往3.3.3.3的路由;解決辦法在R2上開啟修改更新源為自己;
在R2上開啟修改更新源為自己
驗證:在R1上查看bgp路由表,看看對應路由是否可用?
提示:可以看到現在R1學習到192.168.0.0/22的路由是可用最優狀態;
as-set參數:保留原有as號碼屬性;該參數主要用來防止環路產生;默認情況下手動聚合路由後,它會以本端為起始點向周圍鄰居宣告,對應as號碼是本端bgp路由器所在as號,這樣一來就可能產生環路;如上,我們不在R3上手動聚合路由,只是在R3上引入路由,然後在R2上做手動聚合,看看對應聚合後的路由是否會照常發送給R3呢?
在R3上取消手動路由聚合
在R2上驗證看看是否正常學習到R3引入的直連路由呢?
提示:可以看到R3引入的路由R2能夠正常學習到;
在R2上做手動路由聚合,並抑制明細路由
驗證:查看R2bgp路由表,看看是否生成了聚合後的路由?明細路由是否被抑制?
提示:可以看到在R2上生成了一條聚合後的路由,對應明細路由也都抑制了;
驗證:在R1上查看bgp路由表,看看是否正常學習到R2聚合後的路由?
提示:可以看到現在R1學習到底192.168.0.0/22這條路由,對應的沒有記錄as號,說明這條路由是有同一as內部的其他路由器發布;和剛才看到的不一樣,剛才R3手動聚合,對應R1學習到的路由,對應as號為3,而現在沒有了;很顯然不應該這樣;
再來看看R3是否學習到R2手動聚合後的路由呢?
提示:可以看到R3也正常學習到R2手動聚合後的路由;對應as號為12;本來是R3發布的明細路由,被R2聚合後變為了再次發給了R3,這很不合理呀,正常情況R3是始發地,就不應該收到R2聚合後的路由;解決辦法,在R2上做路由聚合時,加上as-set參數,保留原有as號
在R2上手動聚合加上as-set
驗證:在此在R3上查看bgp路由表,看看R2聚合後的路由是否會被收到呢?
提示:可以看到R3現在就沒有接收R2發布的聚合後的路由,原因是R2發布的聚合後的路由中as_path里包含R3的as號,所以對應路由會被R3丟棄;
驗證:在R2上查看192.168.0.0/22這條路由通告給那些路由器,是否有R3在內呢?
提示:可以看到R2是通告給R3,只不過R3查看對應路由里as-path里包含自己所在as,所以R3拒絕接收R2發布的聚合後的路由;
驗證:在R1上查看對應路由,看看對應路由現在as號是多少?
提示:現在可以看到R1學習到的路由和R3發布手動聚合的路由一樣,對應path屬性為3,這說明該條路由的始發地as號為3,而非本地其他路由器;