天天看點

華為路由器之BGP路由技術總結及配置指令

一、BGP的概念:

BGP(Border Gateway Protocol,邊界網關協定)是一個距離矢量路由協定,和傳統的基于下一跳的IGP協定不同,它是基于AS(自治系統)的協定。BGP屬于外部網關路由協定,它解決的是AS之間的選路問題,也正是這樣,它更适合用于網際網路。BGP的關鍵在于了解BGP的封包,鄰居的建立、BGP路由屬性、選路原則等。

.

1、自治系統是什麼?

自治系統(autonomous system,簡稱“AS”),是由同一個技術管理機構管理,使用統一選路政策(運作同一動态路由協定)的一組路由器的集合。自治系統的編号取值範圍是165535。其中164511是網際網路上注冊的公有AS号類,類似于公有IP位址,是全球唯一且不可重複使用的;64512~65535是私有AS号,類似于私有IP位址,可以重複使用但是網際網路上不可見。

.

2、動态路由分類

動态路由協定有很多分類方法,按自治系統分類、按協定類型分類是最常用的兩種。

按自治系統分類:

IGP:内部網關路由協定,主要包含RIP、OSPF、ISIS、EIGRP(思科私有協定)。IGP路由協定運作在AS内部,解決的是AS内部的選路問題。主要作用是發現、計算路由。

EGP:外部網關路由協定,通常就是指BGP,它運作在AS與AS之間,解決的是AS之間的選路問題。BGP的主要作用是控制路由條目的傳播和選擇最優路由。

一般會先使用IGP協定在自治系統内部計算和發現路由條目,再通過BGP協定将IGP協定産生的路由傳遞至其他的AS(自治系統)。

3、BGP的特征

BGP解決的是AS之間的路由學習問題,當今網際網路是全球互聯,在中國,網際網路營運商有移動、電信和聯通。每個公司都有自己的自治系統,并且内部運作IGP協定。但是網際網路又要求互聯,是以通過BGP就可以在電信和聯通等之間學習對方的AS内部路由,使電信和聯通的使用者之間互相通信。

BGP具有以下特征:

傳輸協定:TCP,端口号179

BGP是外部路由協定,用來在AS之間傳遞路由資訊

是一種增強的路徑矢量路由協定

擁有可靠的路由更新機制

具備豐富的Metric(一種度量标準)度量方法

無環路協定設計

為路由條目附帶多種屬性資訊

支援CIDR(就是支援子網劃分後位址域間選路)

豐富的路由過濾和路由政策

無需周期性更新

路由更新時隻發送增量路由

周期性發送KeepAlive(保活)封包以保持 TCP連通性

二、BGP的工作原理

BGP是跨公網、跨AS(自治系統)的路由協定,可以在AS之間學習路由。BGP的動态學習路由也是基于鄰居,隻有鄰居關系正常,BGP才可以正常工作。

.

1、BGP鄰居關系

運作BGP的路由器通常被稱為BGPSpeaker(發言者),互相之間傳遞封包的speaker之間互稱為對等體(peer)。BGP鄰居關系的建立、更新和删除是通過對等體之間的5種封包、6種狀态機和5個表等資訊來完成,最終形成BGP鄰居。

(1)BGP封包類型及作用:

BGP封包頭中的type定義了BGP的封包類型。BGP對等體之間通過5種封包進行路由資訊的互動,5種封包分别有:Open、Update、Notification、KeepAlive和Route-Refresh。

.

  • Open封包:是TCP連接配接建立後發送的第一個封包,用于建立BGP對等體之間的連接配接關系,主要包括BGP版本、本地AS編号、Holdtime(維持時間)等資訊。
  • update封包:update封包用來在BGP對等體之間更新路由資訊,update封包可以通告多條屬性相同的可達路由資訊,也可撤銷多條不可達路由資訊。
  • Notification封包:當BGP檢測到錯誤狀态時,立刻向對等體發出Notification封包,之後BGP連接配接就會立即中斷。不管目前BGP狀态處于何種狀态,隻要收到Notification封包就會傳回idle狀态。
  • Route-Refresh封包:用來告知對等體本地所支援路由的重新整理能力,在所有BGP路由器擁有Route-Refresh能力的情況下,如果BGP入口路由政策發生了變化,本地BGP路由器會向對等體發送Route-Refresh封包,收到此消息的對等體會将其路由資訊重新發給本地BGP路由器。
  • KeepAlive封包:該封包在對等體之間周期性發送,用以保持連接配接的有效性,類似于OSPF協定中的hello包。

(2)BGP狀态:

BGP狀态描述的是BGP鄰居的建立過程,BGP狀态共有六種,分别是Idle(空閑)、Connect(連接配接)、Active(活動)、OpenSent(打開發送)、OpenConfirm(打開确認)和Established(建立成功)。

.

  • Idle狀态:BGP拒絕任何進入的連接配接請求,Idle狀态是BGP的初始狀态。
  • Connect狀态:該狀态下,BGP等待TCP連接配接的建立完成後在決定後續操作。
  • Active狀态:該狀态下,BGP将嘗試進行TCP連接配接的建立,是BGP的中間狀态。
  • OpenSent狀态:該狀态下,BGP等待對等體的Open封包,并對收到的Open封包中的AS号、版本号、Holdtime等進行檢查。
  • OpenConfirm狀态:在該狀态下,BGP等待KeepAlive或Notification封包。
  • Established狀态:在該狀态下,BGP可以在對等體之間交換所有封包,也是BGP正常工作的狀态。

    .

    在BGP對等體建立的過程中,通常可見的三種狀态是Idle、Active、Established。BGP對等體雙方的狀态必須都為Established,BGP鄰居關系才能成立,雙方通過Update封包交換路由資訊。

    (3)BGP資料庫:

BGP資料庫是BGP正常工作所需要的存儲空間,基于儲存的内容不同,可分為以下幾種:

IP路由表(IP-RIB):全局路由資訊庫,包括所有最優的IP路由資訊。

BGP路由表(Loc-RIB):BGP路由資訊庫,包括本地BGP Speaker通告的路由資訊,将其中最優路由添加到IP路由表中。注意:先要關注BGP路由表、若BGP路由表中不是最優路由,則無法在IP路由表中可見。

鄰居表:對等體鄰居清單清單,包括對等體兩端的鄰居資訊即鄰居清單。

Adi-RIB-In:對等體宣告給本地Speaker的未處理的路由資訊庫。

Adj-RIB-Out:本地Speaker宣告給指定對等體的路由資訊庫。

(4)BGP鄰居關系類型:

在BGP中大緻可分為兩種鄰居關系:IBGP鄰居和EBGP鄰居。

.

  • IBGP:同一個AS内部的BGP鄰居關系,IBGP鄰居通常是指運作BGP協定的對等體兩端均在同一個AS域内,屬于同一個BGP AS内部。
  • EBGP:AS之間的BGP鄰居關系,EBGP鄰居通常是指運作BGP協定的對等體兩端分别在不同的AS内。

BGP鄰居的AS号和本端的AS号相同就為IBGP(鄰居),不同就是EBGP鄰居。

.

IGP(内部網關協定,如OSPF)建立鄰居一般要求三層裝置直連,并且通過廣播或多點傳播建立鄰居關系。而BGP(外部網關協定)的鄰居關系是基于TCP的,也就是說隻要讓TCP/IP可達,無論是否直連,BGP對等體彼此之間就可以建立鄰居關系。是以BGP建立鄰居之前首先要考慮的就是對等體之間的路徑可達(是否存在路由,可以ping通)。務必要通過IGP或者靜态路由使對等體兩端互通。

2、通告BGP路由的方法

BGP路由是通過BGP指令通告而成的,而通告BGP路由的方法有兩種:network和Import。

(1)network方式:

.

使用network指令可以将目前裝置路由表中的路由(非BGP)釋出到BGP路由表中并通告給鄰居,和OSPF中使用network指令的方式大同小異,隻不過在BGP宣告時,隻需要宣告網段+掩碼數即可,如:network 12.12.0.0 16。

(2)Import方式:

.

使用Import指令可以将該路由器學到的路由資訊重分發到BGP路由表中,是BGP宣告路由的一種方式,可以引入BGP的路由包括:直連路由、靜态路由及動态路由協定學到的路由。其指令格式與在RIP中重分發OSPF差不多。

3、BGP對等體的互動原則

BGP裝置會将最優路由加入BGP路由表,形成BGP路由。BGP裝置與對等體建立鄰居關系後,采用以下互動原則:

從IBGP對等體獲得的BGP路由,BGP裝置隻傳遞給它的EBGP對等體。

從EBGP對等體獲得的BGP路由,BGP裝置傳遞給它所有EBGP和IBGP對等體(對等體是IBGP隻能傳遞一跳,對等體是EBGP則不限制)

當存在多條到達同一目的位址的有效路由時,BGP裝置隻将最優路由釋出給對等體

路由更新時,BGP裝置隻發送更新的BGP路由

所有對等體發送的路由,BGP裝置都會接收

所有EBGP對等體在傳遞過程中下一跳改變

所有IBGP對等體在傳遞過程中下一跳不變(需要特别注意)

預設EBGP傳遞時 TTL值為1(需要特别注意)

預設IBGP傳遞時 TTL值為255

4、更新源建立鄰居關系

這個概念說白了就是在指定對等體時,使用對方的loopback口,因為該接口比任何實體接口都要穩定,隻要裝置在運作,loopback口就不會關閉,隻要有一條鍊路可以和對方的loopback位址通信,就不會造成BGP狀态的改變,若使用實體接口,一旦這個實體接口down掉,那麼BGP也就完了,是以這種使用loopback口建立BGP鄰居的方法稱為更新源建立鄰居,通常會在同一個AS内使用備援鍊路來確定BGP的穩定性。(若在不同AS内使用對端路由器的loopback位址來建立鄰居關系,需要改變兩個路由器上的TTL值,具體解釋請參考博文末尾的配置總結)

華為路由器之BGP路由技術總結及配置指令

如在上圖中,三個路由器同在AS 100區域中,若R1和R3要使用更新源建立鄰居關系,那麼配置如下:

R1路由器:

[R1]bgp 100              <!--設定BGP編号為100-->
[R1-bgp]router-id 1.1.1.1 
<!--配置該路由器本身的route ID,該位址一般為loopback接口位址-->
[R1-bgp]peer 3.3.3.3 as-number 100    
<!--指定對端的loopback位址,“100”是對端路由器所在的BGP編号-->
[R1-bgp]peer 3.3.3.3 connect-interface LoopBack0   
<!--指明對端的這個位址是哪個loopback接口,這裡是loopback接口 0-->
           

R3路由器(相關指令解釋參考R1路由器的配置):

[R3]bgp 100                     
[R3-bgp]router-id 3.3.3.3               
[R3-bgp]peer 1.1.1.1 as-number 100                 
[R3-bgp]peer 1.1.1.1 connect-interface LoopBack0             
           

**注意:**本地loopback接口先要讓對等體可達(就是可以ping通對方的loopback位址),需要手動添加對等體環回接口的路由條目或者使用OSPF、RIP等自動學習對方環回接口的路由。

5、保證IBGP下一跳可達

在AS邊緣的BGP裝置,會接收到它的EBGP對等體鄰居傳遞過來的BGP路由資訊。上面說過:所有EBGP對等體在傳遞過程中下一跳改變, 所有IBGP對等體在傳遞過程中下一跳不變。上個圖來直覺的說一下:

華為路由器之BGP路由技術總結及配置指令

圖中,用A——J分别來代替路由器的接口IP位址,結合所有EBGP對等體在傳遞過程中下一跳改變, 所有IBGP對等體在傳遞過程中下一跳不變這個結論,可以看到圖中存在什麼問題(自己看圖了解吧,是在是懶癌晚期,不想解釋了),就是圖中R3路由器以後的路由器收到的路由條目中的下一跳是錯誤的,解決辦法就是在R3和R5路由器上對R4和R6宣稱下一跳為它自己,然後就會發現,R4學到的下一跳位址是E。R6學到的下一跳就是I。這隻是解決了R1宣告路由時出現的問題,那麼如果現在R6又宣告了一條路由,就還需要在R4和R2路由器上對R3和R1宣稱下一跳為它自己。這樣才算保證了IBGP的下一跳可達。

.

配置如下(就拿一個路由器來舉例,前三條配置指令的解釋可以參考上面的注釋,主要是最後一條指令,來改變路由的下一跳):

[R3]bgp 200
[R3-bgp]router-id 3.3.3.3
[R3-bgp]peer 34.1.1.4 as-number 200   <!--34.4.4.4是R4的位址,用來和R4建立鄰居關系-->
[R3-bgp]peer 34.1.1.4 next-hop-local              
<!--這條指令用來改變向鄰居傳遞路由時,宣稱所有傳給鄰居的路由條目,下一跳都是自己-->
           

6、EBGP多跳

這個好了解,由于預設BGP中EBGP鄰居之間的TTL值為1,(TTL,資料包的生命周期值,每經過一個路由器該值會-1,當該值為0後,資料包将會被丢棄)。若EBGP對等體非直連(通信時需要經過一個以上的路由器,TTL值就不夠用了),TTL值限制會使非直連的對等體無法正常建立鄰居關系,是以需要用EBGP多跳的指令來解決非直連的鄰居關系。如下圖,若不配置EBGP多跳,那麼R1和R3将無法正常建立鄰居關系:

華為路由器之BGP路由技術總結及配置指令

配置上圖中的R3路由器多跳(R1路由器也需要進行類似的配置,進而改變TTL值,這裡隻拿R3為例):

R3 配置如下:

[R3]bgp 200
[R3-bgp]router-id 3.3.3.3
[R3-bgp]peer 12.0.0.1 as-number 100
[R3-bgp]peer 12.0.0.1 ebgp-max-hop 2             <!--指明跳數為2,也就是TTL值為2-->
           

7、控制BGP選路

BGP協定包含很多路由屬性,這些屬性可以非常靈活的控制BGP的選路。

.

BGP的屬性分為共有必遵,公認任意、可選過渡可選非過渡四大類,如下表為BGP的屬性及對應的分類:

華為路由器之BGP路由技術總結及配置指令

(1)公有必遵:所有BGP路由器都可以識别,且必須存在update封包中。

(2)公有任意:所有BGP路由器都可以識别,但不要求必須存在于update封包中,可以根據具體情況來決定是否添加到Update封包中。

(3)可選過渡:BGP路由器可以選擇是否在Update封包中攜帶這種屬性。接收的路由器如果不識别這種屬性,可以轉發給鄰居路由器(這就是過渡的含義),鄰居路由器可能會識别并使用這種屬性。

(4)可選非過渡:BGP路由器可以選擇是否在Update封包中攜帶這種屬性。在整個路由釋出的路徑上,如果部分路由器不能識别這種屬性,可能會導緻該屬性無法發揮作用。因為接收的路由器如果不識别這種屬性,将丢棄這種屬性,而不再轉發給鄰居路由器。

BGP屬性的介紹:

.

BGP常用的屬性有:Origin、AS-PATH、Next-Hop、Local-Perf和MED等。

.

**(1)Origin(起源)屬性:**屬于公有必遵,用來定義路徑資訊的來源,其作用是标記一條路由是怎麼成為BGP路由的。它有以下三種類型:

IGP(I):優先級最高,通過Network指令注入BGP路由表的路由,其Origin屬性為IGP。

EGP(e):優先級次之。通過EGP得到的路由資訊,其Origin屬性為EGP。

Incomplete(?):優先級最低。通過其他方式學習到的路由資訊。如BGP通過Import-route指令重分發引入的路由,其Origin屬性為Incomplete。可以使用 display bgp routing-table 指令檢視,将顯示在最後一列,其列名是Path/Ogn

.

**(2)AS-PATH(AS路徑)屬性:**該屬性按照矢量順序記錄某條路由從本地到目的位址要經過的所有AS編号,在接受路由時,裝置如果發現AS-PATH清單中有本AS号,則不接收該路由,進而避免了AS間的路由環路。

若在檢視BGP路由表時,看到了AS編号,如(100,200,300),則表示該路由條目是經過了AS300、AS200和AS100傳播到本裝置,其中AS100是離本裝置最近的AS。

.

**(3)Next-Hop(下一跳)屬性:**又回到保證IBGP下一跳可達這個問題了,這麼說吧,在前面提到的保證IBGP下一跳可達,就是利用了Next-Hop屬性,不解釋了。

.

**(4)Local-Perf屬性:**用來辨別BGP路由的優先級,,用于判斷流量離開AS時的最佳路由。當BGP的裝置通過不同的IBGP對等體得到目的位址相同但是下一跳不同的多條路由時,将選擇優先級Local-Perf屬性值較高的路由。Local-Perf屬性僅在IBGP對等體之間有效,不會通告給其他AS,本地優先級在AS内部傳遞,數值越高越優先。預設優先級為100,可以手動更改。下面是我在網上找到的一個配置圖(可以使用ACL來定義一些流量,也可以直接修改本地的優先級,下圖是基于ACL來對不同網段設定不同的優先級)。

華為路由器之BGP路由技術總結及配置指令

**(5)MED屬性:**用于判斷流量進入鄰居AS時的最佳路由,當一個運作BGP的裝置通過不同的EBGP對等體得到目的位址一樣但是下一跳不同的多條路由時,在其他條件相同的情況下,将選擇MED 值較小者作為最佳路由,用來改變下遊的選路。

MED屬性僅在相鄰兩個AS之間傳遞,收到此屬性的AS一方不會再将其通告給其他任何第三方AS。MED屬性可以手動配置,預設為0,具體配置看圖吧:

華為路由器之BGP路由技術總結及配置指令

在RT3上配置如下可以控制AS200中兩個路由器的選路:

華為路由器之BGP路由技術總結及配置指令

8、BGP的選路原則

BGP 選路原則

(1)若去往目的網絡的路由下一跳不可達,則可以忽略此路由

(2)Preferred-Value優先級以數值高的路由優先

(3)Local-Preference優先級以數值高的路由優先

(4)聚合路由優先級高于非聚合路由

(5)本地手動聚合路由的優先級高于本地自動聚合的路由

(6)本地通過Network指令引入的路由的優先級高于本地通過Import-route指令引入的路由

(7)AS路徑長度最短(最少個數)的路徑優先級高

(8)比較Origin屬性,IGP優先級高于EGP,EGP優先級高于Incomplete

(9)選擇MED優先級較小的路由

(10)EBGP路由優先級高于IBGP路由

(11)BGP優先選擇到BGP下一跳的IGP度量低的路徑

當以上全部相同,則為等價路由,可以負載分擔(注:AS-PATH必須一緻),當負載分擔時,以下3條原則無效

(12)比較Cluster-List長度,短者優先

(13)比較Originator_ID(如果沒有Originator_ID,則用Router ID比較),選擇數值較小的路徑

(14)比較對等體的IP位址,選擇IP位址數值最小的路徑

三、BGP的配置執行個體

上面的BGP理論啰嗦了那麼多,其實真正的配置倒很簡單(這也符合網絡的特色),來個實驗圖配置一下吧!

網絡拓撲如下:

華為路由器之BGP路由技術總結及配置指令

需求如下:

1、AS 200内部使用OSPF協定使AS 200内部互通,并在AS 200内部各個路由器上都運作BGP協定(R1和R2、R3建立鄰居關系,R4和R2、R3及R5建立鄰居關系,),各個AS之間運作BGP協定。

2、分别在R1和R5使用BGP協定宣告21.0.0.0/24和20.0.0.0/24,使所有路由器學到這兩條路由資訊。

3、通過BGP的屬性控制選路,實作PC 1→R1→R2→R4→R5→PC 2→R5→R4→R3→R2→R1→PC 1的路由通信。順便将多個控制選路的方法測試一下。

4、在R2、R3和R4路由器上分别向BGP協定中注入本地的OSPF路由資訊,使全網互通(雖然在第三個要求實作了控制路由選路,但是并不意味着PC1可以ping通任何一個路由器,比如R2)。

5、為了引出EBGP多跳的配置,嘗試一下R1和R4直接建立對等體關系。

開始配置:

1、自行配置各個PC、路由器實體接口及loopback接口的IP位址(我是懶癌晚期患者,請多多擔待),路由器IP配置參考:

<R1>sys                          <!--進入系統視圖-->    
[R1]in g0/0/0                  <!--進入實體接口--> 
[R1-GigabitEthernet0/0/0]ip add 12.1.1.1 24               <!--配置IP位址--> 
[R1-GigabitEthernet0/0/0]int loop 0                  <!--進入loopback接口--> 
[R1-LoopBack0]ip add 1.1.1.1 32              <!--配置IP位址--> 
           

2、配置AS 200内部的OSPF路由協定:

R2路由器配置如下:

[R2]ospf 1              <!--開啟OSPF程序1--> 
[R2-ospf-1]area 0       <!--配置OSPF區域ID為0--> 
[R2-ospf-1-area-0.0.0.0]net 2.2.2.2 0.0.0.0        <!--宣告該路由器所有直連網段--> 
[R2-ospf-1-area-0.0.0.0]net 12.1.1.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0]net 24.1.1.0 0.0.0.255
<!--OSPF宣告網段時需要寫反掩碼-->
           

R3路由器配置如下(相應注釋請參考R2):

[R3]ospf 1
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]net 3.3.3.3 0.0.0.0
[R3-ospf-1-area-0.0.0.0]net 13.1.1.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0]net 34.1.1.0 0.0.0.255
           

R4路由器配置如下(相應注釋請參考R2):

[R4]ospf 1
[R4-ospf-1]area 0
[R4-ospf-1-area-0.0.0.0]net 4.4.4.4 0.0.0.0 
[R4-ospf-1-area-0.0.0.0]net 24.1.1.0 0.0.0.255
[R4-ospf-1-area-0.0.0.0]net 34.1.1.0 0.0.0.255
           

3、開始配置BGP,使相應路由器為鄰居關系:

R1配置如下:

[R1]bgp 100               <!--配置BGP編号為100-->
[R1-bgp]router-id 1.1.1.1               <!--指定路由器ID-->
[R1-bgp]peer 12.1.1.2 as 200               <!--與R2路由器的GE 0/0/0接口建立鄰居關系-->
[R1-bgp]peer 13.1.1.3 as 200               <!--與R3路由器的GE 0/0/1接口建立鄰居關系-->
[R1-bgp]network 21.0.0.0 24               <!--宣告本路由器上的21.0.0.0/24網段-->
           

由于配置BGP時,很多重複性的指令,是以,沒有特别不一樣的配置時,我接下來就不寫注釋了

R2配置如下:

[R2]bgp 200
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 12.1.1.1 as 100               <!--與R1路由器的GE 0/0/0接口建立鄰居關系-->
[R2-bgp]peer 4.4.4.4 as 200                <!--與R4路由器的loopback接口建立鄰居關系-->  
[R2-bgp]peer 4.4.4.4 connect-interface LoopBack 0  <!--指明4.4.4.4是對端的loopback接口編号為0-->
[R2-bgp]peer 4.4.4.4 next-hop-local     <!--由于與R4屬于IBGP,是以要保證下一跳可達-->
           

R3配置如下:

[R3]bgp 200
[R3-bgp]router-id 3.3.3.3
[R3-bgp]peer 13.1.1.1 as 100
[R3-bgp]peer 4.4.4.4 as 200
[R3-bgp]peer 4.4.4.4 connect-interface LoopBack 0
[R3-bgp]peer 4.4.4.4 next-hop-local
           

R4配置如下:

[R4]bgp 200
[R4-bgp]router-id 4.4.4.4
[R4-bgp]peer 2.2.2.2 as 200
[R4-bgp]peer 3.3.3.3 as 200
[R4-bgp]peer 2.2.2.2 next-hop-local
[R4-bgp]peer 3.3.3.3 next-hop-local
[R4-bgp]peer 2.2.2.2 connect-interface LoopBack 0
[R4-bgp]peer 3.3.3.3 connect-interface LoopBack 0
[R4-bgp]peer 45.1.1.5 as 300   <!--與R5路由器的GE 0/0/0接口建立鄰居關系-->
           

R5配置如下:

[R5]bgp 300
[R5-bgp]router-id 5.5.5.5
[R5-bgp]peer 45.1.1.4 as 200
[R5-bgp]network 20.0.0.0 24
           

現在BGP的鄰居關系已經建立完成,可以通過以下指令檢視:

[R1]dis bgp peer

 BGP local router ID : 1.1.1.1
 Local AS number : 100
 Total number of peers : 2        Peers in established state : 2

  Peer            V          AS  MsgRcvd  MsgSent  OutQ  Up/Down       State Pre
fRcv

  12.1.1.2        4         200        5        8     0 00:02:11 Established    
   1
  13.1.1.3        4         200        7       10     0 00:04:34 Established    
   1
<!--State列為Established則表示BGP鄰居關系正常建立,可以正常運作BGP協定-->
           

至此,PC 1已經可以和PC 2進行通信了,當然是BGP協定做的咯,但是現在除了非直連網段及AS 200内部路由器以外,也隻有PC1和PC2可以通信,如PC1并不能ping通R2路由器。

4、開始做第三個需求,通過BGP的屬性控制選路,實作PC 1→R1→R2→R4→R5→PC 2→R5→R4→R3→R2→R1→PC 1的路由通信。

先使用tracert指令檢視PC1和PC2通信時的路由,看看都是經過哪個路由器。

PC1到達PC5所經過的路由器如下:

PC>tracert 20.0.0.1                     #使用tracert指令進行檢視
traceroute to 20.0.0.1, 8 hops max
(ICMP), press Ctrl+C to stop
 1  21.0.0.254   <1 ms  16 ms  15 ms
 2  12.1.1.2   16 ms  15 ms  16 ms
 3  24.1.1.4   31 ms  32 ms  31 ms
 4  45.1.1.5   31 ms  47 ms  31 ms
 5    *20.0.0.1   31 ms  32 ms
           

PC5到達PC1所經過的路由器如下:

PC>tracert 21.0.0.1

traceroute to 21.0.0.1, 8 hops max
(ICMP), press Ctrl+C to stop
 1  20.0.0.254   15 ms  <1 ms  16 ms
 2  45.1.1.4   16 ms  31 ms  16 ms
 3  24.1.1.2   31 ms  31 ms  31 ms
 4  12.1.1.1   47 ms  16 ms  47 ms
 5  21.0.0.1   31 ms  31 ms  31 ms
           

來吧,開始配置選路問題(共三個方法可實作):

實作方法1:修改Local-Perf屬性來改變R3路由器的優先級

在R3路由器上配置如下:

[R3]route-policy lop permit node 10    <!--建立名為lop的路由政策-->
Info: New Sequence of this List.
[R3-route-policy]apply local-preference 222      <!--設定本地優先級是222-->
[R3-route-policy]quit
[R3]bgp 200              <!--進入bgp  200-->
[R3-bgp]peer 4.4.4.4 route-policy lop export       <!--向R4通告該政策-->
[R3-bgp]quit
[R3]quit
<R3>reset bgp all         <!--重新整理BGP-->
           

此時再檢視PC5到達PC1所經過的路由器,就發現中間不經過R2路由器,而經過了R3路由器到達的PC1,如下:

PC>tracert 21.0.0.1

traceroute to 21.0.0.1, 8 hops max
(ICMP), press Ctrl+C to stop
 1  20.0.0.254   <1 ms  16 ms  16 ms
 2  45.1.1.4   15 ms  16 ms  31 ms
 3  34.1.1.3   31 ms  32 ms  31 ms
 4  13.1.1.1   47 ms  31 ms  47 ms
 5    *21.0.0.1   47 ms  31 ms
           

實作方法2:使用AS-PATH屬性控制選路

為了還原最初走R2的效果,需要清除上一步R3路由器配置的Local-Perf屬性,在R3路由器執行以下指令進行删除:

[R3]bgp 200
[R3-bgp]undo peer 4.4.4.4 route-policy lop export
           

删除後,稍等會可以自行檢視,PC2和PC1時是否又恢複了走R2路由器而不走R3。

然後在R2路由器修改AS-PATH屬性(就是讓R2路由器在向R4路由器通告21.0.0.0網段時,告訴R4經過了好多區域,當然,這些區域是虛造出來的,這個區域數肯定比R3所經過的區域數多,是以R4就會選擇走R3而不走R2,因為要走最優路徑嘛):

R2配置如下:

[R2]route-policy as permit node 10   <!--建立名為as的路由政策-->
Info: New Sequence of this List.
[R2-route-policy]apply as-path 123 123 123 add   <!--添加幾個as區域-->
[R2-route-policy]quit
[R2]bgp 200            <!--進入bgp  200-->
[R2-bgp]peer 4.4.4.4 route-policy as export   <!--向R4通告該政策-->
[R2-bgp]quit
[R2]quit
<R2>reset bgp all        <!--重新整理BGP-->
<!--随便添加的AS區域,并不會影響通信,當R3路由器down掉後,R4路由器還是會把資料包發到R2路由器-->
           

現在在PC2再測試一下,會發現又開始走R3路由器了:

PC>tracert 21.0.0.1

traceroute to 21.0.0.1, 8 hops max
(ICMP), press Ctrl+C to stop
 1  20.0.0.254   16 ms  <1 ms  15 ms
 2  45.1.1.4   32 ms  15 ms  31 ms
 3  34.1.1.3   16 ms  31 ms  32 ms
 4  13.1.1.1   31 ms  31 ms  31 ms
 5    *21.0.0.1   47 ms  31 ms
           

實作方法3:使用MED屬性控制選路

在一開始測試過,PC1去往PC5是經過R2路由器,而不是R3路由器,那麼現在就增加R2路由器的MED屬性并通告給R1路由器,使它經過R3路由器而不是R2路由器。

[R2]route-policy med permit node 10   <!--建立名為med的路由政策-->
Info: New Sequence of this List.
[R2-route-policy]apply cost + 500     <!--增加500的med值-->
[R2-route-policy]quit
[R2]bgp 200
[R2-bgp]peer 12.1.1.1 route-policy med export    <!--通告給R1路由器-->
[R2-bgp]quit
[R2]quit
<R2>reset bgp all        <!--重新整理BGP-->
           

在PC1測試一下:

PC>tracert 20.0.0.1

traceroute to 20.0.0.1, 8 hops max
(ICMP), press Ctrl+C to stop
 1  21.0.0.254   16 ms  <1 ms  16 ms
 2  13.1.1.3   15 ms  16 ms  15 ms
 3  34.1.1.4   47 ms  16 ms  16 ms
 4  45.1.1.5   31 ms  31 ms  31 ms
 5    *20.0.0.1   32 ms  31 ms
           

已經改走R3路由器了,說明配置生效,通過這三個選路的實作方法不難發現,BGP控制選路主要都是通過BGP屬性值來調整完成的。BGP包含大量的屬性,而這些屬性直接影響着選路,所有BGP比IGP具有更強大的控制能力。

5、第四個需求:在R2、R3和R4路由器上分别向BGP協定中注入本地的OSPF路由資訊,使全網互通。

R2路由器:

[R2]bgp 200
[R2-bgp]import-route ospf 1                  <!--将OSPF注入BGP,其中“1”代表OSPF的程序号-->
           

其餘路由器配置基本一緻:

R3:

[R3]bgp 200
[R3-bgp]import-route ospf 1
           

R4:

[R4]bgp 200
[R4-bgp]import-route ospf 1
           

自行檢視各路由器的路由條目驗證吧!文章末尾有相關檢視指令。

6、第五個需求:嘗試一下R1和R4直接建立對等體關系。

R1配置如下:

[R1-bgp]bgp 100
[R1-bgp]peer 34.1.1.4 as 200
[R1-bgp]peer 34.1.1.4 ebgp-max-hop 2            
<!--由于中間隔着一個路由器,又不在同一個AS内,屬于EBGP,
預設TTL值為1,是以要改變一下跳數-->
           

R4配置如下

[R4]bgp 200
[R4-bgp]peer 13.1.1.1 as 100
[R4-bgp]peer 13.1.1.1 eb    
[R4-bgp]peer 13.1.1.1 ebgp-max-hop 2
           

檢視驗證(可能需要等一會才可建立鄰居成功,等待時間不會超過兩分鐘)

[R1-bgp]dis bgp peer       <!--檢視BGP的鄰居關系-->

 BGP local router ID : 1.1.1.1
 Local AS number : 100
 Total number of peers : 3        Peers in established state : 3

  Peer            V          AS  MsgRcvd  MsgSent  OutQ  Up/Down       State Pre
fRcv

  12.1.1.2        4         200       27       38     0 00:17:49 Established    
   8
  13.1.1.3        4         200       55       70     0 00:45:35 Established    
   8
  34.1.1.4        4         200       12       13     0 00:00:02 Established    
   8
<!--34.1.1.4的State列為Established,表示建立鄰居成功-->
           

相關檢視指令:

[R4]dis ip routing-table                    <!--檢視路由器的所有路由資訊-->
[R4]dis ospf routing                      <!--檢視通過OSPF協定學到的路由資訊-->
[R4]dis bgp peer                     <!--檢視通過BGP協定學到的路由資訊-->
[R1-bgp]dis bgp peer       <!--檢視BGP的鄰居關系-->
           

四、配置總結

在配置過程中需要注意以下幾點,以免出現錯誤:

1、在建立鄰居關系,指定對端路由器位址前,務必保證可以ping通對端路由器。

2、AS内部建立BGP鄰居關系時,最好指定對方的Loopback位址,但不要忘記更新源,參考指令: “ [R3-bgp]peer 4.4.4.4 connect-interface LoopBack 0 ” 。

3、若在AS内部有一個以上的的路由器運作着BGP協定,對于AS内部來說,這也是IBGP協定,不要忘記更改下一跳的屬性,也就是前面提到的“保證IBGP下一跳可達”,指令參考:“[R4-bgp]peer 2.2.2.2 next-hop-local”

4、前面說到,若在兩個不同AS區域的路由器上建立鄰居關系,哪怕這兩個路由器是直連的,也要改變它的TTL值,目的是讓路由器之間用來建立鄰居關系的資料包,可以多經過幾個路由器,再被丢棄,因為,雖然不同AS的路由器是直連的,隻有一跳即可,但是由于指定的是對端路由器的loopback位址,loopback位址的網段肯定與路由器直連的網段不是同一個網段,路由器收到該資料包後就把它當成另一個路由器上的位址了,是以在兩個AS間建立鄰居關系時,一定要改變它的跳數,IBGP之間建立鄰居關系就不用改變TTL值了,因為在IBGP中,資料包的TTL值預設為255。改變TTL值的參考指令:“ [R1-bgp]peer 34.1.1.4 ebgp-max-hop 2 ”這條指令,需要跳幾下就把數值設定為幾就行,可以比實際跳數大,但是不能比實際跳數小。