一、概述及相關術語
BGP概念
BGP——邊界網關路由協議,是一種基于策略的路徑矢量路由協議(可以理解為距離矢量型協議的升級版),BGP在確定最佳路徑時考慮的不是速度,而是讓AS能夠根據多種BGP屬性來控制數據流的傳輸。
BGP的主旨是提供一種域間路由選擇系統,確保自治系統只能夠無環地交換路由選擇信息,BGP路由器交換有關前往目標網絡的路徑信息。
BGP是一種解決大型網絡的EGP協議,本身并不產生路由,只是傳遞路由信息,因為基于TCP傳輸,故不需要物理直連(但TCP一定要可達)。
BGP相關術語
1.自治系統:自治系統就是處于一個管理機構控制之下的路由器和網絡群組。它可以是一個路由器直接連接到一個LAN上,同時也連到Internet上;它可以是一個由企業骨干網互連的多個局域網。在一個自治系統中的所有路由器必須相互連接,運行相同的路由協議,同時分配同一個自治系統編號。
BGP將每個自治系統看作路由一個節點。
2.AS號:自治系統號為一16位的數字范圍為1–65535,私有自治系統號64512~65535,在Internet上不可路由。
自治系統號可以防環,運行BGP的路由器不會接收路徑列表中包含自己AS號的路由更新信息,因為這個路由已經穿過了自己的AS,再次接收這個路由信息就會造成環路,所以當BGP路由器收到含有自己AS號的路由信息的數據包時會丟棄從而防環。
3.BGP和IGP:ISP(網絡服務提供商)和他的客戶通常會使用一種IGP來進行他們的網絡內部路由信息。客戶與同一ISP下的另一客戶,客戶與Internet,ISP與ISP之間進行路由交換時會使用到BGP。
PS:IGP路由協議主要使命在路由的自動發現和計算上,而BGP主要在路由的控制和選擇上。
4.BGP發言者(BGP Speaker):發送BGP消息的路由器稱為BGP發言者,它接收或者產生新的路由信息,并發布給其他BGP發言者。
5.Router ID(RID):Router ID是一個32位比特無符號的整數,用來在自治系統中唯一標識一臺路由器。路由器如果運行BGP協議,則必須存在Router ID。Router ID可以是手工配置或者是路由協議自動選舉。
6.BGP對等體(BGP Peer):相互交換消息的BGP發言者之間互稱對等體(Peer)。
7.IBGP對等體(Internal BGP Peer):如果BGP對等體處于同一自治系統內,被稱為IBGP對等體。
8.EBGP對等體(External BGP Peer):BGP對等體處于不同自治系統時,被稱為EBGP對等體。
9.IGP:內部網關路由選擇協議:RIP、OSPF、ISIS等
10.EGP:外部網關路由選擇協議
關于BGP的兩類對等體
BGP對等體也稱為BGP鄰居,EBGP對等體也稱為EBGP鄰居,IBGP對等體也稱為IBGP鄰居。
EBGP對等體
處于不同AS的BGP對等體為EBGP對等體,通常情況下EBGP對等體是物理上直連。AS間通信的BGP鄰居必須處于相同的物理網絡。
BGP Speaker從EBGP對等體獲得的路由會向它所有BGP對等體通告(包括EBGP和IBGP);同時為了防止環路,他不會將學習到的路由再向原發布者發布。
建立eBGP鄰居關系的要求:
不同的AS號:不同AS號之間的BGP路由器才能建立起BGP外部連接
指定鄰居:默認鄰居間連接關系為直連,為網絡的健壯性可以將Loopback口的IP設為neighbor address,需要用ebgp多跳技術來實現
可達性:在開始交換BGP路由更新之前,必須先建立TCP會話,BGP的數據必須能到達BGP鄰居處
IBGP對等體
處于同一個AS的BGP對等體為IBGP對等體(或者是IBGP鄰居)IBGP對等體不一定是物理直連,但是一定要TCP可達。
建立iBGP鄰居關系的要求:
相同的AS號
指定鄰居
可達性
由于物理接口的不穩定性,neighbor 所指向的IP地址可能會down掉,所以可以使用本地環回接口作為BGP鄰居neighbor。
為了防止環路,BGP協議規定BGP發言者從IBGP獲得的路由不向它的IBGP對等體發布。
另外為了防止路由黑洞的產生,協議還規定BGP發言者從IBGP獲得的路由是否發布給它的EBGP對等體與BGP是否同步相關。
補充:路由黑洞
路由黑洞一般是在網絡邊界做匯總回程路由的時候產生的一種不太愿意出現的現象,就是匯總的時候有時會有一些網段并不在內網中存在,但是又包含在匯總后的網段中,如果在這個匯總的邊界設備上同時還配置了缺省路由,就可能出現一些問題。這時,如果有數據包發向那些不在內網出現的網段(但是又包含在匯總網段)所在的路由器,根據最長匹配原則,并沒有找到對應的路由,只能根據默認路由又回到原來的路由器,這就形成了環路,直到TTL值超時,丟棄。
路由黑洞解決辦法:運營商核心網MPLS LDP,完美的解決方案。
IBGP的全連接
BGP會話是基于TCP的點到點的單播鏈接
TCP的可靠傳輸機制和滑動窗口機制可以確保承載與TCP之上的BGP可以可靠傳遞大量路由。但是TCP鏈接是點到點的單播方式來進行報文傳輸的,因此BGP鏈接只能是基于點到點的鏈接。同時BGP是一種距離矢量路由協議,為了防止產生路由環路,協議規定BGP發言者從IBGP對等體獲得的路由不能向其他的IBGP對等體發布。這樣,在運行了BGP協議的AS內,為了確保所有BGP路由器的路由信息向,則需要使所有的IBGP路由器保持全連接。
二、BGP特性
由TCP承載
BGP將TCP用作他的傳輸協議(唯一用TCP作為傳輸協議的路由協議),TCP為BGP提供了面向連接的可靠的傳輸。所有BGP認為他所有的通信都是可靠的,不存在控制差錯和錯誤重傳機制,BGP使用179號端口(目的端口),數據封存在TCP分段中,然后這些數據在被封裝入IP數據包中。
BGP在接收更新分組的時候,TCP使用滑動窗口,接收方在發送方窗口達到一半的時候進行確定,不同于OSPF等路由協議使用1-to-1窗口。
補充:
BGP單播建鄰居,TCP 179端口 工作在OSI4層
RIP UDP 520端口 工作在4層
OSPF IP 89端口 工作在3層
ISIS 組播mac 工作在2層
只發送增量路由更新
在鄰居關系建立后,BGP路由會將自己的全部路由信息通告給鄰居,此后如果路由表發生了變化,則只將增量部分發送給鄰居。這樣可以大大減少BGP傳播路由所占用的帶寬,以利于在Internet上傳播大量的路由信息,并降低路由器CPU與內存的消耗。
在可靠的鏈路上不需要使用定期更新,所以BGP使用觸發更新。
路由過濾和路由策略
與IGP不同的是,BGP最重要的特性是豐富的路由屬性以及強大的路由過濾和路由策略。通過路由策略等方法,來更改路由屬性,或者是根據路由更新信息中的屬性來實現路由過濾和路由策略,從而使BGP的使用者可以非常靈活地對路由進行選路和控制。
支持CIDR和路由聚合
可以將一些連續的子網聚合成較大的子網(突破了自然分類的限制),從而可以在一定程度上控制路由表的快速增長,并降低了路由查找的復雜度。
三、BGP消息
Open(初始)
Keepalive(保活)
Update(更新)
Notification(通知)
Route-refresh
Open(初始)
初始消息在對等路由器間打開一個BGP通信會話,是建立傳輸協議后發送的第一個消息,用于建立BGP對等體之間的鏈接關系和協商BGP參數(包含hold-time,router-id),默認僅發送一次。
初始消息由對等設備發送的keep-alive消息確認,且必須得到確認后才可以交換更新、通知和keep-alive消息。
初始消息包含的內容
版本號:8比特,用來標識BGP版本,目前一般使用的為BGP第四版本(高版本兼容低版本)。
本地AS:長16比特位,指明了發送方的AS號,如果不是期待的版本號,BGP會話就會斷開。
保持時間:保持時間內若沒有收到下一個存活消息或更新消息BGP會話將斷開(默認180S)
BGP路由器識別符:路由器ID,選擇方式與OSPF類似(3種方法)
可選參數:長度字段,指明了可選參數字段的總字節數。目前只定義了一個可選參數類型:認證信息。
認證信息含有下列兩個域:認證碼:標識使用的認證類型。認證數據:包含由認證機制使用的數據。
Keepalive(存活)
BGP會周期性(默認60s發送一次)的向對等體發出Keepalive消息,主要作用就是讓BGP鄰居知道自己的存在,保持鄰居關系的穩定。
另外一個作用就是對收到的Open消息的回應。
消息格式中只包含消息頭,沒有附件任何字段。長度為19字節,消息只有標記、長度、類型,不包括數據域。
Update(更新)
攜帶的是路由更新(刪減、增加)信息。
主要用于在對等體之間交換路由信息。它既可以發布可達路由信息,也可以發布不可達路由消息;一條Update消息可以通告一類具有相同路徑屬性的可達路由,同時還可以攜帶多條不可達路由。
更新消息包含的內容
撤銷路由:(如果之前存在的話)IP地址前綴列表,不再為這些前綴提供路由
路徑屬性:也就是AS-Path,源(origin),本地優先級等.屬性類型和屬性值(TLV)
NLIR(網絡層可達信息):網絡列表(IP地址前綴長度),表示通過這條路徑可達的網絡
Notification(通知)
Notification的作用就是錯誤通知。BGP發言者如果檢測到對方發過來的消息有錯誤或者主動斷開BGP鏈接,都會發出Notification消息來通知BGP鄰居,并關閉鏈接回到idle狀態。
如果收到鄰居發來的 Notification消息,也會將鏈接狀態變為idle。
Route-refresh
要求對等體重新發送指定地址族的路由信息。
四、BGP對等體建立過程
正常情況下:IdleConnectOpensentOpenconfirmEstablished
Idle(空閑)
在Idle狀態下,BGP拒絕鄰居發送的連接請求。只有在收到本設備的Start事件后,BGP才開始嘗試和其它BGP對等體進行TCP連接,并轉至Connect狀態。
PS:Start事件是由一個操作者配置一個BGP過程,或者重置一個已經存在的過程或者路由器軟件重置BGP過程引起的。任何狀態中收到Notification報文或TCP拆鏈通知等Error事件后,BGP都會轉至Idle狀態。
Connect(連接狀態)
TCP三次握手,TCP三次握手未完成BGP啟動連接重傳定時器(Connect Retry),等待TCP完成連接。
TCP連接成功,那么BGP向對等體發送Open報文,并轉至OpenSent狀態。
TCP連接失敗,重置重傳定時器Connect Retry,偵聽是否有對等體啟動連接,那么BGP轉至Active狀態。
如果連接重傳定時器超時,BGP仍沒有收到BGP對等體的響應,那么BGP繼續嘗試和其它BGP對等體進行TCP連接,停留在Connect狀態。
Opensent(Open消息已發送)
TCP的三次握手成功,發OPEN報文協商BGP相關參數(AS,version,auth) 。BGP等待對等體的Open報文,并對收到的Open報文中的AS號、版本號、認證碼等進行檢查。如果收到的Open報文正確,那么BGP發送Keepalive報文,并轉至OpenConfirm狀態。如果發現收到的Open報文有錯誤,那么BGP發送Notification報文給對等體,并轉至Idle狀態。
Active(活躍狀態)
這個狀態下, BGP初始化TCP連接來獲得一個對等體。如果連接成功,本地清空Connect Retry計時器,并向對等體發送OPEN報文,并轉至OpenSent狀態。
Openconfirm(Open消息已確認)
BGP等待Keepalive或Notification報文。
如果收到Keepalive報文,則轉至Established狀態,并重置HoldTime定時器。
如果KeepAlive定時器超時則重置并發送KeepAlive消息。
如果收到Notification報文,則轉至Idle狀態。
Established(連接建立)
BGP可以和對等體交換Update、Keepalive、Route-refresh報文和Notification報文。如果收到正確的Update或Keepalive報文,那么BGP就認為對端處于正常運行狀態,將保持BGP連接。如果收到錯誤的Update或Keepalive報文,那么BGP發送Notification報文通知對端,并轉至Idle狀態。Route-refresh報文不會改變BGP狀態。如果收到Notification報文,那么BGP轉至Idle狀態。如果收到TCP拆鏈通知,那么BGP斷開連接,轉至Idle狀態。
五、BGP同步(BGP Synchronization)
規則要求:
在BGP同步打開的情況下,一個BGP路由器不會把那些通過IBGP鄰居學到的BGP路由通告給自己的EBGP鄰居;除非自己的IGP路由表中存在這些路由,才可以向EBGP路由器通告。
同步規則要求BGP庫與IGP庫同步。這么做是為了使AS內的所有路由器都能達到同步,確保能夠轉發其它AS因使用該AS通告的路由而發送到該AS的那些數據。BGP同步規則也保證了整個AS中路由信息的一致性,避免了AS內的路由“黑洞”。
示例:如上圖所示:首先,RTB通過EBGP鄰居關系,獲得了去往AS100的路由信息,例如,去往AS100中的10.1.1.1/24,RTB會把這樣的路由信息通告給RTE,RTE收到從RTB通告來的去往自治系統AS100的路由信息10.1.1.1/24。對于RTE來說,她在考慮是否把這樣的路由信息通告給她的EBGP鄰居RTF時,就需要考慮同步問題。這里的同步是指:RTE如果能通過IGP(內部網關協議,如OSPF協議)獲得去往10.1.1.1/24的路由,我們就認為EGP(外部網關協議,如BGP協議)和IGP同步。在同步情況下,RTE可以將路由信息10.1.1.1/24通告給RTF。否則,不能通告。
依然用上面的例子來解釋,如果RTE不考慮同步問題,直接將路由信息10.1.1.1/24 通告給RTF,那么RTF的路由表中就會記錄一條去往10.1.1.1/24的路由信息,下一跳是指向RTE的。這樣問題就會出現:RTF有一去往10.1.1.1/24的數據包,RTF通過查看路由表,把這一數據包轉發給RTE。如果沒有同步,RTE的路由表中也會有去往10.1.1.1/24的表項,但是這一表項的下一跳是直接指向RTB的S0接口的(因為BGP是以一個自治系統為一跳的)。在不同步的情況下,RTE是無法直接去往此路由的下一跳的(因為RTE沒有去往10.1.1.1/24的路由)。這里有個概念叫下一跳不可達,就是指這種情況。
為了解決下一跳不可達的情況,可以:
將BGP路由引入IGP中,當然這樣的做法一般不采用,應為BGP的路由信息量很大,對于IGP來說負擔太重。
增加靜態路由,當網絡不算復雜時可行,如果網絡規模較大,解決起來就很困難了。
BGP可以通過命令來強制修改下一跳,在RTE上將去往10.1.1.1/24的下一跳強制修改為RTE自身的接口,同時,需要靜態配置,時RTE的路由表中有去往10.1.1.1/24的路由。從EBGP鄰居學習到的路由會傳遞給我的IBGP鄰居,下一跳不變,還是EBGP鄰居,需要使用next-hop-self改變。
這個問題的徹底解決是在BGP和MPLS聯手以后的事情,本文不過多討論。
六、BGP路由通告原則
連接一建立, BGPSpeaker將把自己所有BGP路由通告給新對等體(在遵守以下規則的前提下)。只有明確通告的網絡才會發送給鄰居,通告的網絡必須能夠精確地在路由表中找到。
多條路徑時,BGPSpeaker只選最優的加入路由表,即BGP Speaker只把自己使用的最優路由通告給對等體。
為了防止環路,BGP協議規定BGP發言者從IBGP獲得的路由不向它的IBGP對等體發布。
BGP Speaker從EBGP對等體獲得的路由會向它所有BGP對等體通告(包括EBGP和IBGP);同時為了防止環路,他不會將學習到的路由再向原發布者發布。
BGP Speaker從IBGP獲得的路由是否通告給它的EBGP對等體要依IGP和BGP同步的情況來決定。
從IBGP獲得的路由僅發布給它的EBGP對等體:
關閉BGP同步的情況下,IBGP路由被直接發布 開啟BGP同步的情況下,該IBGP路由只有在IGP也發布了這條路由時才會被發布給EBGP對等體 (默認情況下同步未開啟) 多條路徑時,只有最優的才傳給EBGP鄰居
七、BGP的三張表
鄰居表(adjancy table)——show ip bgp summary(簡單鄰居),show ip bgp neighbor(詳細鄰居)
BGP表(forwarding database)——show ip bgp:BGP默認不做負載均衡,會選出一條最優的,放入路由表
路由表(routing table)——show ip route
BGP表
status codes是最前面的,包括s,d,h,*,>,i,r,S
origin codes是后面path列,包括i,e,?
(注意大小寫)
第一列
*:可用的
R:不可用,從更小AD值的IGP中學到了該路由,因此不用BGP路由
S:表示該條目被抑制,通常因為這條路由有匯總路由,且該匯總路由被限制了
D:表示該條目因懲罰而現在處于抑制狀態,因為他可用和不可用狀態切換過于頻繁,可能這條路由現在可用,但是在懲罰期間不會通告該條路由
H:表示歷史,表示這條路徑不可用并且已經失效。歷史信息還在,但最佳路由可能已經沒有了。
第二列
>:最優的,要確保>號出來,才能放進路由表,才能繼續傳給EBGP鄰居。
Next Hop
表示下一跳地址,路由表與他同步 若為0.0.0.0 則該網絡是本地通告的。
Metric 度量值
MED,影響別的自治系統如何進入本自治系統(后面會說)
LocPrf 本地優先級
決定本自治系統中的流量如何出去,默認為100,到外部的路由條目才會顯示,本地通告的路由顯示為空。
權重
默認為0,本地通告(源自本地的)的權重為32768。
最后一列
i:則表明是通過network命令將這個網絡引入。
e:說明源路由器是從EGP學到這個網絡的。
?:則無法確定這個網絡的可達性,因為是IGP重分發進BGP的。
0(空,0是和上面做區分):若為空則說明是本地通告的條目。
沒有>號的路由非優化的:不會放進路由表,不會給其他鄰居傳遞
示例如下圖:
BGP表中路由最優的條件(即出現>號的條件:關同步——next-hop-self)
實際上就是在討論從IBGP收到的路由,是否有資格放入路由表,是否能傳給后面的IBGP/EBGP鄰居的問題。
只有解決“IBGP下一跳可達性問題,以及路由黑洞問題 ”這2個問題才能優化。
方法:
首先確保下一跳可達,next-hop-self或者靜態指向EBGP下一跳地址。 然后:方法一,同步+BGP重發布到IGP;方法二,同步+寫靜態欺騙;方法三,關同步(關同步后黑洞問題仍然存在,可以通過fullmesh或者mpls解決)。
八、BGP引入IGP路由
BGP協議本身不發現路由,因此需要將其他路由引入到BGP路由表,實現AS間的路由互通。當一個AS需要將路由發布給其他AS時,AS邊緣路由器會在BGP路由表中引入IGP的路由。為了更好的規劃網絡,BGP在引入IGP的路由時,可以使用路由策略進行路由過濾和路由屬性設置,也可以設置MED值指導EBGP對等體判斷流量進入AS時選路。
方法:
Network宣告:逐條將IP路由表中已經存在的路由通告到BGP路由表中。
BGP network的作用:在路由器的當前IP路由表中查找與network命令中參數完全匹配的路由,如果存在,就將等價的NLRI注入到本地BGP表中,IP表中的直連路由,靜態路由,IGP路由都可以進入到BGP表中。
Import引入:根據運行的路由協議(RIP,OSPF,ISIS等)將路由引入到BGP路由表中,同時import命令還可以引入直連和靜態路由。
auto-summary對于redistribute以及network的影響
redistribute從IGP,靜態路由或直連路由重分布路由,可以對重分布進的路由利用路由映射表進行過濾篩選。
重分發進的路由的下一跳地址,要么與重分發的路由器的下一跳地址匹配,要么為0.0.0.0表示是該路由器直連的鏈路。
此外,aggregate-address 以及 default-information originate(默認路由引入)也能引入本地IGP
network:逐條將IP路由表中已經存在的路由通告到BGP路由表中。
BGP的 auto-summary 命令,僅匯總該路由器通過重分發操作進入BGP表的路由。
對于network和重分發兩種方式,具體auto-summary的操作是不一樣的,開啟auto-summary后:
對于network來說,如果network命令列出了有類網絡號(可以歸結為A/B/C/D類的IP地址)以及有類默認掩碼或者無掩碼,并且該有類網絡的子網存在,那么就注入該有類網絡。
對于重分發來說,如果重分發有類網絡的任意子網,那么并不重分發該子網而是重分發該有類網絡
開啟匯總下進行network時,所有子類網絡會被通告,子類網絡所在的主類網絡也會被通告 。
開啟匯總下進行重分發時,所有子類網絡都不會被通告,只會通告主類網絡。
例如:
當使用network向BGP中注入一條路由時,如果沒有開啟自動匯總那么,只有與路由表中前綴和前綴長度精確匹配的network命令才會進入BGP表,開啟之后,當配置一個有類網絡的子網時,BGP表中會同時出現主類網絡的子網和該主類網絡。
當使用重分發向BGP中注入一條路由 10.1.1.0/16,此時默認沒有開啟自動匯總,那么show ip bgp 中顯示的為 10.1.1.0/16 的信息,而如果當開啟匯總之后,顯示的將為10.0.0.0/8這個主類路由。
九、BGP安全性
BGP使用認證和通用TTL安全保護機制GTSM(Generalized TTL Security Mechanism)兩個方法保證BGP對等體間的交互安全。
BGP認證
BGP認證分為MD5認證和Keychain認證,對BGP對等體關系進行認證是提高安全性的有效手段。
MD5認證只能為TCP連接設置認證密碼。
Keychain認證除了可以為TCP連接設置認證密碼外,還可以對BGP協議報文進行認證。
BGP GTSM
BGP GTSM檢測IP報文頭中的TTL(time-to-live)值是否在一個預先設置好的特定范圍內,并對不符合TTL值范圍的報文進行允許通過或丟棄的操作,從而實現了保護IP層以上業務,增強系統安全性的目的。
例如將IBGP對等體的報文的TTL的范圍設為254至255。當攻擊者模擬合法的BGP協議報文,對設備不斷的發送報文進行攻擊時,TTL值必然小于254。如果沒有使能BGP GTSM功能,設備收到這些報文后,發現是發送給本機的報文,會直接上送控制層面處理。這時將會因為控制層面處理大量攻擊報文,導致設備CPU占用率高,系統異常繁忙。如果使能BGP GTSM功能,系統會對所有BGP報文的TTL值進行檢查,丟棄TTL值小于254的攻擊報文,從而避免了因網絡攻擊報文導致CPU占用率高的問題。
十、BGP路由過程中的相關問題與特性
前言:下文我們將介紹BGP路由中的各類屬性值,眾所周知這些屬性值是為了策略路由準備的,但是為什么需要這么多,每一個屬性值是為了解決什么問題呢?
1、重疊路由
BGP路由器可以向其他BGP路由器發送重疊路由(overlappingroute),重疊路由是指那些,指向同一目的地的不同路由。
例如,路由206.25.192.0/19 和206.25.128.0/17就是重疊路由,可以看出第一條路由包含在第二條路由之內。在確定最佳路徑時,路由器總是選擇更精確的路徑。然而在宣告路由時,BGP 發言者可以有多種方式來處理重疊路由:
-同時宣告精確和不精確路由 -僅宣告較精確路由。 -聚合兩條路由并宣告聚合路由。 -僅宣告較不精確路由。 -兩條路由都不宣告。
2、鏈路聚合
聚合方法:
靜態聚合
路由器通過路由聚合屏蔽明細路由。
自動聚合
自動聚合只對引入BGP的路由進行聚合,聚合到自然網段后發送給鄰居。(Summary automatic)自動聚合只能聚合import的路由。
自動聚合帶來的問題:環路
手動聚合
手動聚合既能聚合network的路由,又能聚合import的路由。(最好)
路由聚合帶來的問題:潛在環路
解決方法:當發生聚合后,如果需要聚合路由攜帶所有明細路由經過的AS號來防止環路,則在配置聚合的命令后添加AS-SET參數。
3、IBGP對等體過多
BGP協議要求一個路由器通過IBGP學到的路由,不再向其他IBGP鄰居廣播,所以一個自治系統內所有參加IBGP協議的路由器都要與其他路由器建立會話,從而保證路由信息能夠正確地廣播到每一個路由器。依照這個原則,一個自治域內總的I-BGP會話數為N×(N-1)/2 (N為運行IBGP的路由器數),當N不斷增大時,這個數字會大得驚人。
這對網絡設備而言是個非常大的負擔,而且還將使網絡的管理與配置變得異常復雜。BGP針對這個問題,有如下兩種解決方案:
①路由反射器
相關概念:
路由反射器RR(Route Reflector):允許把從IBGP對等體學到的路由反射到其他IBGP對等體的BGP設備,類似OSPF網絡中的DR。
客戶機(Client):與RR形成反射鄰居關系的IBGP設備。在AS內部客戶機只需要與RR直連。
非客戶機(Non-Client):既不是RR也不是客戶機的IBGP設備。在AS內部非客戶機與RR之間,以及所有的非客戶機之間仍然必須建立全連接關系。
始發者(Originator):在AS內部始發路由的設備。Originator_ID屬性用于防止集群內產生路由環路。
集群或簇(Cluster):路由反射器及其客戶機的集合。Cluster_List屬性用于防止集群間產生路由環路。
路由反射器的部署:
同一集群內的客戶機只需要與該集群的RR直接交換路由信息,因此客戶機只需要與RR之間建立IBGP連接,不需要與其他客戶機建立IBGP連接,從而減少了IBGP連接數量。為了防止環路出現,要求路由反射器不得更改從客戶收到的路由屬性。
路由反射簇中的客戶路由器可以與自治系統外部路由器建立EBGP對等體關系,但是只可以與簇內的RR或者是其他客戶路由器建立IBGP對等體。路由反射器可以與簇外的路由器建立EBGP或者IBGP對等體關系,并且把他們的路由反射給客戶路由器。
備份路由反射器
為增加網絡的可靠性,防止單點故障對網絡造成影響,有時需要在一個集群中配置一個以上的RR。由于RR打破了從IBGP對等體收到的路由不能傳遞給其他IBGP對等體的限制,所以同一集群內的RR之間中可能存在環路。這時,該集群中的所有RR必須使用相同的Cluster ID,以避免RR之間的路由環路。
RR向IBGP鄰居發布路由規則如下(非非不傳遞):
如果路由學習自非客戶IBGP對等體,則僅反射給客戶路由器。
如果路由學習自某客戶,則反射給所有非客戶和客戶路由器(發起此路由的客戶機除外)。
如果路由學習自EBGP對等體,則反射給所有非客戶和客戶路由器。
這里注意如果客戶全連接,那么RR不會將一個客戶的路由反射給其他客戶。僅將客戶的路由反射給非客戶。
缺點:因為BGP只傳遞最優路徑,反射器下游路由器喪失了對反射前路由的最優路徑選擇權。
②聯盟
聯盟是另一種控制IBGP對等體數量的方法。
原理:將一個AS劃分為多個聯盟子自治系統,并且將AS內的每臺路由器都劃分到其中的一個聯盟子自治系統中去。位于同一個子自治系統中的對等體是聯盟IBGP對等體,位于不同子自治系統中的對等體是聯盟EBGP對等體。
就好像是在一個自治系統之內的,又分為若干個子自治系統,子自治系統之間的操作和子自治系統之內的操作,與普通自治系統類似無太大差別。
路由反射器 | 聯盟 |
---|---|
不需要更改現有的網絡拓撲,兼容性好 | 需要改變邏輯拓撲 |
配置方便,只需要對作為反射器的設備進行配置,客戶機并不需要知道自己是客戶機 | 所有設備需要重新進行配置 |
集群與集群之間仍然需要全連接 | 聯盟的子AS之間是特殊的EBGP連接,不需要全連接 |
適用于中、大規模網絡 | 適用于大規模網絡 |
4、路由振蕩
BGP屬于增量更新的路由協議,當有新的路由要發布時,路由器會向鄰居發送Update信息,而如果要刪除某條路由時,就會發送Withdraw(撤回)信息。BGP路由震蕩(Route Flap)的定義是:當一條路由在被收回后,又被廣播(Update)出來,視為一次Flap。由于任何一條路由的收回和更新都會導致一臺路由器整個路由表重新計算,因此當Flap的情況比較多時,對路由器設備的負載將產生巨大的壓力。
應對方法:路由衰減
路由衰減使用懲罰值(Penalty Value)來衡量一條路由的穩定性,懲罰值越高說明路由越不穩定,如上圖所示,路由每發生一次震蕩,BGP便會給此路由增加1000的懲罰值,其余時間懲罰值會慢慢下降,當懲罰值超過抑制閾值(Suppress Value)時,此路由被抑制,不加入路由表中,也不再向其他BGP對等體發布更新報文,被抑制的路由每經過一段時間,懲罰值便會減少一半,這個時間成為半衰期(Half Life),當懲罰值降低到再使用閾值(Reuse Vlaue)內時,此路由變成可用并被加入到路由表中,同時向其他BGP對等體發布更新報文,從路由被抑制到路由恢復可用的時間成為抑制時間(Suppress Time)。
注意:路由衰減只對EBGP路由起作用,對IBGP路由不起作用,這是因為IBGP路由可能含有本AS的路由,而IGP網絡要求AS內部路由表盡可能一致,如果路由衰減對IBGP起作用,那么當不同設備的衰減參數不一致時,將導致路由表不一致。
5、Peer Group的應用
在實際的網絡中,有一種非常普遍的現象,即一個路由器會有多個屬于一類的BGP Peer。這里的“屬于一類”是指BGP的策略相同或類似,當Peer比較多時,BGP的配置會變得臃腫,同時,路由器的負載也會加重,因為一旦有路由的更新,路由器需要針對每個Peer做一次策略計算(雖然策略都相同)。另外,應用Peer Group還有一個好處,就是降低了對路由器設備的資源消耗,因為路由器對同一Group更新路由時,由于使用相同策略,因此只進行一次路由計算,從而大大減少了占用CPU的時間。
十一、BGP的屬性值(重!)
BGP的路由屬性分類
公認必遵屬性:ORIGIN、AS-PATH、NEXT_HOP
公認必須遵循(Well-known mandatory):所有BGP設備都可以識別此類屬性,且必須存在于Update報文中。如果缺少這類屬性,路由信息就會出錯。
公認自選屬性:LOCAL_PREF(本地優先級)、ATOMIC_AGGREGATE(原子聚合體)
公認自選(Well-known discretionary):所有BGP設備都可以識別此類屬性,但不要求必須存在于Update報文中,即就算缺少這類屬性,路由信息也不會出錯。
可選傳遞屬性:COMMUNITY(團體)、AGGREGATOR(聚合站)
可選傳遞(Optional transitive)屬性:BGP路由器可以不支持此屬性,但它仍然會接收這類屬性,并傳遞給其他對等體 ——不認識,也可以傳。
可選非傳遞屬性:MED、CLUSTER_LIST(集群列表)、ORIGINATOR_ID(發起者ID)
可選非傳遞(Optional non-transitive):BGP設備可以不識別此類屬性,如果BGP設備不識別此類屬性,則會被忽略該屬性,且不會通告給其他對等體。
在BGP路由表中,到達同一目的地可能存在多條路由。此時BGP會選擇其中一條路由作為最佳路由,并只把此路由發送給其對等體。BGP為了選出最佳路由,會根據BGP的路由優選規則依次比較這些路由的BGP屬性。
常用的BGP屬性
Origin屬性(公認必遵屬性)
Origin屬性用來定義路徑信息的來源,標記一條路由是怎么成為BGP路由的。它有以下3種類型:
IGP:具有最高的優先級。通過network命令注入到BGP路由表的路由,其Origin屬性為IGP。
EGP:優先級次之。通過EGP得到的路由信息,其Origin屬性為EGP。
Incomplete:優先級最低。通過其他方式學習到的路由信息。比如BGP通過import-route命令引入的路由,其Origin屬性為Incomplete。
AS_Path屬性(公認必遵屬性)
AS_Path屬性按矢量順序記錄了某條路由從本地到目的地址所要經過的所有AS編號。在接收路由時,設備如果發現AS_Path列表中有本AS號,則不接收該路由,從而避免了AS間的路由環路。
當BGP Speaker傳播自身引入的路由時:
BGP Speaker將這條路由通告到EBGP對等體時,便會在Update報文中創建一個攜帶本地AS號的AS_Path列表。
BGP Speaker將這條路由通告給IBGP對等體時,便會在Update報文中創建一個空的AS_Path列表。
當BGP Speaker傳播從其他BGP Speaker的Update報文中學習到的路由時:
當BGP Speaker將這條路由通告給EBGP對等體時,便會把本地AS編號添加在AS_Path列表的最前面(最左面)。收到此路由的BGP設備根據AS_Path屬性就可以知道去目的地址所要經過的AS。離本地AS最近的相鄰AS號排在前面,其他AS號按順序依次排列。
當BGP Speaker將這條路由通告給IBGP對等體時,不會改變這條路由相關的AS_Path屬性。
Next_Hop(公認必遵屬性)
屬性記錄了路由的下一跳信息。BGP的下一跳屬性和IGP的有所不同,不一定就是鄰居設備的IP地址。通常情況下,Next_Hop屬性遵循下面的規則:
BGP發言者把自己產生的路由發給所有鄰居時,將把該路由信息的下一跳屬性設置為自己與對端鏈接的接口地址。
BGP發言者把從EGP鄰居得到的路由發給IBGP鄰居時。并不改變該路由信息的下一跳屬性,將從EBGP得到的路由的NEXT-HOP直接傳遞給IBGP對等體。(在未開啟同步的情況下,要配置next-hop-self使路由下一跳可達)
BGP發言者把收到的路由發給EBGP對等體時,將把該路由信息的下一跳屬性設置為本地與對端連接的接口地址。
對于可以多路訪問的網絡(以太網或者幀中繼),如果通告路由器和源路由器接口處于同一網段,則BGP會向鄰居通告路由的實際來源。
Local_Pref屬性(公認自選屬性)
Local_Pref屬性表明路由器的BGP優先級,用于判斷流量離開AS時的最佳路由。當BGP的設備通過不同的IBGP對等體得到目的地址相同但下一跳不同的多條路由時,將優先選擇Local_Pref屬性值較高的路由。Local_Pref屬性僅在IBGP對等體之間有效,不通告給其他AS(除非是聯盟對等體)。
Local_Pref屬性可以手動配置,如果路由沒有配置Local_Pref屬性,BGP選路時將該路由的Local_Pref值按缺省值100來處理。
MED(Multi-Exit Discriminator)屬性(可選非傳遞屬性)
用于判斷流量進入AS時的最佳路由,當一個運行BGP的設備通過不同的EBGP對等體得到目的地址相同但下一跳不同的多條路由時,在其它條件相同的情況下,將優先選擇MED值較小者作為最佳路由。
MED屬性僅在相鄰兩個AS之間傳遞,收到此屬性的AS一方不會再將其通告給任何其他第三方AS,如果路由器將從EBGP鄰居那里收到的MED傳遞給它的IBGP鄰居,那么MED值會恢復為0。MED屬性可以手動配置,如果路由沒有配置MED屬性,BGP選路時將該路由的MED值按缺省值0來處理。只有來自同一個AS的MED才能進行比較,不同的AS不能進行MED的比較。(Bgp always-compare-med 開啟這個條命令可以進行不同AS間MED的比較)
注意:
通常情況下,BGP只會比較來自同一個AS的路由MED屬性值,不比較來自不同AS的MED值。若一定要比較,則需要進行特別的配置。
Atomic-Aggregate(公認自選屬性)
Atomic-Aggregate:原子聚合體,是公認自選屬性(well-known discretionary) ,當BGP發言者將精確路由匯總到一個較不精確的聚合路由時,都將丟失路徑信息。而且BGP發言者還必須將Atomic-Aggregate屬性附加在聚合路由上。任何接收到帶有Atomic-Aggregate屬性的下游BGP路由器都無法獲悉該路由的更精確的NLRI信息,而且在將該路由宣告給其他對等體時,必須附加上Atomic-Aggregate屬性。
Aggregator(可選傳遞屬性)
聚合體:當設置了Atomic-Aggregate屬性時, BGP路由器還可以附加Aggregator。
屬性,Aggregator屬性是可選傳遞的,包含了AS號以及發起路由聚合的路由器的IP地址(Router-id)。Atomic-Aggregate 屬性表示已經丟失了路徑,而Aggregator屬性指示在何處出現路由聚合。
As-set
AS-Path屬性有兩種,一個是有序的AS-Sequence (有序的AS號列表)另一個是AS-SET (去往特定目的地無序的AS號列表)。AS-Path 屬性主要用于防止環路,但是當執行了路由聚合,將會丟失某些AS-Path屬性的細節信息,因而增加路由環路的潛在危險。比如下圖所示: AS810有一條路徑去往其他AS,那么來自AS 3113的聚合路由將被宣告給AS6571,而該聚合路由又將通過AS 6571被宣告給AS810,由于聚合而導致AS-Path丟失,因為AS 810無法檢測到潛在的路由環路,如果AS 810 內的某個子網出現故障,那么將匹配聚合路由將數據包轉發至AS6571,此時出現了路由環路。
Community團體屬性值(可選傳遞屬性)
standard(做路由標識) extended(MPLS VPN)
Community團體屬性是對一組路由實施路由策略,使路由策略的應用更加靈活,同時降低了維護管理的難度。路由器將Community屬性設置為某個標識自己為某團體成員的值之后,就可以將路由加入團體中。可以為一條路由設置多個Community屬性。路由器在接收到一條擁有多個community屬性的路由后,既可以基于全部屬性來設置路由策略,也可以基于部分屬性來設置路由策略。當包含Community屬性的路由被聚合之后,聚合路由將繼承所有被聚合路由的Community屬性。
Community之后,就可以將特定的路由設置私有Community, 并將其傳遞給所有鄰居,最終所有路由器都對擁有該私有Community的路由配置策略,并且對大量路由設置私有Community只需要在一臺路由器 上完成后,發給所有鄰居即可。
公認團體屬性如下所示:
Internet 團體無任何屬性值,所有路由默認情況下都屬于該團體,如果接收到的路由屬于該團體,則可以自由宣告該路由。
No-Export (4294967041 或0xFFFFFF01)如果接收到的路由攜帶該數值,則不能將該路由宣告給EBGP對等體;如果配置了BGP聯盟則不能將該路由宣告到聯盟之外。
No-Advertise (4294967042 或0xFFFFFF02)如果收到的路由攜帶該數值,則根本不能宣告該路由,不管是EBGP還是IBGP對等體。
Local-AS (4294967043 或0xFFFF03)如果接收到的路由攜帶該數值,那么不能將該路由宣告為EBGP對等體,包括同一聯盟內其他自治系統中的對等體。
Cluster_List(可選非傳遞)
集群列表:路由反射器和它的客戶機組成一個集群(Cluster),使用AS內唯一的Cluster ID作為標識。為了防止集群間產生路由環路,路由反射器使用Cluster_List屬性,記錄路由經過的所有集群的Cluster ID。
當一條路由第一次被RR反射的時候,RR會把本地Cluster ID添加到Cluster List的前面。如果沒有Cluster_List屬性,RR就創建一個。
當RR接收到一條更新路由時,RR會檢查Cluster List。如果Cluster List中已經有本地Cluster ID,丟棄該路由;如果沒有本地Cluster ID,將其加入Cluster List,然后反射該更新路由。
Originator_ID屬性(可選非傳遞)
發起者ID:Originator ID由RR產生,使用的Router ID的值標識路由的始發者,用于防止集群內產生路由環路。
當一條路由第一次被RR反射的時候,RR將Originator_ID屬性加入這條路由,標識這條路由的發起設備。如果一條路由中已經存在了Originator_ID屬性,則RR將不會創建新的Originator_ID屬性。
當設備接收到這條路由的時候,將比較收到的Originator ID和本地的Router ID,如果兩個ID相同,則不接收此路由。
十二、BGP選路規則(重!)
選路前提:
同步被關閉 下一跳可達 均最優“>”
優選協議首選值(Preference Value)最高的路由(私有屬性,僅本地有效,默認0,華為特有)
(思科為weight,默認32768,越大越好)
優選本地優先級(Local_Pref)最高的路由(默認100)
路由生成方式:Aggregate(手動匯總)>summary automatic(自動匯總)>Network>import>從對等體學到的
AS路徑(AS_Path)最短的路由
比較Origin code(起源屬性),IGP>EGP>incomplete。
優選MED值最小的路由(默認0,越小越優)
優選從EBGP鄰居學來的路由(EBGP>IBGP)
BGP優選達到下一跳IGP Cost較小的路由(最近的IBGP鄰居)
對于EBGP鄰居關系來說選舉較老的(建立較早的路由條目為最佳路由。比較穩定)
選舉BGP路由器ID最小的
選取鄰居IP地址最小的
注意:
BGP的max path(默認1)改掉的話,比到第8條停止,如果前八條都一樣,實行負載均衡。
如果特定NLRI的最佳路由是從選舉過程中第一步到第八步之間選舉出來的,那么BGP僅將這條路由放入路由表,因為這條路由就是最佳的路由。
如果特定NLRI的最佳路由是第八步之后確定的,那么BGP就會考慮許多將多條BGP路由放入IP路由表中。
即使BGP將多條路由放入路由表中,BGP也仍只會為每個NLRI選擇一條路徑作為最佳路由,而且該最佳路由就是BGP向鄰居通告的那一條最佳路由。
審核編輯:劉清
-
路由器
+關注
關注
22文章
3732瀏覽量
113780 -
MPLS
+關注
關注
0文章
131瀏覽量
24149 -
LAN
+關注
關注
0文章
227瀏覽量
37437 -
BGP
+關注
關注
0文章
83瀏覽量
15331 -
TCP通信
+關注
關注
0文章
146瀏覽量
4223
原文標題:BGP硬核筆記,值得每位網絡工程師收藏!
文章出處:【微信號:網絡技術干貨圈,微信公眾號:網絡技術干貨圈】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論