BGP(邊界網關協議)是一個路徑矢量路由協議,和傳統的基於下一跳的IGP協議不一樣,它是基於AS(自治系統)的協議。BGP屬於外部網關路由協議,它解決的是AS之間的選路問題,也正是由於這樣,它更適合用戶互聯網。學習BGP的關鍵在於理解BGP的報文、鄰居的創建、BGP路由屬性、選路原則等。接下來詳細介紹——BGP路由協議。node
博文大綱:
1、BGP的概述;
1.自治系統
2.動態路由的分類
1)按自治系統分類
2)按協議類型分類
3.BGP的概念
4.BGP的特性
2、掌握BGP的工做原理;
1.BGP鄰居關係
(1)BGP報文
(2)BGP狀態機
(3)BGP數據庫
(4)BGP鄰居關係類型
2.通告BGP路由的方法
(1)Network方式
(2)Import方式
3.BGP的配置
(1)BGP對等體的配置
(2)保證IBGP下一跳可達
(3)BGP的屬性
(4)BGP的選路原則
3、實驗案例;
4、總結BGP的配置;數據庫
不一樣於RIP、OSPF之類的路由協議,BGP是在自治系統之間進行路由學習及選路的協議。舉例來講:把一個城市當作一個自治系統,RIP、OSPF路由協議就像是城市中的公交;BGP則至關於火車、高鐵運行在城市與城市之間。在更好的瞭解BGP的概念以前,咱們先介紹一下自治系統的概念。網絡
自治系統(AS)是由同一個技術管理機構管理,使用統一選路策略(運行同一種動態路由協議)的一組路由器的組合。自治系統的編號取值範圍爲1~65535。其中1~64511是互聯網上註冊的公有AS號,相似於公網地址,是全球惟一的且不可重複使用;64512~65535是私有AS號,相似於私網地址,能夠重複使用可是互聯網上是不可見的。app
動態路由協議有不少種分類方法,其中按自治系統分類、按協議類型分類是比較經常使用的兩種。ide
IGP:即自治系統內部的路由協議,主要包含RIPv1/v二、OSPF、ISIS、EIGRP(Cisco私有協議)。IGP是運行在AS內部的路由協議,它主要解決AS內部的選路問題。其主要做用是發現、計算路由;oop
EGP:即自治系統之間的路由協議,一般指BGP。EGP是運行在AS與AS之間的路由協議,它主要解決的是AS之間的選路問題。BGP的主要做用是控制路由的傳播和選擇最優路由;學習
一般狀況下,會先使用IGP協議在自治系統內部計算和發現路由條目,再經過BGP協議將IGP協議產生的路由傳遞至其餘的自治系統。ui
距離矢量路由協議:RIPv1/v二、BGP(路徑矢量協議)、EIGRP(高級的距離矢量協議);
鏈路狀態路由協議:OSPF、ISIS;this
BGP是一種運行在AS與AS之間的動態路由協議,主要做用是在AS之間自動交換無環路由信息,以此來構建AS的拓補圖,從而消除路由環路並實施用戶配置的路由策略。目前公網路由條目衆多,IGP協議沒法承載,可是對於BGP來講卻能輕鬆應對。並且BGP相比IGP具備更多的屬性特性,更加便於在大規模的網絡中使用多種路由策略,因此BGP協議經常使用於ISP與ISP之間或跨地域總、分公司之間的路由信息交互。設計
BGP解決的是自治系統之間的路由學習問題。當今互聯網是全球互聯,在中國,互聯網運營商有電信和聯通。每一個公司都有本身的自治系統,而且內部運行IGP協議。可是互聯網又要求互聯,因此經過BGP就能夠在電信和聯通之間的學習路由,是電信的用戶能夠和聯通的用戶之間上網聊天,發送郵件等。如圖:
BGP具備如下特性:
(1)傳輸協議:TCP,端口號179;
(2)BGP是外部路由協議,用來在AS之間傳遞路由信息;
(3)是一種加強的路徑矢量路由協議;
(4)擁有可靠的路由更新機制 ;
(5)具有豐富的Metric度量方法;
(6)無環路協議設計;
(7)爲路由條目附帶多種屬性信息;
(8)支持CIDR(無類別域間選路);
(9)豐富的路由過濾和路由策略;
(10)無需週期性更新;
(11)路由更新時只發送增量路由;
(12)週期性發送KeepAlive報文以保持 TCP連通性;
BGP是跨公網、跨自治系統的路由協議,能夠在自治系統之間學習路由。BGP的動態學習路由也是基於鄰居,只有鄰居關係正常,BGP才能夠正常工做。
運行BGP的路由器一般被稱爲BGPSpeaker(發言者),相互之間傳遞報文的Speaker之間互稱爲對等體(Peer)。BGP鄰居關係的創建、更新和刪除是經過對等體之間交互5種報文、6種狀態機和5個表等信息來完成的,最終才能夠造成鄰居關係。
BGP報文頭中的Type定義了BGP的報文類型。BGP對等體之間經過5種報文進行路由信息的交互。下面詳細介紹5種報文的詳細信息。
Open(打開)報文是TCP鏈接創建後發送的第一個報文,用於創建BGP對等體之間的鏈接關係,主要包含BGP版本、本地AS編號、Hoidtime(保存時間)等信息。對等體在接收到對端發過來的Open報文並協商成功後,將發送KeepAlive報文確認並保持鏈接的有效性。BGP對等體關係確認後,對等體之間才能夠進行發送剩下的報文,交換路由信息。
Update(更新)報文用來在BGP對等體之間更新路由信息。
Update報文能夠經過多條屬性系統同的就可達路由信息,也可撤銷多條不可達路由信息。
- 網絡可達信息(NLRI):經過此字段發佈多條具備相同屬性的可達路由,這些路由信息可共享同一組路由屬性,此字段由可達的目的IP地址前綴和掩碼組成;
- 撤銷多條不可達路由:經過該字段發佈應經失效或者不可達的路由信息。此字段由不可達的目的IP地址和掩碼組成;
Update報文能夠用於只撤銷路由,在僅用於撤銷路由時,不須要包括路徑屬性或NLRI。一樣,也能夠用於只通告可達路由,此時則不須要攜帶撤銷路由信息。
Notification(通知)報文的做用是當BGP檢測到錯誤信息時,馬上向對等體發出Notification報文,以後BGP鏈接會當即中斷。要注意的是,無論當前的BGP狀態當時處於何種狀態,只要收到Notification報文就會返回idle狀態。換而言之,BGP是不容許錯誤出現的一種路由協議,在選路原則中,更優的路徑每每是鄰居關係最久的對等體,以此反映對等體兩端經歷很長的時間都沒有出現錯誤,而以前學過的其餘路由協議則是越新越好。
用來告知對等體本地所支持路由的刷新能力。在全部BGP路由器擁有Route-Refresh(路由更新)能力的狀況下,若是BGP的入口路由策略發生了變化,本地BGP路由器會向對等體發送Route-Refresh報文,收到此消息的對等體會將其路由信息從新發給本地BGP路由器。這樣,能夠在不中斷BGP鏈接的狀況下,對BGP路由表進行動態刷新,並應用新的路由策略。
該報文在對等體之間週期性的發送,用以保持鏈接的有效性並維護器鏈接,KeepAlive(保持)報文只有一個BGP報文頭。默認KeepAlive(保持)報文發送週期爲60s,Holdtime(保存報文)爲180s。KeepAlive報文相似於OSPF協議中的Hello報文,當收到對等體發過來的KeepAlive報文後會刷新Holdtime計時器,若是Holdtime計時器超時仍然沒有收到KeepAlive報文,則認爲對等體失效。
BGP狀態機描述的是BGP鄰居的創建過程,經過對這些不一樣狀態的學習,能夠更加深刻地瞭解BGP的工做原理,以及排查思路。BGP狀態機公有六種狀態,如圖:
下面詳細介紹BGP的六種狀態:
ldle(空閒)狀態,BGP拒絕任何進入的鏈接請求,IdIe狀態是BGP的初始狀態。在ldle狀態下,BGP拒絕鄰居發送的鏈接請求。只有在收到本設備的Start事件(如運行BGP協議)後,BGP纔開始嘗試和其餘BGP對等體進行TCP鏈接,並轉至Commect狀態。任何狀態中收到NOtification報文或TCP拆鏈通知等Error事件後,BGP都對轉至ldle狀態。
Connect(鏈接)狀態下,BGP等待TCP鏈接的創建完成後再決定後續操做。在Connect狀態下,BGP啓動鏈接重傳定時器(一般計時器爲30s),等待TCP完成鏈接。若是TCP鏈接成功,那麼BGP向對等體發送Open報文,並轉至OpenSent(開放)狀態;若是TCP鏈接失敗,那麼BGP轉至Active(活躍)狀態;若是鏈接重傳定時器超時,BGP仍沒有收到BGP對等體的響應,那麼BGP繼續嘗試和其餘BGP對等體進行TCP鏈接,停留在Connect狀態。
Active(活躍)狀態下,BGP將嘗試進行TCP鏈接的創建,是BGP的中間狀態。在Active狀態下,BGP老是在試圖創建TCP鏈接,若是TCP鏈接成功,那麼BGP向對等體發送Open報文,關閉鏈接重傳定時器,並轉至OpenSent狀態;若是TCP鏈接失敗,那麼BGP停留在Active狀態;若是鏈接重傳定時器超時,BGP仍沒有收到BGP對等體的響應,那麼BGP轉至Connect狀態。
在OpenSent(開放集)狀態下,BGP等待對等體的Open報文,並對收到的Open報文中的AS號、版本號、Holdtime等進行檢查。若是收到的Open安博文正確,那麼BGP發送KeepAlive報文,並轉至OpenConfirm(打開確認)狀態;若是發現收到的Open報文有錯誤,那麼BGP發送Notification報文給對等體,並轉至IdIe狀態。
OpenConfirm(打開確認)狀態下,BGP等待KeepAlive或Notification報文。若是收到KeepAlive報文,則轉至Established(確認)狀態;若是收到Notification報文,則轉至ldle狀態。
在Established(確認)狀態下,BGP能夠在對等體之間交換Update、KeepAlive、Route-refresh報文和Notification報文。若是收到正確的Update或KeepAlive報文,那麼BGP就認爲對端處於正常運行狀態,將保持BGP鏈接;若是收到錯誤的Update或KeepAlive報文,那麼BGP發送Notification報文通知對端,並轉至ldle狀態。
注意:Route-refresh報文不會改變BGP狀態。若是收到Notification報文,那麼BGP轉至ldle狀態。若是收到TCP拆鏈通知(FIN),那麼BGP斷開鏈接,轉至ldle狀態。
在BGP對等體創建的過程當中,一般可見的三種狀態是ldle、Active、Established。BGP對等體雙方的狀態必須都爲Established,BGP鄰居關係才能成立,雙方經過Update報文交換路由信息。
BGP數據庫是BGP正常工做所須要的存儲空間,基於保存的內容不一樣,可分爲以下幾種:
全局路由信息庫,包括全部最優的IP路由信息。
BGP路由信息看,包括本地BGP Speaker通告的路由信息,將其中最優路由添加到IP路由表中。
注意:先要關注BGP路由表,若BGP路由表中不是最優路由,則沒法在IP路由表中可見。
對等體鄰居清單列表,包括對等體兩端的鄰居信息及鄰居列表。
對等體宣告給本地Speaker的未處理的路由信息庫。
本地Speaker宣告給指定對等體的路由信息庫。
在BGP中大體可分爲兩種鄰居關係:
- IBGP:同一個AS內部的BGP鄰居關係,IBGP鄰居一般是指運行BGP協議的對等體兩端均在同一個AS域內,屬於同一個BGP AS內部;
- EBGP:AS之間的BGP鄰居關係,EBGP鄰居一般是指運行BGP協議的對等體兩端分別在不一樣的AS內;
注意:IGP協議創建鄰居通常要求三層直連,而且經過廣播或組播創建鄰居。而BGP的鄰居關係是基於TCP的,也就是說只要TCP/IP可達,不管是否直連,BGP對等體彼此之間就能夠創建鄰居關係。因此BGP創建鄰居以前首先要考慮的就是對等體之間的路徑可達(是否存在路由)。務必要經過IGP或者靜態路由使對等體兩端互通。
如圖:根據鄰居之間是否屬於同一個自治系統能夠判斷,R1和R2是EBGP鄰居關係,R2和R4是IBGP鄰居關係。若是AS300中有路由要傳播到AS100,那麼BGP的傳播路徑爲R5→R4→R2→R1。須要注意的是,在AS200內部,除了R2和R4是IBGP鄰居關係外,R2和R三、R3和R4均可以配置爲IBGP鄰居關係,徹底取決於網絡工程師的規劃。
可使用如下命令創建IBGP鄰居和EBGP鄰居,其中as-number後面跟鄰居所在的AS好,鄰居的AS號和本端的AS號相同就成爲IBGP鄰居,不一樣就爲EBGP鄰居。
R2的配置以下:
[R2]bgp 200 //進入bgp視圖,其中本端AS號爲200 [R2-bgp]router-id 2.2.2.2 //配置BGP的router-id [R2-bgp]peer 12.1.1.1 as-number 100 //和12.1.1.1創建EBGP鄰居關係 [R2-bgp]peer 34.1.1.4 as-number 200 //和34.1.1.4創建IBGP鄰居關係
上面配置爲R2設備經過有兩個對等體鄰居,R1:12.1.1.1爲EBGP鄰居,R4:34.1.1.4爲IBGP鄰居。須要注意的是R2和R4可達。
R5的配置以下:
[R5]bgp 300 [R5-bgp]router-id 5.5.5.5 [R5-bgp]peer 45.1.1.4 as-number 200
上面配置爲R5設備通告有一個對等體鄰居,R4:45.1.1.4爲EBGP鄰居。
須要注意的是,對等體兩端如果非直連關係,須要先用IGP或者靜態路由連通BGP對等體兩端。
[R5]display bgp peer //查詢BGP鄰居信息; //在結果中重點查看state一列,Established表示已經創建鏈接; //BGP對等體兩端同步路由信息的前提是BGP鄰居關係爲Established;
BGP路由是經過BGP命令通告而成的,而通告BGP路由的方法有兩種:Network方式和Import方式。
使用Network方式能夠將當前設備路由表中的路由(非BGP)發佈到BGP路由表並通告給鄰居,須要注意的是,network的對象是路由條目而不是接口。
如圖:R1和R2位於AS100內,而且R1和R2是IBGP鄰居關係,R2和R3是EBGP鄰居關係。R1上有兩個環回接口,因此在R1的路由表中就會有兩個環回接口的直連路由。要求實現經過R1上宣告1.1.1.0/32和2.2.2.0/32路由,最終R3能夠經過BGP學習到。配置命令以下:
[R1]bgp 100 [R1-bgp]router-id 1.1.1.1 [R1-bgp]peer 12.0.0.2 as-number 100 [R1-bgp]network 1.1.1.1 32 [R1-bgp]network 2.2.2.2 32 //R1將自身的1.1.1.1/32和2.2.2.2/32經過Network的方式發佈到BGP中
BGP經過路由和IGP不一樣,在IGP中,通告的是接口,以OSPF爲例,假如路由器有兩個接口,地址分別爲192.168.1.1/24和192.168.2.1/24,那麼運行IGP時,能夠通告彙總地址,以使這兩個接口運行OSPF協議,命令爲network 192.168.0.0 0.0.255.255 area 0 。可是BGP不一樣,BGP經過的不是接口,而是路由,假如路由表中的實際路由爲1.1.1.0/24,那麼就不能執行命令network 1.0.0.0 8以8爲經過,必須以實際的路由通告。
使用Import命令能夠將鎖學習到的路由信息重分發到BGP路由表中,是BGP宣告路由的一種方式,能夠引入BGP的路由包括直連路由、靜態路由即動態路由協議學習的路由。和Network方式的區別是,Import的對象是某種動態路由協議,而不是路由條目。
R2和R3是EBGP鄰居關係。在AS100中運行OSPF動態路由協議,R1經過OSPF宣告了物理接口及兩個環回接口,而且R2已經經過OSPF學習到1.1.1.1/32和2.2.2.2/32兩條路由,這些學習的路由能夠在R2上經過Import方式引入BGP協議中。配置命令以下:
[R2-bgp]import-route ospf 110 //110爲運行OSPF的進程號
經過display bgp routing-table命令能夠查看BGP的路由表,在輸出的BGP路由中,「*」 表示有效的路由,「>」表示最優的路由,只有最優的路由纔會最終放入路由表中。
若是某個BGP路由條目不優,那麼緣由可能有:
- 在同步打開的狀況下,從IBGP鄰居學習到的路由不會經過給其餘BGP鄰居,也不會使用該路由哦,直到經過IGP也學習到該路由或有靜態路由能夠關閉同步來解決(路由進程下執行 undo synchronization);
- BGP 路由條目的下一跳不可達;
BGP設備會將最優路由加入到BGP路由表,造成BGP路由。BGP設備與對等體創建鄰居關係後,採起如下交互原則:
(1)從IBGP對等體得到的BGP路由,BGP設備只傳遞給它的EBGP對等體;
(2)從EBGP對等體得到的BGP路由,BGP設備傳遞給它的全部EBGP和IBGP對等體(對等體是IBGP只能傳遞一跳,對等體是EBGP則不限制);
(3)當存在多條到達同一目的地址的有效路由時,BGP設備只將最優路由發佈給對等體;
(4)路由更新時,BGP設備只發送更新的BGP路由;
(5)全部對等體發送的路由,BGP設備都會接收;
(6)全部EBGP對等體在傳遞過程當中下一跳改變;
(7)全部IBGP對等體在傳遞過程當中下一跳不變;
(8)默認EBGP傳遞時,TTL值爲1;
(9)默認IBGP傳遞時。TTL值爲255;
因爲默認BGP中EBGP鄰居之間的TTL值爲1,若EBGP對等體非直連,在傳遞時,TTL跳數限制會使非直連的EBGP對等體沒法正常創建鄰居關係,因此須要用EBGP多跳的命令來解決非直連 的鄰居關係。
配置命令以下:
[R3]bgp 200 [R3-bgp]router-id 3.3.3.3 [R3-bgp]peer 12.0.0.1 as-number 100 //保證12.0.0.1可達 [R3-bgp]peer 12.0.0.1 ebgp-max-hop 2 //設置TTL值爲2,使其可達
鏈接公網環境設備的地址很容易出現各類各樣的問題,爲了不由於接口不穩定或DOWN而致使的BGP狀態的改變。一般會在同一個AS內使用冗餘鏈路來確保BGP的穩定性,這樣即便某一鏈路故障,也不影響BGP的鄰居關係,因此常常會使用LoopBack接口IP地址和對端創建BGP鄰居,由於環回接口永遠是UP,因此只要至少有一條鏈路可達,BGP的鄰居關係就不會因鏈路而發生改變,這種使用環回接口創建BGP鄰居的方法稱爲更新源創建鄰居。
R1的配置以下:
[R1]bgp 100 [R1-bgp]router-id 1.1.1.1 [R1-bgp]peer 3.3.3.3 as-number 100 [R1-bgp]peer 3.3.3.3 connect-interface LoopBack0
R3的配置以下:
[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接口先要讓對等體可達; //須要手動添加對等體環路接口的路由條目或者IGP自動學習對方環回接口路由
在AS邊緣的BGP設備,會接收到它的BGP對等體鄰居傳遞過來的BGP路由信息。若是是下面這種狀況:
假如R1通告一條路由,通過EBGP鄰居傳播到AS200後,R2看到的路由下一跳爲12.0.0.1,繼續通過EBGP傳播到R3以後,R3看到的路由下一跳是23.0.0.2。R3傳播給IBGP鄰居R4後,R4看到的路由下一跳依然爲23.0.0.2,由於經過IBGP鄰居接收的BGP路由下一跳不變。又由於R4沒有下一跳地址23.0.0.2的路由,因此R1傳播過來的信息無效,不能傳播給其餘BGP鄰居,更不能放入路由表。
解決的方法:在R3上宣稱下一跳爲R3本身,那麼R4看到的下一跳就變成了34.1.1.3,而34.1.1.3能夠經過IGP學習到(由於是直連網絡),從而解決了路由無效的問題。R3執行以下命令能夠實現:
[R3]bgp 300 [R3-bgp]router-id 3.3.3.3 [R3-bgp]peer 23.0.0.2 as-number 200 [R3-bgp]peer 34.1.1.4 as-number 300 [R3-bgp]peer 34.1.1.4 next-hop-local
區別於傳統的協議,BGP協議包含不少路由屬性,這些屬性能夠很是靈活的控制BGP的選路。
BGP的屬性共分爲公有必遵、公認任意、可選過渡、可選非過渡。如圖:
- 公有必遵:全部BGP路由器均可以識別,且必須存在於Update報文中;
- 公認任意:全部BGP路由器均可以識別,但不要求必須存在於Update報文中,能夠根據具體狀況來決定是否添加到Update報文中;
- 可選過渡:BGP路由器能夠選擇是否在Update消息中攜帶這種屬性。接收的路由器若是不識別這種屬性,能夠轉發給鄰居路由器(這就是過渡的含義),鄰居路由器可能會識別並使用到這種屬性;
- 可選非過渡:BGP路由器能夠選擇是否在Update消息中攜帶這種屬性。在整個路由發佈的路徑上,若是部分路由器不能識別這種屬性,可能會致使該屬性沒法發揮做用。由於接收的路由器若是不識別這種屬性,將丟棄這種屬性,並且再也不轉發給鄰居路由器;
BGP的經常使用屬性有Origin、AS-PATH、Next-Hop、Local-Pref和MED等。
Origin屬性屬於公有必遵,用阿里定義路徑信息的來源,其做用是標記一條路由是怎麼成爲BGP路由的。
Origin包含如下三種類型:
- IGP(i):優先級最高。經過Network命令注入BGP路由表的路由,其Origin屬性爲IGP;
- EGP(e):優先級次之。經過EGP獲得的路由信息,經過使用Import-route命令注入的路由,其Origin屬性爲EGP;
- Incomplete(?):優先級最低。經過其餘方式學習到的路由信息;
AS-PATH屬性按矢量順序記錄了某條路由從本地到目的地址所要通過的全部的AS編號。在接收路由時,設備若是發現AS-PATH列表中有本AS號,則不接收該路由,從而避免了AS間的路由環路。
AS路徑列表記錄了所通過的AS號,各AS號之間以逗號分隔,且離本設備最近的AS號在最前面。
當BGP Speaker發佈始發於本自治系統的路由時,遵循如下原則:
(1)當BGP Speaker將這條路由通告到EBGP對等體時,便會在Update報文中建立一個攜帶本地AS好的AS-PATH列表;
(2)當BGP Speaker將這條路由通告給IBGP對等體是,便會在Update報文中建立一個空的AS-PATH列表;
當BGP Speaker抓飯來自於其餘自治系統的路由時,遵循如下原則:
(1)當BGP Speaker將這條路由通告給EBGP對等體時,便會把本地AS編號添加到AS-PATH列表的最前面。收到此路由的BGP設備根據AS-PATH屬性就能夠知道去目的地址所要通過的AS。離本地AS最近的相鄰AS號排在前面,其餘AS號按順序依次排序;
(2)當BGP對等體將這條路由發佈給IBGP對等體時,不會改變這條路由相關的AS-PATH屬性;
如圖:AS200中的路由器RTA通告了一條路由18.0.0.0/8。該路由分別經過(200→300→400→100)和(200→500→100)傳遞到AS100中。AS100在收到的路由中會攜帶該路由傳播路徑中的全部AS列表,其中最近的放在前面。
Next-Hop屬性記錄了路由的下一跳信息。BGP的下一跳屬性和IGP的有所不一樣,IGP中的下一跳描述的是下一個路由器,而BGP中的下一跳描述的是下一個AS,因此大部分狀況下不是直連設備的IP地址。
一般狀況下,Next-Hop屬性遵循如下原則:
(1)BGP Speaker在向EBGP對等體發佈某條路由時,會把該路由信息的下一跳屬性設置爲本地與對端創建BGP鄰居關係的接口地址;
(2)BGP Speaker將本地始發路由發佈給IBGP對等體時,會把該路由信息的下一跳屬性設置爲本地與對端創建BGP鄰居關係的接口;
(3)BGP Speaker在向IBGP對等體發佈從EBGP對等體學來的路由時,並不改變路由信息的下一跳屬性;
圖中A~J對應每一個路由器的接口的IP地址。R1經過一條BGP路由1.1.1.0,首先R2收到,由於R1和R2是鄰居,並且該路由器始發於本自治系統(AS100),因此在通告給R2時下一跳爲A。R2繼續通告給R3,由於R2和R3是EBGP鄰居,因此通告給R3時下一跳爲C。R3繼續通告給R4,由於R3和R4是IBGP鄰居,並且該路由不是始發於本自治系統(AS200),而是由其餘自治系統學習而來的,因此R3通告給R4時,下一跳不變,依然爲C,同理,R5和R6的下一跳爲G。
Local-Pref屬性標識BGP路由的優先級,用於判斷流量離開AS時的最佳路由。當BGP的設備經過不一樣的IBGP對等體獲得目的地址相同但下一跳不一樣的多條路由時,將優先級選擇Local-Pref屬性值最高的路由。Local-Pref屬性僅在IBGP對等體之間有效,不通告給其餘AS。本地優先級在AS內部傳遞,優先級越高越優先。
Local-Pref屬性能夠手動設置,若是路由器沒有配置Local-Pref屬性,BGP選路是將該路由的Local-Pref值按默認值100來處理。
圖中,互聯網路由210.52.83.0/24和210.52.82.0/24分別經過ISP1和ISP2兩個自治系統傳到ISP0自治系統。配置RT4中210.52.83.0/24路由的Local-Pref屬性爲一個更高的值200,同理配置RT3中210.52.82.0/24路由的Local-Pref屬性爲一個更高的值200.如此一來,ISP0中的設備去往210.52.83.0/24將會走ISP1,去往210.52.82.0/24將會走ISP2。
在RT4上,控制210.52.83.0的Local-Pref屬性爲200,而210.52.82.0的Local-Pref屬性爲100的配置以下:
[RT4]acl number 2000 [RT4-acl-basic-2000]rule 5 permit source 210.52.83.0 0.0.0.255 [RT4]route-policy test permit node 10 [RT4-route-policy]if-match acl 2000 //知足匹配ACL的條件 [RT4-route-policy]apply local-preference 200 //修改Local-Pref爲200 [RT4]route-policy test permit node 20 [RT4-route-policy]peer 1.1.1.1 route-policy test import //和鄰居1.1.1.1 入方向應用策略
MED屬性用於判斷流量進入鄰居AS是的最佳路由,當一個運行BGP的設備經過不一樣的EBGP 對等體獲得目的地址相同但下一跳不一樣的多條路由時,在其餘條件相同的狀況下,將優先選擇MED值較小者做爲最佳路由,用來改變下游的選路。
MED屬性僅在相鄰兩個AS之間傳遞,收到此屬性的AS一方不會再將其通告給其餘任何第三方AS。MED屬性能夠手動配置,若是路由沒有配置MED屬性,BGP選路時將該路由的MED值按默認值0來處理。
如圖:AS200中將兩條路由(210.52.83.0和210.52.82.0 )通告給AS100.其中RT1在通告是將210.52.83.0設置一個比較小的MED屬性(50),RT2在通告時將210.52.82.0設置一個比較小的MED屬性(50)。AS100收到這些通告後,會認爲到達210.52.82.0通告RT2的路徑是最優的,而到達210.52.83.0通告RT1的路徑是最優的。
在RT3上,而騙子會發送給EBGP鄰居RT1的路由條目中匹配210.52.82.0/24,將MED屬性設置爲100,其餘的設置爲50的命令以下:
[RT3]acl number 2000 [RT3-acl-basic-2000]rule 5 permit source 210.52.82.0 0.0.0.255 [RT3]route-policy test1 permit node 10 [RT3-route-policy]if-match acl 2000 //知足配置ACL的條件 [RT3-route-policy]apply cost 100 //修改MED屬性爲100 [RT3-route-policy]route-policy test permit node 20 [RT3]route-policy test permit node 20 [RT3-route-policy]apply cost 50 //沒有配置條件表明匹配一切條件,修改MED值爲50 [RT3]peer 1.1.1.1 route-policy test1 export
衆所周知,BGP是被普遍應用於互聯網ISP與ISP之間的路由協議,而BGP之因此能被衆多ISP所信任,主要是由於其路徑選擇過程很是嚴格。
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條原則無效
(1)比較Cluster-List長度,短者優先;
(2)比較Originator_ID(若是沒有Originator_ID,則用Router ID比較),選擇數值較小的路徑;
(3)比較對等體的IP地址,選擇IP地址數值最小的路徑;
(1)要求實現兩個AS之間的互相通訊;
(2)經過修改BGP屬性使實現業務需求的路徑從R2切換到R3;
僅配置通告AS內部的直連路由,配置過程略!
在R1和R二、R1和R3配置EBGP鄰居關係,使R一、R2和R3之間能夠經過EBGP相互傳遞路由。在R二、R3和R4上配置IBGP鄰居關係,使R二、R3和R4之間經過IBGP互相傳遞路由。
R1的配置以下:
[R1]bgp 100 [R1-bgp]router-id 1.1.1.1 [R1-bgp]peer 10.0.12.2 as-number 200 [R1-bgp]peer 10.0.13.3 as-number 200 [R1-bgp]network 1.1.1.1 32 //通告網絡1.1.1.1/32
R2的配置以下:
[R2]bgp 200 [R2-bgp]router-id 2.2.2.2 [R2-bgp]peer 10.0.12.1 as-number 100 [R2-bgp]peer 10.0.24.4 as-number 200 [R2-bgp]peer 10.0.24.4 next-hop-local
R3的配置以下:
[R3]bgp 200 [R3-bgp]router-id 3.3.3.3 [R3-bgp]peer 10.0.13.1 as-number 100 [R3-bgp]peer 10.0.34.4 as-number 200 [R3-bgp]peer 10.0.34.4 next-hop-local
R4的配置以下:
[R4]bgp 200 [R4-bgp]router-id 4.4.4.4 [R4-bgp]peer 10.0.24.2 as-number 200 [R4-bgp]peer 10.0.34.3 as-number 200 [R4-bgp]network 4.4.4.4 32
R1的路由表:
[R1]dis bgp routing-table //查看經過BGP學到的路由表 BGP Local router ID is 1.1.1.1 Status codes: * - valid, > - best, d - damped, h - history, i - internal, s - suppressed, S - Stale Origin : i - IGP, e - EGP, ? - incomplete Total Number of Routes: 3 Network NextHop MED LocPrf PrefVal Path/Ogn *> 1.1.1.1/32 0.0.0.0 0 0 i *> 4.4.4.4/32 10.0.12.2 0 200i * 10.0.13.3 0 200i
R4的路由表:
[R4]dis bgp routing-table BGP Local router ID is 4.4.4.4 Status codes: * - valid, > - best, d - damped, h - history, i - internal, s - suppressed, S - Stale Origin : i - IGP, e - EGP, ? - incomplete Total Number of Routes: 3 Network NextHop MED LocPrf PrefVal Path/Ogn *>i 1.1.1.1/32 10.0.24.2 0 100 0 100i * i 10.0.34.3 0 100 0 100i *> 4.4.4.4/32 0.0.0.0 0 0 i
此時BGP已經配置完成,會發現R4去往R1的1.1.1.1優先走R2,而R1去往R4的4.4.4.4優先走R2。接下來改變選路問題。
根據要求,從R4去往R1的路由從R2改走R3。下面幾種方法都可實現!
在R3上修改本地優先級屬性並傳出給R4。
[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 [R3-bgp]peer 10.0.34.4 route-policy lop export //應用策略 [R3-bgp]quit [R3]quit <R3>reset bgp all //刷新路由屬性
刷新以後,在R4上查看路由表:
[R4]dis bgp routing-table BGP Local router ID is 4.4.4.4 Status codes: * - valid, > - best, d - damped, h - history, i - internal, s - suppressed, S - Stale Origin : i - IGP, e - EGP, ? - incomplete Total Number of Routes: 3 Network NextHop MED LocPrf PrefVal Path/Ogn *>i 1.1.1.1/32 10.0.34.3 0 222 0 100i * i 10.0.24.2 0 100 0 100i *> 4.4.4.4/32 0.0.0.0 0 0 i
經過路由表能夠看出此時R4去往R1的路由已經改走R3了!
爲了還原最初走R2的效果,請使用如下命令清除調用策略的語句:
[R3]bgp 200 [R3-bgp]undo peer 10.0.34.4 route-policy lop export
在R2上修改AS-PATH屬性並傳給R4:
[R2]route-policy as permit node 10 Info: New Sequence of this List. [R2-route-policy]apply as-path 123 123 123 additive //表示在原有的路徑上行額外添加( 12三、12三、123)路徑 [R2-route-policy]quit [R2]bgp 200 [R2-bgp]peer 10.0.24.4 route-policy as export [R2-bgp]quit [R2]quit <R2>reset bgp all
查看R4BGP路由效果:
[R4]dis bgp routing-table BGP Local router ID is 4.4.4.4 Status codes: * - valid, > - best, d - damped, h - history, i - internal, s - suppressed, S - Stale Origin : i - IGP, e - EGP, ? - incomplete Total Number of Routes: 3 Network NextHop MED LocPrf PrefVal Path/Ogn *>i 1.1.1.1/32 10.0.34.3 0 100 0 100i * i 10.0.24.2 0 100 0 123 123 12 3 100i *> 4.4.4.4/32 0.0.0.0 0 0 i
經過路由表能夠看出此時R4去往R1的路由已經改走R3了!
若是但願R1去往R4的路由該走R3,可使用MED屬性控制R1的路由選路,使R1去往R4從R2該走R3。查看以前的配置會發現從R1去往R4走R2。,經過如下配置能夠實現:
R2的配置以下:
[R2]route-policy med permit node 10 Info: New Sequence of this List. [R2-route-policy]apply cost + 50 [R2-route-policy]quit [R2]bgp 200 [R2-bgp]peer 10.0.12.1 route-policy med export [R2-bgp]quit [R2]quit <R2>reset bgp all
查看R1的BGP路由表:
[R1]dis bgp routing-table BGP Local router ID is 1.1.1.1 Status codes: * - valid, > - best, d - damped, h - history, i - internal, s - suppressed, S - Stale Origin : i - IGP, e - EGP, ? - incomplete Total Number of Routes: 3 Network NextHop MED LocPrf PrefVal Path/Ogn *> 1.1.1.1/32 0.0.0.0 0 0 i *> 4.4.4.4/32 10.0.13.3 0 200i * 10.0.12.2 50 0 200i
實驗完成!
經過實驗不難發現:BGP控制選路主要是經過BGP屬性值的調整完成的。BGP包含大量的屬性,而這些屬性直接影響選路,因此BGP相對於ICP來講具備更強大控制能力。須要注意的是: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 」這條命令,須要跳幾下就把數值設置爲幾就行,能夠比實際跳數大,可是不能比實際跳數小。
———————— 本文至此結束,感謝閱讀 ————————