BGP
簡介
BGP 屬于路徑矢量協議
他和距離矢量路由協議的區別是 :
距離矢量強調的是一個距離,即下一跳路由器,因為一臺路由器下一跳地址總是他的鄰居路由器
路徑矢量強調的是一個下個AS,即下一跳AS。他的選路也是基于AS
不同的ISP之間有不同的AS號,不同的AS主要目的是基于管理,電信和網路各自管理各自AS內部的IGP,而AS和AS之間的路由則基于BGP,同時也是為了減少路由條目。
BGP更新利用 TCP 埠179 所以更新是可靠的更新
基礎概念
一些名詞
peer=neighbor
Bgpspeakers= 運行BGP的路由器
BGP管理距離
IBGP 200 IBGP是就是同一個AS之中建立的bgp鄰居關系
EBGP 20 EBGP就是在不同as之間所建立的bgp鄰居關系
用EBGP是為了提供AS之間的路由,單既然用IGP就可以在一個AS內部通告路由問什么要再搞個IBGP出來
答:IBGP的作用就是為了在同一個AS內的邊界路由器上互相通告更新資訊,必須有個機制能讓同一個AS內的BGP路由器來互相通告更新資訊
BGP中的建立鄰居不需要有直連的鏈路(這點和IGP的不同)原因是BGP使用的TCP協議,TCP是個點到點的協議他不支持組播,所以他是單播的,單播是可以被路由器轉發的。由此我推理出BGP的所有報文都是單播的,因為他的鄰居不直連所以無法通告組播來傳遞
BGP是路勁矢量協議凡矢量協議必有水品分割,BGP的水品分割分為EBGP和IBGP的水品分割
EBGP水平分割: 主要依賴AS號來防止環路(例如從某個EBGP鄰居學到路由會再通告給此鄰居通告命令sh ip bgp nei x.x.x.x advertised-route 查看,單對方不會接收而已),在路由被傳播程序中每個傳播者都加入自身的AS進去.(AS是bgp的屬性之一)
IBGP水平分割: 默認的通過IBGP學到的路由不會再通告給其他的鄰居,所以必須保證網路是全網狀的或者通過其他手段來通告給其他IBGP)BGP的邊界網關路由器從EBGP學到的路由通告給IBGP的鄰居,通過IBGP接收到的路由的路由器默認不再通告給其他IBGP鄰居了,所以要保持一個full mesh介面,(但是如果此路由器也是BGP的邊界網關路由器,則可以通告給其他的EBGP鄰居)有個例外是通告的路由如果不在路由表中的則不會通告此路由
BGP的route-id 建議和OSPF的一致不然會出問題
BGP的用環回口建立鄰居的時候 neighbor x.x.x.x update-source 雖然理論上只要一邊設定就可以但是建議兩邊都設定
BGP的 neighbor 和network 是分開的 neighbor 命令用來建立鄰居,而network命令僅用來傳路由(通告路由)
BGP中三張表? BGP表是什么?
答 1 路由表,bgp表,鄰居表 2 sh ip bgp 可查看被注入(用network命令)BGP的路由
BGP默認不負載均衡
BGP傳播和下一跳;
BGP傳播的是AS的路徑,所以實際的下一跳地址是通告AS路勁的bgp路由器,不像IGP總是相鄰的鄰居路由器,所以必須保證通過遞回讓bgp路由器能有下一跳地址。但是不建議用IGP或者用靜態來做,推薦用 next-hop-self
原理是改變邊界bgp路由器傳給IBGP時路由的下一跳地址是自身的介面地址,因為可以通過IGP來到達.
BGP報文
OPEN報文 三次握手建立鄰居關系
keeplive報文 維持keeplive狀態 60秒/次 dead-interval 180秒
update 傳輸BGP路由更新
notification 通告 當錯誤發生時 比如AS指向錯誤
OPEN報文:協商鄰居關系的條件
包含 hold time 和BGP router-id (Router-id 選取和OSPF一致 手工>環回>物理介面 & 地址高>地址低)
BGP的重定向:
在多路訪問網路中的一臺 AS邊界路由器從EBGP鄰居那收到一個資料包如果要通過同一個介面再轉發到另外一臺IBGP鄰居那里,那他就會觸發一個ICMP重定向,把更優的下一跳地址告訴EBGP鄰居,即EBGP鄰居的路由表內路由指向的下一跳直接為更優的IBGP鄰居的介面
BGP 同步和規則:
基本規則
、由eBGP鄰居學來的資訊肯定會傳給另外的eBGP鄰居。
2、由eBGP鄰居學來的資訊肯定會傳給iBGP鄰居。
3、由iBGP鄰居學來的資訊不會再傳給另外的iBGP鄰居。
4、由iBGP鄰居學來的資訊:
1)如果同步關了,會傳給eBGP鄰居,前提是通過遞回有下一跳的出介面(下一跳地址可達)
2)如果同步開了,先查找自己的IGP。如果IGP里面有這個網路,就把這個網路傳給eBGP;如果IGP里面沒有這個網路,就不會 傳給eBGP鄰居。
BGP同步
所謂 BGP同步是指 從IBGP學到路由傳給EBGP鄰居時的規則
在開啟同步情況下, 要求IBGP學到的路由必須是IGP也學到的(靜態也算),才會傳給ebgp鄰居
而 關閉BGP同步則是,只要我IBGP學到的路由,這條路由在路由表內有(即下一跳地址可達),我不管他是靜態的還是實際可不可達的,我都傳遞給EBGP。
BGP同步的作用是防止,在一個AS 中因為有被隔開的(沒有通告BGP的路由),導致黑洞.
一般在高版本的路由器中 默認是關閉同步的,因為我們有很多種方法去解決同步問題
BGP同步是IBGP才有的
用靜態或者IGP來獲得下一跳 不建議這么做,建議用 nei x.x.x.x next-hop-self
社團屬性
所謂社團屬性
他是可選的: 路由器有可能不識別此屬性(思科默認情況下)
他的傳遞性:(就是一跳) 社團屬性值僅在neighbor后的鄰居有效,鄰居收到后默認不再穿這個屬性給他的鄰居,除非他自己也使用啟動命令
啟動命令: neighbor x.x.x.x send-community
呼叫命令:在啟動命令之后用route-map去呼叫 列:nei x.x.x.x route-map x out (必須先啟動后再呼叫不然不生效)
not-advertise 不通告
not-export 不通告給其他大AS(公有AS)
local-as 僅通告給聯盟內小AS(聯盟內的AS)
解決IBGP水品分割
1 full mesh
2 路由反射器
3 聯盟
路由反射器規則
所謂路由反射器 實際就是典型的 服務端,客戶端 S/C結構
路由器翻身器稱為RR
通用規則
全反射(會反射給通告給我的人)
1 從客戶端收到的路由會進行全反射
2 從EBGP鄰居收到的路由進行全反射
3 從非客戶端的IBGP鄰居收到的路由不反射給其他的非客戶端的IBGP鄰居
命令:
nei x.x.x.x route-reflect-client 2層含義 1 設定自己為路由反射器服務端 2設定鄰居為路由反射器客戶端,如果neighbor是 peer-group成員則必須在peer-group中配置
聯邦
概念 把一個大AS分成若干個小AS(私有AS),在小AS之間通過聯邦的EBGP關系互聯,所有聯邦成員都必須通告自己的大AS號,聯邦的EBGP鄰居間要peer互指對方小as號,來互相告知對方與自己處于同一個聯邦內.(聯邦的IBGP鄰居不需要互指)
命令
互相nei 小as號
聯邦內的ebgp鄰居用環回口建立鄰居別忘記 multi-hop 多跳
bgp confederation identifier {公有AS}所有聯邦成員必須申明公有的AS號
bgp confederation peer {聯邦內EBGP鄰居as}聯邦內ebgp關系鄰居通過peer互指對方私有as來互相告知同處于同一聯邦(聯邦的ibgp鄰居無需告知)
BGP重分布和自動匯總
1 默認不開啟自動匯總
2 如果開啟自動匯總,BGP的自動匯總 只在將某種路由 重分布進 bgp中才發生
3 重分布的時候開啟自動匯總則通告的路由都是主類掩碼,通告路由的下一跳地址都是自己,且metric為0)(在IBGP內)
4 重分布的時候關閉自動匯總則通告的路由都是精確路由,通告路由的下一跳地址為路由表內的下一跳地址,自身直連的路由下一跳才為自己(0.0.0.0)并且明細路由的metric和路由表內相同。(默認的在IBGP域內有metric,在EBGP內無metric)
5 no auto-summary 做重分發的時候 應為明細路由有下一跳地址,所以雖然他會通告這些路由出去,但是如果鄰居接受路由的介面就是這條明細路由的下一跳地址(即這條路由就是鄰居傳給我的),此鄰居不會把此路由表放入BGP表(不然就成環路了),自然也不會通告給他的EBGP鄰居。
源屬性:
i AS內部的,屬于AS內部路由器network
E 從EGP分發到BGP中的
? 從其他協議分發到BGP的
AS范圍:
公有AS 0~64511 (需要申請的)
私有AS 64512~65535
(私有AS 是65535個AS中最后1024個,可以隨便你使用的本地有效的)
BGP具體匯聚
與auto-summary差不多的但是bGP中交匯聚
BGP的匯聚,也是把多條路由匯聚成一條路由目的肯定是減少路由表的條目
匯聚方法
1 利用bgp的network 通告的是路由的特性,寫一條靜態的匯總路由,然后指向一個空介面,因為自身的明細路由掩碼大于匯聚路由的掩碼,所以這樣既防止了黑洞,又匯總了路由.
步驟: 手工寫一條靜態匯總理由,null0,在network中通告.
缺點不靈活不能抑制明細路由
2 aggregate 匯聚
首先 通告明細路由
然后 aggregate-address 匯總地址/掩碼 | {summary-only}|{suppress map} {as-set}
備注 aggregate-address必須至少匯總地址范圍中包含有network中至少一條明細路由他才會傳
{summary-only}(僅傳匯總路由會抑制掉明細)
{suppress map} (可選引數 抑制串列 通過一個route map串列來抑制某些路由,即傳匯總路由同時可選擇的同時傳送明細路由 要硬清才可以生效
做匯聚后本地會產生一條nullo的路由防止環路
{as-set}在匯聚路由當中添加原明細路由的某些屬性(比如AS號用來防止黑洞,比如 起源屬性i E ?) (如果是本地聚合的就不需要此命令了)
BGP建立鄰居失敗如何排錯
IDLE和ACTIVE如果長期停留就是不正常狀態
IDLE : IDLE就是沒有到達鄰居的路由
IBGP 可能是由于沒有到達鄰居的路由
1 nei地址寫錯了
2 nei了環回口但是沒起IGP鄰居不可達
EBGP中
除了IBGP常見問題外最常見的就是 nei 環回口,但是沒有 用命令 nei x.x.x.x EBGP-multihop 導致跳數不夠
ACTIVE :ACTIVE 是有達到鄰居但是發送open報文后沒有收到回包
發送open報文但是沒有收到回包就會回圈與active和idle之間
1 nei 了環回口 但是沒有用命令 nei x.x.x.x update-source lo1 導致源出錯
2 回包一方沒有路由
3 nei 錯了地址導致沒有回包
4 AS號不匹配 (2臺路由器之間 要么是 IBGP要么是EBGP關系 同AS就是IBGP,不同AS就是EBGP,不管他是什么關系,他發的open報文中的remote-as必須和鄰居本地的as號匹配,否則也建立不起鄰居)
下篇是常用命令
BGP常用命令
一些命令
router bgp { Local as numbet} 啟動BGP 輸入本地BGP as號
bgp router-id x.x.x.x 手動輸入bgp router-id ,注意格式 要價格bgp建議 r-id和ospf r-id一致不然可能會出錯
neighbor x.x.x.x remote-as x 指定鄰居地址和AS號 (先nighbor后network,因為bgp是tcp的不使用組播)(neighbor指定就開始發open報文了)
雙方都指定并且收到hello報文后neighbor就建立了
EBGP一般用直連介面建鄰居(也可以用環回口),而IGP一般用環回口建鄰居(為了保證網路聯通的健壯性)
注意: IBGP中用環回口建鄰居會建立不起來因為,雙方指定的都是環回口地址作為源,而實際發送open報文是根據路由表的他的源地址是以發送介面的地址為源所以會出現不匹配要加一條命令來改變發送open報文的源地址命令為:
neighbor x.x.x.x update-sourece {interface x/只能指定介面}
作用是改變bgp報文的更新源 備: neighbor后指定的地址代表 當我收到一個報文的源地址是這個地址的時候我接受他為我的鄰居,所以如果用環回口作為beighbor 必須要改變他的 update-source 因為默認情況下的源是發送介面的IP地址
注意: EBGP默認情況下報文為1跳,但當EBGP有多條鏈路相連時(冗余備份),也可以啟用loopback介面來作為指定neighbor,但是必須要改ebgp的跳數,同時2個AS(ISP)之間肯定不會起IGP,所以必須要用靜態來指定到對方環回口的路由.
neighbor ebgp multihop {1~255} EBGP建立鄰居允許多跳,直接回車就是255跳
network x.x.x.x mask { subnet mask } IGP中的network有2個作用1 通告介面(此介面收發路由) 2 是通告介面所在的網路
BGP中network僅用來通告路由。(他不僅可以通告介面的網路只要是<路由表>內有的路由都可以通告進bgp中)他收發路由只靠路由表選擇的出介面和network無關 注意的是BGP的network可以通告任何路由表內有的路由,但是他是精確匹配的必須和路由表看到的路由一模一樣,并且他的掩碼是正掩碼,而且別忘記加mask關鍵字,bgp中所有通過bgp學習到的路由可以通過sh ip bgp查看到,(甚至還包括未放在路由表中的,這點和普通的IGP距離矢量路由協議不同,IGP不會把未在路由表內的路由放入資料庫,除了eigrp可能會放置部分他所謂的拓撲路由)
備:bgp中network從bgp學到的路由(標記B的)是無效的
nei x.x.x.x next-hop-self 在BGP邊界上做的 改傳播給IBGP鄰居時 ,通告路由的下一跳地址為自身,結果就是下一跳地址通過IGP可達,(BGP優化)
這個是傳播給IBGP鄰居時用的,從EBGP傳播給EBGP的時候默認是EBGP的update-source
nei x.x.x.x next-hop-unchange 不改變通告IBGP路由的下一跳地址,會self命令的反效果,默認是unchange
sh ip bgp summary 顯示鄰居資訊摘要
sh tcp brief 顯示TCP連接資訊 摘要
sh ip bgp 顯示bgp的路由資訊
前面的小i代表啊從IBGP學到的,有2種情況下不打i(1是從Ebgp學到的,2是從自身通告的)
neighbor {word) peer-group 創建一個被呼叫標記,有點像編程中模塊的概念,呼叫一個通用的配置模板
好處是1 減少未每個鄰居預留的快取 2 是減少管理員重復性的命令列輸入
例:neighbor lxd peer-group 創建一個命名的peer-group
neighbor lxd remote-as 1 基于這個命名的peer-group 設定遠端AS
neighbor lxd update-source lo0 基于這個命名的peer-group 設定更新源
neighbor lxd next-hop-self 基于這個命名的peer-group 設定ebgp通告進IBGP的下一跳地址為自身
neighbor 2.2.2.2 peer-group lxd neighbor 2.2.2.2的時候 呼叫 peer-group lxd
neighbor 3.3.3.3 peer-group lxd neighbor 3.3.3.3的時候 呼叫 peer-group lxd
clear ip bgp * (硬清理,會斷開tcp連接重新建立鄰居)
clear ip bgp * soft (軟清理,不斷開tcp連接,保持鄰居關系,僅重新發送更新,速度更快)
clear ip bgp {neighbor} *|soft 硬清或者軟清某個鄰居
show ip bgp rib-fail 顯示無效的標注為r的路由,并且能看到無效的理由( 當分別從IGP和BGP學到一條路由且IGP的管理距離更低時,sh ip bgp是就會看到路由標注為r,代表是無效的路由)
show ip bgp neighbor {neighbor} advertise-routes 查看我給某個鄰居發送的所有路由(這個可以查看的)
show ip bgp neighboe {neighbor} received-routes 查看某個鄰居給我發送的所有路由,默認情況下查看不了(沒啟用快取)要結合下面的命令
neighbor 5.5.5.5 soft-reconfiguration inbound 指定某個鄰居的發送給自己的路由保存在快取中
auto-summary 高版本默認情況是關閉的 auto-summary 是指在發生重分布行為是 有任何路由被重分布就BGP中 如果開啟自動匯總時會進行匯總,反之則不匯總
nei x.x.x.x weight x 將某個鄰居發送給自己的所有路由的weight值改為x,(雖然沒寫方向但肯定是IN方向的,wight是本地有效的不可能被傳播出去)
nei x.x.x.x route-map x {in|out} 基于route-map 來修改選路優先級 (in和out代表收和發方向)
bgp default local_preference 修改本地默認的優先級,作用有兩個一個修改本地的優先級,二是修改發送給IBGP鄰居的優先級
route-map中 set as_path prepend(添加為AS之前) 2 3 4 如果是out方向 代表發出前已經加了AS 2 3 4(發出后加上本地as 1)
所以鄰居的as_path 為 1 2 3 4
in 代表收到前已經加了2,3,4 收到后加上鄰居as1= 2 3 4 1
注意: set as_path 僅neighbor后的物件是另外一個AS中才起效不管是in還是out方向(即僅對EBGP鄰居生效)原理是IBGP鄰居在傳遞路由時不會添加AS號
prepend last as {number} 添加上一個as {number代表代價的重復的數量} last as對于out 方向代表發之前 先加上傳給我的as的號×數量
in 方向 代表收到之前先加上 鄰居as* 數量
通告添加as號添加非自己的as號會產生一個問題就是如果一個ebgp鄰居真的包含有此as號,就會觸發ebgp的水平分割,所以添加的時候要根據策略和需求,如果只為了選路可以添加多個自己的as號。
改BGP的MED 就是 set metric 實際上是一樣的
nei x.x.x.x route-reflect-client 2層含義 1 設定自己的路由反射器服務端 2設定鄰居為路由反射器客戶端,如果neighbor是 peer-group成員必須在peer-group中配置
bgp confederation identifier {公有AS}所有聯邦成員必須申明公有的AS號
bgp confederation peer {聯邦內EBGP鄰居as}聯邦內ebgp關系鄰居通過peer互指對方私有as來互相告知同處于同一聯邦(聯邦的ibgp鄰居無需告知)
neighbor x.x.x.x send-community 啟用社團屬性,(啟用后可通過route-map 如nei x.x.x.x route-map x in/out 來傳遞社團屬性)
社團屬性:
set community no-advertise 不通告,收到此屬性路由的鄰居不會通告給任何BGP鄰居 (任何鄰居!包括EBGP和IBGP鄰居)
set community no-export 不通告出自身大AS區域,收到此屬性路由的鄰居不會通告出自身大as區域(聯邦內可以傳)
set community local-as 不通告出自身小AS區域(如果沒有做聯邦的話其實作用和no-export作用是一樣的),但是做了聯邦就只在聯邦內一個小as區域通告
uj5u.com熱心網友回復:
BGP選擇TCP作為承載協議,使用埠號179,BGP不需要用專門的機制來處理復雜的報文分片,重傳,確認等細節。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/82994.html
標籤:網絡協議與配置
上一篇:思科的靜態路由怎么配置
下一篇:PLC資料采集傳輸遠程監控
