HCNP Routing&Switching之BGP鄰居建立條件、優化和認證


  前文我們了解了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
View Code

  驗證:在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鄰居就會正常建立;一般情況建議兩邊都更改更新源;

  驗證:查看R1或R2上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
View Code

  驗證:在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上抓包

  提示:可以看到R1發送的包對應tcp上會有可選項,對應R2發送的包里沒有可選項;我們在R1上配置上認證以后,對應鄰居不會馬上斷掉,它會經過3個keepalived包周期,對應鄰居才會斷掉;

  在R2上配置bgp認證

  驗證鄰居關系

  提示:可以看到在R2上配置好認證以后,對應bgp鄰居就恢復正常;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM