文章目錄
CCNP7:BGP的【特點、數據包、工作過程、路由黑洞、防環機制、配置、MA網絡中下一跳問題】
一、BGP、AS概述:
BGP網關路由協議是無類別路徑矢量的EGP協議。
在談BGP之前我們談一下AS自治系統,一個自治系統就是一個範圍。之所以會出現這麼一個東西,是因爲我們不能將全球的網絡運行在一個很大的網絡中。
因此我們需要將這個很大網絡劃分爲若干個小的區域,這個小區域就是AS,然後AS內部跑IGP協議,當需要訪問外部的其它區域時,這時EGP登場了,它負責每個AS之間的通信。
因此當AS號少的時候就會導致網絡面積大、網絡延時、卡頓。
要區別AS,那麼AS一定要有編號。編號範圍:0-65535,其中1-64511爲公有,64512-65535爲私有
這個網站每天都會更新,這個網站可以查出AS號、IPv4、IPv6部署、規劃情況:CIDR Report
最底下有一個搜索引擎,我們可以查出中國所擁有的AS號。
4134-中國第一個AS號,中國電信的第一個AS號。
9929-中國網通的第一個AS號。
EGP協議的三大特性 |
---|
1、可控性:EGP協議共享其它協議產生的路由,正常不關注選路。 |
2、可靠性:EGP使用增量更新,依靠TCP的三次握手,使用單播非直連建鄰,EGP承載於IGP之上 |
3、AS-BY-AS,以一個AS爲一跳,一個條目在AS內部屬性不變(保證BGP無環的最大意義) |
我們可以理解BGP協議是一個公平的重發布協議,它不生產路由,它只是路由的搬運工。
這是有關IGP、EGP的協議:
IGP | OSPF、EIGRP、RIP、ISIS、IGRP |
---|---|
EGP | EGP、BGP |
我們說EGP,EGP是最早的AS間的協議,擁有兩個版本,版本1、版本2。版本2之後就有了BGP,經過多年的使用,BGP已經到V4版本了。因此,我這裏講的也是BGPv4版。
二、BGP特點:
藍色字體比較重要:
BGP特點: |
---|
1、無類別路徑矢量,其實就是距離矢量(共享路由)的升級版,使用AS號作爲跳數 |
2、使用單播更新來發送所有信息,基於TCP179端口工作 |
3、使用增量更新——僅觸發無週期 |
4、具有豐富的屬性來取代IGP中度量進行選路,使用多個參數控制協議 |
5、可控性——可以在進項和出項對流量實施強大的策略 |
6、默認BGP不被用於負載均衡,通過各種選路規則僅僅產生一條最佳路徑 |
7、BGP支持認證和聚合(彙總) |
三、BGP的數據包:
首先我們要知道的就是BGP所有的數據包是基於TCP傳輸。
包名 | 作用 | 詳細 |
---|---|---|
Open | 建鄰 | 存在hold time 和 RID,用於鄰居關係建立,默認僅收發一次即可 |
Keeplive | 保活 | 保活週期 1分鐘,保活的是TCP會話,hold time 3分鐘 |
Update | 更新 | 更新包:包含路由條目:目標網絡號+屬性 |
Notification | 報錯 | 報錯包會在錯誤信息出現時發送 |
四、BGP的工作過程:
BGP的工作過程: |
---|
1、首先要IP可達,也就是建鄰設備間可以通訊 |
2、通過三次握手建立TCP的會話 |
3、收發BGP的Open報文,建立鄰居關係生成鄰居表 |
4、使用Update報文共享本地的路由信息給鄰居,生成BGP表:表中包含所有本地發出及接收到的路由信息 |
5、默認將BGP表中最優路徑加載於路由表中,之後收斂完成,僅Keeplive週期保活即可。 |
6、若存在錯誤的配置或策略時,BP協議將使用Notification包來進行報錯。 |
結構突變 | 調整 |
---|---|
新增 | 最先學習到新增網段的BGP設備,使用Update包共享條目即可。 |
斷開 | 最先知道斷開網段的BGP設備,使用Update包共享信息即可。 |
無法通訊 (設備斷電) |
hold time 到時時,斷開鄰居關係和TCP會話,然後刪除所有從該鄰居學習到的信息。 |
用個圖來說明一下:
有關名詞註解:
對等體:peers,在BGP中因爲可以非直連建鄰,故鄰居也被稱爲對等體。
EBGP:不同AS間的BGP鄰居關係,管理距離爲20
IBGP:同一AS內部建立的BGP鄰居關係,管理距離爲200
五、BGP的路由黑洞:
1、路由黑洞:
從這個圖中,我們可以看到總共有3個AS自治系統,中間的自治系統中:B、E兩臺設備運行了BGP,而D、C並沒有運行BGP。B和E之間通過非直連建鄰,它們之間的關係是IBGP。
接下來說說路由黑洞是怎樣產生的:
上圖在說明一個問題:當A新出現一個環回(X網段)的時候,該環回被B學習到,B通過TCP單播發給E,進而被E學習到,之後F就有了去X的路由。
當F要訪問X網段的時候,比如說F要ping X網段。F的下一跳是E,在BGP中E的下一跳是B,但是路由器查表的規則是遞歸查詢,實際流量的下一跳是C、D,接着E把流量交給C、D。
但是問題來了,C、D根本沒有學習到去往X的路由,流量就會被C、D所扔掉。此時路由黑洞出現,而C、D的存在就是造成路由黑洞的主要原因。
總結一下BGP的路由黑洞的出現原因:
因爲BGP協議可以非直連建鄰,這樣在一個AS內部就運行出現不運行BGP協議的路由,導致BGP可以鄰居間正常傳遞路由,實現控制層面可達,但數據層面在未運行BGP協議的設備上不可達。
2、解決方案:
序號 | 解決方案 | 評價 |
---|---|---|
1 | 最佳方案:MPLS多協議標籤交換 | |
2 | 物理鏈路全連:所有BGP設備間直連,不存在非直連建鄰(直接相連倆BGP設備) | 如果可以,就可以 |
3 | 鄰居關係全連:所有設備運行BGP | 不現實 |
4 | 將BGP路由條目重發布到IGP(純實驗環境可以考慮) | 更不現實 |
5 | tunnel:在公網中,所有走BGP的時候加上一個包頭,但這就會導致整個網絡很差勁。 | 原理上可講通,但實際不可行 |
六、BGP防環機制(水平分割):
1、EBGP水平分割:
EBGP水平分割,防止EBGP鄰居間的環路。它在BGP協議的屬性中存在一個AS-path屬性,記錄經過的每一個AS號。接收到的路由條目中,若存在本地的AS號將拒絕接收。
2、IBGP水平分割:
基於AS-BY-AS規則,一條路由在一個AS內部傳遞時,默認屬性無變化。
IBGP水平分割規則:從一臺IBGP鄰居處學習到的路由不得傳遞給另一個IBGP鄰居。
或者是下面這種情況:
注:該規則迫使全網所有BGP設備間均需要進行鄰居關係建立配置,配置量幾何增長,可以使用聯邦、和路由反射器來打破。
七、BGP的配置:
下面的配置我會以這個圖爲依據,所有設備都有環回,均運行OSPF,且同在一個區域0。R5~R6之間有兩根網線。
1、BGP建立鄰居關係:
(1)直連的EBGP鄰居關係建立:
因爲單播建鄰,因此建立鄰居關係和宣告路由是分開進行的。
建鄰是雙向的,兩邊都要配置
//啓動協議時攜帶真實的AS號,無多進程概念,一個設備只能配置一個AS
R1(config)#router bgp 1
//配置RID,如果不配置,則使用環回接口,最後爲物理接口作爲RID
R1(config-router)#bgp router-id 1.1.1.1
//直連的EBGP鄰居關係建立:鄰居接口的IP,及所在AS
R1(config-router)#neighbor 12.1.1.2 remote-as 2
建鄰配置完成後,鄰居間通過三次握手建立TCP會話:
R1#show tcp brief
TCB Local Address Foreign Address (state)
6427FFF0 12.1.1.1.179 12.1.1.2.36113 ESTAB
兩端均爲向另一端發起TCP會話建立請求,但將隨機斷開一條,上面的信息說明R2是找R1建的鄰。
TCP會話建立後,BGP協議將發出open報文,建立BGP的鄰居關係生成鄰居表
//查看BGP鄰居表
R1#show ip bgp neighbors
但是由於此表過大,因此我們需要查看簡表:
//查看bgp彙總信息
R1#show ip bgp summary
從圖中可以看出它包含本地bgp RID,本地AS號,BGP的表版本爲1,bgp 版本爲4。
最右側的State/PfxRcd表示狀態:
此處的阿拉伯數字標識從該鄰居處學習到的路由條目數量,此處(數字、Idle、active)若爲數字也同時標識已經建立了鄰居關係。
(2)IBGP鄰居關係建立:
在實際網絡中,IBGP鄰居間一般存在多條路徑,使用環回接口地址作爲源、目標地址來建立鄰居關係,可以同時基於多條路徑傳輸,且鄰居關係更穩定。
建鄰是雙向的,兩邊都需要配置:
R2(config)#router bgp 2
R2(config-router)#neighbor 3.3.3.3 remote-as 2
//一旦將目標地址修改爲對端環回接口,本地也需要將源地址修改爲本地的環回接口。
R2(config-router)#neighbor 3.3.3.3 update-source loopback 0
比如說下圖,如果以兩臺邊界設備的接口來建立IBGP,一旦物理鏈路一斷,它們的鄰居關係就會斷開。
而使用環回,就是穩定。雖然bgp的下一跳只有一個,但是流量遞歸以後實際走的是兩條鏈路,還提升了鏈路利用率。即使斷一條也沒有關係,鄰居關係還存在。
(3)EBGP鄰居間多條鏈路建鄰:
爲了保證EBGP鄰居間關係的穩定,EBGP鄰居間也會存在多條鏈路,爲了同時使用這些鏈路,建議使用環回接口作爲源、目IP地址建立鄰居關係。
建鄰過程分2步:
①IP可達:
但是這裏存在一個問題,使用兩臺設備的環回建鄰,但是大家都不在相同的AS中,一般爲了使IP可達,常使用靜態路由。
兩邊都要配置靜態:
R5(config)#ip route 6.6.6.0 255.255.255.0 56.1.1.2
R5(config)#ip route 6.6.6.0 255.255.255.0 65.1.1.2
②使用環回建立BGP鄰居關係:
兩邊都需要配置:
R5(config-router)#neighbor 6.6.6.6 remote-as 3
R5(config-router)#neighbor 6.6.6.6 update-source loopback 0
③修改TTL值:
默認IBGP鄰居間數據包TTL=255,EBGP鄰居間TTL=1,故一旦使用環回地址建立EBGP鄰居關係,那麼必須修改TTL值。
//後面的數字2即表示TTL值,如果不設置則默認爲255
R5(config-router)#neighbor 5.5.5.5 ebgp-multihop 2
2、BGP的路由宣告:
R1(config)#router bgp 1
R1(config-router)#network 1.1.1.0 mask 255.255.255.0
切記:BGP協議只能逐條宣告本地路由表中的內容(不關注路由條目的產生方式),宣告時必須和表中的記錄完全一致。
一旦進行了路由條目的宣告,本地就生成BGP表。BGP表中包含本地收發到的所有路由條目,基於Update發送
//查看BGP表
R1#show ip bgp
關於狀態的想詳細解釋:
* 的位置顯示 | 註解: |
---|---|
* | 條目可用,可以加到路由表 |
r | 條目不可用,不裝載:標識本地路由表已經通過更好的方式獲取路由。 |
s | 條目不可用,被抑制:人爲的策略限制條目的傳遞 |
其他位置 | 註解: |
---|---|
> | 標識條目優秀:可以加載到路由表,可以傳遞給鄰居。 |
i | 該條目是從IBGP處學習到的路由。 |
注意:條目必須 即優且可用 纔可以加表,僅優 便可傳遞。前提爲不能被s抑制,就是沒有做策略。
成爲優秀的條件:
①同步問題:
本地IGP已經學習到了該BGP路由才能優,該規則的目的在於避免路由黑洞,但條件苛刻故在IOS版本12.2(8)T以上默認關閉。
R3(config)#router bgp 2
R3(config-router)#no synchronization
②下一跳可達問題:
因爲AS-BY-AS,條目在傳遞給IBGP鄰居時,屬性默認不變,故從IBGP鄰居學習到的路由,下一跳不變。當路由傳遞給EBGP鄰居時,下一跳自動修改爲本地。
當存在這個問題時,R3看到的路由的下一跳是12.1.1.1,但問題是R3根本沒有去往該網段的路由。
此時我們就需要讓R2把路由傳遞給鄰居R3時,修改屬性中的下一跳地址爲本地R2。
R2(config)#router bgp 2
R2(config-router)#neighbor 3.3.3.3 next-hop-self
這樣R3就可以加表了。
注意:這樣修改下一跳爲本地,只是單方向的(R2給R3),如果是從R3給R2則需要在R3上配置到R2修改下一跳爲本地。
它的路由表如下:注意IBGP的度量爲200。
由於存在IBGP水平分割,因此雖然R3加了表,有了路由,但是它不會給R4。因此我們需要R2和R4之間建立一個IBGP
R2、R4之間建立了IBGP鄰居後,同樣的需要在R2上進行配置,告訴R4修改下一跳爲本地。
同理,除之前所建鄰居外,還有這張圖中的其他鄰居也要建鄰,然後也要修改下一跳爲本地。而R5和R6是不受水平分割限制的,R6肯定會優,因爲R5會自動修改下一跳爲自己,它們之間的關係是EBGP。
八、BGP在MA網絡中的下一跳問題:
這張圖中,黑色線條表明了物理鏈路,R3、R4之間使用串線,而R1、R2、R3之間使用以太網線,它們處在MA網段。綠色線條表明IBGP關係,而藍色線條表明了EBGP關係。
R4把它的環回傳給R3、R3再傳給R2、R2再傳給R1,根據水平分割來講,R1去往R4的環回下一跳是R2,因爲是R2給的。
但是我們將所有配置配置好後,然後發現R1的下一跳不是R2,而是R3,這就是MA網段中下一跳問題。
在MA網絡中,ICMP重定向將幫助BGP學習到最佳的下一跳。
九、其他
1、軟、硬重啓:
配置 | 註解 |
---|---|
R1#debug ip bgp updates | 動態查看BGP更新包 |
R1#clear ip bgp * | 硬重啓(慎用),重啓本地所有鄰居間的TCP會話,重建TCP會話會很慢。 |
R1#clear ip bgp * soft [in/out] | 軟重啓,僅和本地所有鄰居間重新收發路由,不斷開任何關係,做策略很有用。 後面加in表示收路由,而out表示發路由 |
R1#clear ip bgp 3.3.3.3 | 僅和3.3.3.3鄰居進行硬重啓 |
R1#clear ip bgp 3.3.3.3 soft | 僅和3.3.3.3鄰居進行軟重啓 |
2、查看本地發送、接收的路由信息:
之前我們也看到,BGP的表格過大,因此需要篩選,可以使用以下配置進行篩選。
//僅查看本地發送給鄰居123.1.1.2的路由信息
R1#show ip bgp neighbors 123.1.1.2 advertised-routes
//要想查看本地從xxx.x.x.x的接收的路由,也可以。但是我們知道路由會很多的,因此我們需要配置專門的儲存空間來裝載,建議查看完成後刪除該空間
R1(config-router)#neighbor 123.1.1.2 soft-reconfiguration inbound
//查看本地從xxx.x.x.x的接收的路由
R1#show ip bgp neighbors 123.1.1.2 received-routes