不同AS之間使用非直連網絡建立鄰居需要修改對應封包的TTL值,原因是不同AS之間建立鄰居發送包的TTL值為1,如果不是直連,對應非直連經過路由以後,對應封包的TTL值會減為0,對端收到TTL值為0的包,會認為該包無效,是以會導緻鄰居關系建立不起來;如果一段修改了TTL值,另一端未修改,那麼會導緻鄰居關系非常不穩定,一會建立,一會斷開;通常情況下我們建議ibgp類型鄰居使用回環口建立鄰居,ebgp使用實體口建立鄰居;用回環口建立鄰居有一個好處就是對應回環口隻要ip位址不變,它幾乎都是up的,也就是說在同一as内,推薦使用回環口建立鄰居,因為回環口非常穩定;
前文我們了解了BGP相關概念、AS相關概念以及BGP鄰居類型、基礎配置等,相關回顧請參考https://www.cnblogs.com/qiuhom-1874/p/15370838.html;今天我們來聊一聊BGP建立鄰居的條件和優化相關話題;
BGP建立鄰居條件
我們知道動态路由協定能夠學習到路由,最基礎的就是建立鄰居;對于BGP來說,它工作在七層應用層,TCP179端口,是以兩個路由器要想建立BGP鄰居,首先滿足對應兩端的網絡可達;即鄰居位址可達;
其次,我們配置的鄰居位址所在AS号必須是鄰居配置中聲明的AS号;即本端配置鄰居AS号一定是對端鄰居所在AS号;
最後,也是BGP建立鄰居中最重要的一點,資料包源ip必須等于對方配置的鄰居ip,這個源IP也叫更新源,也将作為路由的下一條IP;即配置鄰居的ip位址,必須是鄰居發送三次握手的源ip位址;
提示:如上圖所示,本端配置鄰居ip位址10.1.1.2,首先本端會根據路由表查找去往10.1.1.2所在網絡的路由,這也是配置鄰居指定的ip位址,必須可達的原因;在路由表查找到對應路由的出接口後,對應路由器就會封裝封包,把出接口的ip位址封裝成對應資料包的源ip,把配置鄰居ip位址作為目标ip進行封裝,然後再從對應接口發送出去;在對端收到本端發送到TCP三向交握,隻有三次握手成功以後,後續才會發送open包,keepalived包,這樣鄰居才能正常建立;
BGP使用回環口建立鄰居
提示:如上圖所示,R3想要本端的3.3.3.3和R1的1.1.1.1建立鄰居,首先R3和R1之間3.3.3.3和1.1.1.1的路由要通,在路由通暢的情況下,R3會根據配置,将對應發送tcp三次握手的源ip更改為對應3.3.3.3接口,即更改更新源;然後封裝封包從對應實體接口發送出去;在對端收到對應封包以後,首先檢查該封包的源ip是不是本地配置的鄰居ip位址,如果不是,對應三次握手的封包會被R1拒絕;如果是,那麼對應三次握手就會進行下去;隻有建立起TCP三向交握以後,對應才會發送BGP open包,對應open包中會封裝ASN(as号碼),這個号碼就是指本端所在AS,即也是對端配置鄰居所在AS号;
實驗:如下拓撲,配置bgp使用回環口建立鄰居
分析:根據BGP鄰居建立條件,再結合上圖,R1和R2通過bgp建立ibgp類型鄰居,R2和R3建立ebgp類型鄰居;要想R1和R2建立起鄰居,首先R1的1.1.1.1的路由和R2的2.2.2.2的路由首先要互通,我們可以通過内部跑一個IGP路由協定(因為R1和R2在同一個AS内,可以使用IGP路由協定,互相學習對方的路由),讓R1和R2的路由互通;對于R2和R3,他們各屬于不同AS,通常情況下R2和R3要想建立鄰居,首先也是R2要有去往3.3.3.3的路由,R3也有去往2.2.2.2的路由,因為他們不屬于同一AS,是以不能跑IGP路由協定來學習路由;此時我們隻能手動配置靜态路由,讓R2的2.2.2.2和R3的3.3.3.3互通即可;
R1的配置
sys
sys R1
int g0/0/0
ip add 12.0.0.1 24
int lo 1
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
peer 2.2.2.2 as 12
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 2
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
peer 1.1.1.1 as 12
peer 3.3.3.3 as 3
驗證:在R1上驗證ospf鄰居和路由
提示:可以看到R1上ospf和R2的ospf建立起鄰居,對應鄰居關系為full狀态,并且在ip路由表中也學習到R2宣告的2.2.2.2的路由,說明R1有去往2.2.2.2的路由;
驗證:在R2上檢視ospf鄰居和ospf路由
提示:可以看到R2和R1也建立起ospf鄰居,對應鄰居狀态為full,R2也能正常學習到R1的1.1.1.1的路由,說明R1和R2上跑的ospf配置正常;
驗證:檢視R1或R2上bgp鄰居是否正常建立?
提示:可以看到R1上bgp鄰居2.2.2.2狀态是active,并非established,說明鄰居關系沒有建立起來;
在R1上抓包
提示:可以看到當R1向R2發起tcp三次握手時,R2的2.2.2.2拒絕了R1的請求;其實這是因為R1發送tcp三次握手的源ip位址不是R2配置的鄰居ip位址,是以R2收到12.0.0.1發來的三次握手請求,R2檢視對應鄰居清單中并沒有配置和12.0.0.1是鄰居,是以拒絕了R1的請求;同樣的道理R2向R1發起三次握手時,源位址為12.0.0.2,R1收到此類請求,檢視自己的鄰居清單中沒有12.0.0.2,是以也拒絕了R2的請求;
BGP更改更新源
在R1上更改發送tcp三次握手的源ip位址為lo1的接口位址
提示:上述指令表示和2.2.2.2建立鄰居使用回環接口1的ip位址作為源ip位址,進行tcp三次握手包封裝;
驗證: 在R1上抓包,看看對應源ip位址是否更改為lo1 的接口位址1.1.1.1了呢?
提示:可以看到R1此時發送tcp三次握手的源ip位址為lo1接口的ip位址,對應三次握手也正常通過;其實在一端配置更新源以後,對應bgp鄰居就會正常建立;一般情況建議兩邊都更改更新源;
在R2上配置更改更新源
提示:如果之前建立起鄰居,配置更改更新源,會導緻鄰居斷掉;其原因是R2此時會以新的更新源封裝tcp三次握手包的源ip;如下所示
提示:可以看到R2配置上更新源以後,對應R2會以lo2接口ip位址作為源ip發送tcp三次握手包,然後再次重建立立鄰居;
通過上述實驗可以看到,更新源必須等于對端配置的鄰居ip位址,如果兩者不相同,這鄰居建立不起來;使用回環口建立鄰居,需要将更新源更改為對應回環接口ip位址;更改一段即可建立起bgp鄰居,但通常建議兩端都更改更新源;
R3的配置
sys
sys R3
int g0/0/0
ip add 23.0.0.3 24
int lo 3
ip add 3.3.3.3 32
ip route-s 2.2.2.2 32 23.0.0.2
bgp 3
peer 2.2.2.2 as 12
驗證:在R2、R3上檢視是否有去往對端回環接口ip路由?
提示:可以看到R2上有去往3.3.3.3的路由,R3上也有去往2.2.2.2的路由;
在R2上更改更新源
在R3上更改更新源
驗證:在R2上或R3上檢視bgp鄰居是否正常建立?
提示:在R3上檢視bgp鄰居,對應和2.2.2.2鄰居關系為idle,為什麼不是established呢?
在R2上檢視bgp鄰居
提示:在R2上檢視對應鄰居關系也是idle;
在R2或R3上抓包
提示:在R2的g0/0/1口可以抓到對應源ip為2.2.2.2向3.3.3.3發起三次握手請求,對應三次握手也是通過了,對應3.3.3.3、2.2.2.2也發送了open包,心跳包為什麼鄰居關系建立不起來呢?對比之前我們抓到的正常鄰居關系包裡,我們可以看到在心跳包後面多了notification包,然後後續就tcp4次揮手,斷掉了;
提示:從上面的抓包内容中可以看到,不管是R2還是R3在發送的心跳包,open包,對應ttl值為1;之是以R2和R3建立起鄰居以後,馬上就斷了,其原因就是因為R2發送到包ttl為1;我們知道TTL的值是每經過一次路由以後,對應值減1;在R2的g0/0/1收到R3發送到TTL值為1 的封包,對應封包經過R2路由以後,對應R2的回環口收到此包的TTL就變為0;對于TTL為0的封包,路由器會認為該包無效,是以鄰居馬上斷掉;同樣的道理R2向R3發送到包也是經過R3路由以後,對應Rf3的lo3收到的包,對應TTL也為0,是以R3也會發送notification包,然後對應鄰居馬上斷掉;
BGP多跳技術
為了解決BGP使用回環口建立ebgp類型鄰居,我們可以修改對應封包的TTL值實作鄰居關系的建立;
在R2上修改TTL值為2,看看對應鄰居是否正常建立?
在R2上抓包驗證,看看對應發送到包是否TTL值修改為2 了?
提示:可以看到此時R2發送的open包對應TTL值為我們指定的值;但是鄰居還是沒有建立;
提示:在R2的終端中,我們一會就會收到說對應鄰居狀态從established轉變為idle;說明我們的鄰居關系非常的不穩定;這裡的原因是R3發送的包中TTL值為1,到R2的lo2接口對應TTL值變為0導緻鄰居關系一會建立,一會斷掉;
在R3上更改TTL值為255
提示:預設指令後面不跟任何數字,預設就是将對應TTL修改為255;
驗證:在R3上抓包檢視,對應發送的封包TTL值是否修改為255?
提示:可以看到對應R2發送的包TTL值為2,R3發送的包TTL值為255;
驗證:檢視bgp鄰居是否正常建立?
提示:可以看到鄰居關系現在為穩定狀态established;
通過上述實驗可以看到不同AS之間使用非直連網絡建立鄰居需要修改對應封包的TTL值,原因是不同AS之間建立鄰居發送包的TTL值為1,如果不是直連,對應非直連經過路由以後,對應封包的TTL值會減為0,對端收到TTL值為0的包,會認為該包無效,是以會導緻鄰居關系建立不起來;如果一段修改了TTL值,另一端未修改,那麼會導緻鄰居關系非常不穩定,一會建立,一會斷開;通常情況下我們建議ibgp類型鄰居使用回環口建立鄰居,ebgp使用實體口建立鄰居;用回環口建立鄰居有一個好處就是對應回環口隻要ip位址不變,它幾乎都是up的,也就是說在同一as内,推薦使用回環口建立鄰居,因為回環口非常穩定;
BGP身份認證
在R1上配置認證
提示:BGP配置認證以後,對應發送的所有包都會啟用,即bgp認證是在TCP上做的,并非在專有BGP封包上;
提示:可以看到R1發送的包對應tcp上會有可選項,對應R2發送的包裡沒有可選項;我們在R1上配置上認證以後,對應鄰居不會馬上斷掉,它會經過3個keepalived包周期,對應鄰居才會斷掉;
在R2上配置bgp認證
驗證鄰居關系
提示:可以看到在R2上配置好認證以後,對應bgp鄰居就恢複正常;
作者:Linux-1874
出處:https://www.cnblogs.com/qiuhom-1874/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.