一、BGP的概況
BGP最新的版本是BGP第4版本(BGP4),它是在RFC4271中定義的;一個路由器只能屬於一個AS。AS的範圍從1-65535(64512-65535是私有AS號),RFC1930提供了AS號使用指南。
BGP的主旨是提供一種域間路由選擇系統,確保自主系統只能夠無環地交換路由選擇信息,BGP路由器交換有關前往目標網絡的路徑信息。
BGP是一種基於策略的路由選擇協議,BGP在確定最佳路徑時考慮的不是速度,而是讓AS能夠根據多種BGP屬性來控制數據流的傳輸。
* BGP將傳輸控制協議(TCP)用作其傳輸協議。是可靠傳輸,運行在TCP的179端口上(目的端口)
* 由於傳輸是可靠的,所以BGP使用增量更新,在可靠的鏈路上不需要使用定期更新,所以BGP使用觸發更新。
* 類似於OSPF和ISIS路由協議的Hello報文,BGP使用keepalive週期性地發送存活消息(60s)(維持鄰居關係)。
* BGP在接收更新分組的時候,TCP使用滑動窗口,接收方在發送方窗口達到一半的時候進行確定,不同於OSPF等路由協議使用1-to-1窗口。
* 豐富的屬性值
* 可以組建可擴展的巨大的網絡
* 鄰居關係表 所有BGP鄰居
* 轉發數據庫 記錄每個鄰居的網絡
包含多條路徑去往同一目的地,通過不同屬性判斷最好路徑
數據庫包括BGP屬性
* 路由表 最佳路徑放入路由表中
EBGP路由(從外部AS獲悉的BGP路由)的管理距離爲20
IBGP路由(從AS系統獲悉的路由)管理距離爲200
如下圖所示。
* 鄰居表,包含與之建立BGP連接的鄰居
n 使用命令show ip bgp summary可以查看到
Router#sh ip bgp summary BGP router identifier 11.1.1.1, local AS number 100 BGP table version is 8, main routing table version 8 5 network entries using 585 bytes of memory 6 path entries using 312 bytes of memory 4/3 BGP path/bestpath attribute entries using 496 bytes of memory 1 BGP AS-PATH entries using 24 bytes of memory 0 BGP route-map cache entries using 0 bytes of memory 0 BGP filter-list cache entries using 0 bytes of memory BGP using 1417 total bytes of memory BGP activity 5/0 prefixes, 6/0 paths, scan interval 60 secs Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 10.1.1.1 4 100 14 18 8 0 0 00:09:32 2 11.1.1.2 4 200 12 16 8 0 0 00:07:03 1 |
* 轉發表,從鄰居那裏獲悉的的所有路由都被加入到BGP轉發表中。
n 使用命令show ip bgp可以查看
Router#sh ip bgp BGP table version is 8, local router ID is 11.1.1.1 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, * - incomplete Network Next Hop Metric LocPrf Weight Path *> 10.1.1.0/24 0.0.0.0 0 32768 i * i 10.1.1.1 0 100 0 i *> 11.1.1.0/24 0.0.0.0 0 32768 i *>i192.168.1.0 10.1.1.1 0 100 0 i *> 192.168.2.0 0.0.0.0 0 32768 i *> 192.168.3.0 11.1.1.2 0 0 200 i |
* 路由表,BGP路由選擇進程從BGP轉發表中選出前往每個網絡的最佳路由,並加入到路由表中。
n 使用命令show ip route bgp可以查看
Router#sh ip route bgp B 192.168.1.0/24 [200/0] via 10.1.1.1, 00:13:11 B 192.168.3.0/24 [20/0] via 11.1.1.2, 00:11:19 |
3、BGP消息類型
* open:用來建立最初的BGP連接。(包含hold-time,router-id)
* Keepalive:對等體之間週期性的交換這些消息以保持會話有效。(默認60秒)
* Update:對等體之間使用這些消息來交換網絡層可達性信息。
* Notification:這些消息用來通知出錯信息。
所有的BGP分組共享同樣的公有首部,在學習不同類型的分組之前,先討論公共首部,如下圖所示,這個首部的字段如下。
* 標記:這個16字節標記字段保留給鑑別用
* 長度:這個2字節字段定義包括首部在內的報文總長度
* 類型:這個1字節段定義分組的類型,用數值1至4定義BGP消息類型
打開消息:主要是利用此報文建立鄰居,運行BGP的路由器打開與鄰居的TCP連接,併發送打開報文,如果鄰居接受這種鄰居關係,由響應保活報文。打開報文格式如下所示。
* 版本:這個1字節字段定義BGP的版本,當前的版本是4
* 自治系統:這個2字節字段定義自治系統號。
* 保持時間:這個2字節字段定義一方從另一方收到保活報文或更新報文之前所經過的最大秒數,若路由器在保持時間的期間內沒有收到這些報文中的一個,就認爲對方是不工作的。
* BGP協議標識:這是2字節字段,這定義發送打開報文的路由器,爲此,這個路由器通常使用它的IP地址中的一個作爲BGP標識符。
* 選項長度:打開報文還可以包含某些選項參數,若包含,則這個1字節字段定義選項參數總長度,若沒有選項參數,則這個字段的值爲0
* 選項參數:若選項參數長度的值不是0,則表示有某些選項參數,每一個選項參數本身又有兩個字段,參數長度和參數值,到現在已定義的唯一的選項參數是鑑別。
如下圖是採用ethereal採集到的BGP的打開消息報文。
更新報文:更新報文是BGP協議的核心,路由器使用它來撤銷以前已通知的終點和宣佈到一個新終點的路由,或兩者都有,應該注意:BGP可以撤銷好幾個在以前曾通知過的終點,但在單個更新報文中則只能通知一個新終點,如下所示。
* 不可行路由長度:這個2字節字段定義下一字段的長度。
* 撤銷路由:這個字段列出必須從以前通知的清單中刪除的所有路由
* 路徑屬性長度:這個2字節字段定義下一個字段的長度
* 路徑屬性:這個字段定義到這個報文宣佈可達性的網絡路徑屬性
* 網絡層可達性信息:這個字段定義這個報文真正通知的網絡。它有一個長度字段和一個IP地址前綴,長度定義前綴中的位數。前綴定義這個網絡地址的共同部分。例如,若這個網絡是123.1.10.0/24,則網絡前綴是24而前綴是123.1.10。
下圖爲,是採用ethereal採集到的BGP的更新消息報文。
保活報文:是用來告訴對方自己是工作的,保活報文只包括公共首部,如下圖所示。
下圖爲,是採用ethereal採集到的BGP的保活報文。
通知報文:當檢測出差錯狀態或路由器打算關閉連接時,路由器就發送通知報文,如下圖所示。
* 差錯碼:這個1字節字段定義差錯的種類
* 差錯子碼:這個1字節字段進一步定義每一種差錯的類型
* 差錯數據:這個字段可用來給出關於該差錯的更多的診斷信息
具體的差錯碼,如下表所示。
差錯碼 | 差錯碼說明 | 差錯子碼說明 |
1 | 報文首部差錯 | 3種不同的子碼:同步問題(1),壞的報文長度(2),壞的報文類型(3) |
2 | 打開報文差錯 | 6種不同的子碼:不支持的版本(1),壞的對等AS(2),壞的BGP標識符(3),不支持的可選參數(4),鑑別失敗(5),不可接受的保持時間(6) |
3 | 更新報文差錯 | 11種不同的子碼:錯誤形成的屬性表(1),不能識別的熟知屬性(2),丟失熟知屬性(3),屬性標誌差錯(4),屬性長度差錯(5),非法起點屬性(6),AS路由選擇環路(7),無效的下一路屬性(8),可選屬性差錯(9),無效的網絡字段(10),錯誤形成的AS_PATH(11) |
4 | 保持計時器截止期到 | 未定義子碼 |
5 | 有限狀態機差錯 | 定義過程的差錯,未定義子碼 |
6 | 關閉 | 未定義子碼 |
下圖爲,是採用ethereal採集到的BGP的通知報文。
在兩個BGP發言人交換信息之前,BGP都要求建立鄰居關係,BGP不是動態地發現所感興趣的運行BGP的路由器,相反,BGP使用一個特殊的鄰居IP地址來配置的。
BGP使用週期性的Keepalive分組來確認BGP鄰居的可訪問性。
Keepalive計時器是保持時間(Hold Time)的三分之一,如果發給某一特定BGP鄰居三個連續的Keepalive分組都丟失的話,保持時間計時器超時,那個鄰居被視爲不可達,RFC1771對保持時間的建議是90秒,Keepalive計時器的建議值是30秒。
按照RFC1771,BGP建立鄰居關係要經歷以下幾個階段,如下圖所示。
* Idle(空閒):在此狀態下不分配網絡資源,不允許傳入的BGP連接。當在持續性差錯條件下,經常性的重啓會導致波動。因此,在第一次進入到空閒狀態後,路由器會設置連接重試定時器,在定時器到期時纔會重新啓動BGP,思科的初始連接重試時間爲60秒,以後每次連接重試時間都是之前的兩倍,也就是說,連接等待時間呈指數關係遞增。
* Connect:(已經建立完成了TCP三次握手):BGP等待TCP連接完成,如果連接成功,BGP在發送了OPEN分組給對方之後,狀態機變爲OpenSent狀態,如果連接失敗,根據失敗的原因,狀態機可能演變到Active,或是保持Connect,或是返回Idle。
* Active:在這個狀態下,初始化一個TCP連接來建立BGP間的鄰居關係。如果連接成功,BGP在發送了OPEN分組給對方之後,狀態機變爲OpenSent狀態,如果連接失敗,可能仍處在Active狀態或返回Idle狀態。
* OpenSent(打開發送):BGP發送OPEN分組給對方之後,BGP在這一狀態下等待OPEN的迴應分組,如果迴應分組成功收到,BGP狀態變爲OpenConfirm,並給對方發送一條Keepalive分組,如果沒有接到迴應分組,BGP狀態重新變爲Idle或是Active。
* OpenConfirm(打開確認):這時,距離最後的Established狀態只差一步,BGP在這個狀態下等待對方的Keepalive分組,如果成功接收,狀態變爲Established,否則,因爲出現錯誤,BGP狀態將重新變爲Idle。
* Established:這是BGP對等體之間 可以交換信息的狀態,可交換的信息包括UPDATE分組、KeepAlive分組和Notification分組。
connect和active都是TCP連接階段,ACTIVE是發起方,connect是應答方。
可以使用命令show ip bgpsummary、debug ip bgp events、debug ip bgp來查看。
Router#debug ip bgp BGP debugging is on for address family: IPv4 Unicast *Jun 23 22:00:05.619: BGP: 11.1.1.2 went from Idle to Active *Jun 23 22:00:05.627: BGP: 11.1.1.2 open active delayed 30128ms (35000ms max, 28% jitter) *Jun 23 22:00:06.215: BGP: 11.1.1.2 passive open to 11.1.1.1 *Jun 23 22:00:06.219: BGP: 11.1.1.2 went from Active to Idle *Jun 23 22:00:06.219: BGP: 11.1.1.2 went from Idle to Connect *Jun 23 22:00:06.227: BGP: 11.1.1.2 rcv message type 1, length (excl. header) 26 *Jun 23 22:00:06.227: BGP: 11.1.1.2 rcv OPEN, version 4, holdtime 180 seconds *Jun 23 22:00:06.231: BGP: 11.1.1.2 went from Connect to OpenSent *Jun 23 22:00:06.231: BGP: 11.1.1.2 sending OPEN, version 4, my as: 100, holdtime 180 seconds *Jun 23 22:00:06.231: BGP: 11.1.1.2 rcv OPEN w/ OPTION parameter len: 16 *Jun 23 22:00:06.231: BGP: 11.1.1.2 rcvd OPEN w/ optional parameter type 2 (Capability) len 6 *Jun 23 22:00:06.235: BGP: 11.1.1.2 OPEN has CAPABILITY code: 1, length 4 *Jun 23 22:00:06.235: BGP: 11.1.1.2 OPEN has MP_EXT CAP for afi/safi: 1/1 *Jun 23 22:00:06.235: BGP: 11.1.1.2 rcvd OPEN w/ optional parameter type 2 (Capability) len 2 *Jun 23 22:00:06.235: BGP: 11.1.1.2 OPEN has CAPABILITY code: 128, length 0 *Jun 23 22:00:06.239: BGP: 11.1.1.2 OPEN has ROUTE-REFRESH capability(old) for all address-families *Jun 23 22:00:06.239: BGP: 11.1.1.2 rcvd OPEN w/ optional parameter type 2 (Capability) len 2 *Jun 23 22:00:06.239: BGP: 11.1.1.2 OPEN has CAPABILITY code: 2, length 0 *Jun 23 22:00:06.239: BGP: 11.1.1.2 OPEN has ROUTE-REFRESH capability(new) for all address-families BGP: 11.1.1.2 rcvd OPEN w/ remote AS 200 *Jun 23 22:00:06.243: BGP: 11.1.1.2 went from OpenSent to OpenConfirm *Jun 23 22:00:06.243: BGP: 11.1.1.2 send message type 1, length (incl. header) 45 *Jun 23 22:00:06.359: BGP: 11.1.1.2 went from OpenConfirm to Established *Jun 23 22:00:06.363: %BGP-5-ADJCHANGE: neighbor 11.1.1.2 Up |
IBGP運行在AS內部,不需要直連。IBGP有水平分割,建議使用Full Mesh,由於Full Mesh不具有擴展性,爲了解決IBGP的Full Mesh問題,使用路由反射器(RR)和聯邦兩種方法來解決。主要減少了backbone IGP中的路由。
Neighbor後所指的地址可達。發起方不能是缺省路由,應答方不能是缺省路由。
可以使用下面兩種方法來建立IBGP鄰居:
* 鄰居之間可以通過各自的一個物理接口建立對等關係,該對等關係是通過屬於它們共享的子網的IP地址來建立的。
* 鄰居之間也可以通過使用環回接口建立對等關係。
在IBGP中,由於假定了IBGP鄰居在物理上直接相連的可能性不大,所以將IP分組頭中的TTL域設置爲255。
6、建立EBGP鄰居
EBGP運行在AS與AS之間的邊界路由器上,默認情況下,需要直連或使用靜態路由,如果不是直連,必須指EBGP多跳,Neighbor x.x.x.x ebgp-multihop [1-255] 不選擇爲最大值,255跳。
可以使用下面兩種方法來建立EBGP鄰居:
* 鄰居之間可以通過各自的一個物理接口建立對等關係。
* 鄰居之間也可以通過使用環回接口建立對等關係。
7、neighbor ip-address remote-as number命令
例:neighbor 10.1.1.1 remote-as 100
指定對方屬於哪一個AS。所指的10.1.1.1地址,必須在IGP中可達。
* 允許鄰居用這個地址來訪問我的179端口,但沒有指明訪問本路由器的哪個地址,只檢查源地址。
* 本路由器以更新源地址去訪問neighbor後面這個地址的179端口,是否可以建立TCP鏈接要看對方是否允許我的更新源來訪問它。
示例:
R1/R2兩臺路由器運行RIPv2,都將環回口宣告進RIP。這時假如在兩臺路由器之間運行IBGP鄰居關係:
R1:neighbor 192.168.2.1 remote-as 1
R2:neighbor 10.1.1.1 remote-as 1
雙方都沒有寫更新源。(neighbor x.x.x.x update-source lo0代表本路由器的更新源爲lo0口,BGP的包以這個接口的地址爲源地址發送出去。)
一邊指環回口,一邊指直連接口。可以建立鄰居。這裏有2個TCP的session,其中只有R1去訪問R2的環回口的179端口的TCP session可以建立。可以用show tcp brief查看。
Router#sh tcp brief TCB Local Address Foreign Address (state) 65693960 10.1.1.1.51124 192.168.2.1.179 ESTAB |
這時在R2上寫上確定更新源命令:neighbor 10.1.1.1 update-source lo1,這時即可建立2條TCP session。可以使用命令Show tcp brief查看到2條TCP session在建立,當一條establish完成後,另一條過會即消失。
Router#sh tcp brief TCB Local Address Foreign Address (state) 65693960 10.1.1.1.51124 192.168.2.1.179 CLOSED 65693E14 10.1.1.1.37992 192.168.2.1.179 ESTAB Router#sh tcp brief TCB Local Address Foreign Address (state) 65693E14 10.1.1.1.37992 192.168.2.1.179 ESTAB |
注:路由器建立BGP鄰居寫兩條正確的neighbor命令,是爲了冗餘。
* BGP同步規則指出,BGP路由器不應用使用通過IBGP獲悉的路由或將其通告給外部鄰居,除非該路由是本地的或是通過IGP獲悉的。
* 同步開啓意味着,從一個IBGP鄰居學來的路由,除非從IGP中也同樣學習到,否則不可能被選爲最優。
* 如果IGP爲OSPF,那麼在IGP中,這些前綴的router-id也必須與通告這些前綴的bgp的router-id相匹配。纔有可能被選爲最優。
實例說明:如下圖所示
R1、R2、R3同爲OSPF area 0中路由器(每臺路由器的router-id如上圖所示),R2上一條路由3.3.3.0/24宣告進OSPF。
R1、R3運行IBGP,R1將3.3.3.0/24的前綴引入BGP,傳給R3。這時R3既從OSPF area0中的R2學習到該前綴,又從IBGP對等體R1,學習到該前綴,如果R3的synchronizaion是開啓的,檢查同步,在R3的BGP轉發表裏:
R1 router ospf 10 router-id 2.2.2.1 log-adjacency-changes network 10.1.1.0 0.0.0.255 area 0 network 11.1.1.0 0.0.0.255 area 0 ! router bgp 100 synchronization bgp log-neighbor-changes redistribute ospf 10 neighbor 11.1.1.2 remote-as 100 no auto-summary R3 router ospf 10 router-id 2.2.2.3 log-adjacency-changes network 11.1.1.0 0.0.0.255 area 0 ! router bgp 100 synchronization bgp log-neighbor-changes neighbor 11.1.1.1 remote-as 100 no auto-summary R3#sh ip bgp BGP table version is 30, local router ID is 11.1.1.2 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, * - incomplete Network Next Hop Metric LocPrf Weight Path * i3.3.3.3/32 10.1.1.1 11 100 0 * * i10.1.1.0/24 11.1.1.1 0 100 0 * r>i11.1.1.0/24 11.1.1.1 0 100 0 * R3#sh ip bgp 3.3.3.3 BGP routing table entry for 3.3.3.3/32, version 26 Paths: (1 available, no best path) Not advertised to any peer Local 10.1.1.1 (metric 20) from 11.1.1.1 (11.1.1.1) Origin incomplete, metric 11, localpref 100, valid, internal, not synchronized |
說明同步檢查沒有通過,當把R1的bgp的router-id改爲2.2.2.2時,R3這時檢查同步就可以通過了。
R1 router ospf 10 router-id 2.2.2.1 log-adjacency-changes network 10.1.1.0 0.0.0.255 area 0 network 11.1.1.0 0.0.0.255 area 0 ! router bgp 100 synchronization bgp router-id 2.2.2.2 bgp log-neighbor-changes redistribute ospf 10 neighbor 11.1.1.2 remote-as 100 no auto-summary R3#sh ip bgp BGP table version is 37, local router ID is 11.1.1.2 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, * - incomplete Network Next Hop Metric LocPrf Weight Path r>i3.3.3.3/32 10.1.1.1 11 100 0 * r>i10.1.1.0/24 11.1.1.1 0 100 0 * r>i11.1.1.0/24 11.1.1.1 0 100 0 * R3#sh ip bgp 3.3.3.3 BGP routing table entry for 3.3.3.3/32, version 35 Paths: (1 available, best #1, table Default-IP-Routing-Table, RIB-failure(17)) Flag: 0x820 Not advertised to any peer Local 10.1.1.1 (metric 20) from 11.1.1.1 (2.2.2.2) Origin incomplete, metric 11, localpref 100, valid, internal, synchronized, best |
* 關閉同步的條件
n 將EBGP的路由重分佈進IGP
n 本AS不爲其他AS提供穿越服務(末節的AS)
n 穿越路徑上所有路由器都運行BGP
二、BGP屬性
路由器發送關於目標網絡的BGP更新消息,更新的度量值被稱爲路徑屬性。屬性可以是公認的或可選的、強制的或自由決定的、傳遞的或非傳遞的。屬性也可以是部分的。並非組織的和有組合都是合法的,路徑屬性分爲4類:
* ——公認強制的
* ——公認自由決定的
* ——可選傳遞的
* ——可選非傳遞的
* 只有可選傳遞屬性可被標記爲部分的
公認屬性
* 是公認所有BGP實現都必須能夠識別的屬性。這早些屬性被傳遞給BGP鄰居。
* 公認強制屬性必須出現在路由描述中,公認自由決定屬性可以不出現在路由描述中
可選屬性
* 非公認屬性被稱爲可選的,可選屬性可以是傳遞的或非傳遞的
* 可選屬性不要求所有的BGP實現都支持
* 對於不支持的可選傳遞屬性,路由器將其原封不動地傳遞給其他BGP路由器,在這種情況下,屬性被標記爲部分的。
* 對於可選非傳遞屬性,路由器必須將其刪除,而不將其傳遞給其他BGP路由器
BGP定義屬性
* 公認強制屬性
* 公認自由決定
* 可選傳遞屬性
* 可選非傳遞屬性
BGP每條更新消息都有一個長度可變的路徑屬性序列<屬性類型,屬性長度,屬性值>,如果第1比特是0,則屬於是公認屬性,如果它是1,則該屬性是任選屬性,如果第2比特是0,則該屬性是不可傳遞的,如果它是1,則屬性是可傳遞的,公認屬性總是可傳遞的,屬性標誌域中的第3個比特指示任選可傳遞屬性中的信息是部分的(值爲1)還是完整的(值爲0),第4個比特確定該屬性長度是1字還是2字節,標誌域其他4個比特總爲0.屬性類型代碼字節含有屬性代碼。如下圖所示。
1、AS路徑屬性(AS-path)
AS_PATH是一個公認必選的屬性,它用AS號的順序來描述AS間的路徑或到NLRI所明確的目的地的路由。
當每個運行運行BGP的路由器發起一條路由——當它在自己的AS域內公佈一個有關目的地NLRI——它將自己的AS號附加到AS_PATH中。當後續的運行BGP的路由器向外部的對端公佈路由,它將自己的AS號附加到AS_PATH中。AS可以描述所有它經過的自治系統,以最近的AS開始,以發起者的AS結束。如下圖所示。
只有將更新消息發送給在另一個AS域內的鄰居時,BGP路由器纔將它的AS號加到AS_PATH中,也就是說只有在兩個EBGP對等體之間公佈路由時,AS號才被附加到AS_PATH中。
可以通過使用AS附加改變其公佈路由的AS_PATH來影響數據流的流向。
AS_PATH屬性的另一個功能就是避免環路,如果BGP路由器從它的外部鄰居收到一條路由,而該路由AS_PATH包含這個BGP路由器自己的AS號。於是該路由器就知道是條環路路由。如下圖所示。
實例說明:如圖所示。
可以將私有的AS號進行隱藏,如下配置所示。
下面是AS屬性的另一個實例,如下圖所示。
R1在發送更新的時候,剝除私有AS號;並且不將AS100的路由傳播給其客戶路由器R3,配置如下所示。
聚合後繼承明細路由的屬性,在大括號裏面的as-path在計算長度時,只算一個。在聯盟內小括號裏面的AS號,在選路時,不計算到as-path長度裏面。
增加as-path的長度,可以用route-map裏面的set as-path prepend來做,如:
neighbor 1.1.1.1 route-map AS {in|out} route-map AS set as-path prepend 10 10 |
在neighbor的入向做as-path prepend。是在as-path靠近我的地方加長度,如:
10 10 2i 。10 10是新加的。
而在neighbor的出向做as-path prepend。是在AS起源的方向加path長度,如:
2 10 10i 。10 10是新加的。
在as-path prepend的後面還有一個參數,last-as,如:
route-map AS set as-path prepend last-as * <1-10> number of last-AS prepends |
意思是將離我最近的AS,將它的AS號在as-path裏面再重複出現幾次。這個10看起來可以和allowas-in裏面的10對應起來。
假如as-path prepend 與as-path prepend last-as合用的時候,last-as先生效,然後prepend再生效。
減小as-path的長度,如用聯盟和remove-private-AS等可以實現。
注意:Remove-private-as,如果在as-path裏交替出現私有和公有的AS號,這樣將無法將私有AS號去掉。在起源的時候,連續的時候纔有效。
bgp bestpath as-path ignore(隱藏命令),這條命令可以使我們在選路時,跳過as-path的選路,直接往下繼續選擇最優路徑。
2、源頭屬性(Origin)
源頭是公認強制屬性,它定義了路徑信息的源頭。
IGP:路由在起始AS的內部,使用network命令通過BGP通告路由時,通常屬於這種情況,在BGP表中,IGP源頭用i表示
EGP:路由是通過EGP獲悉的,在BGP表中用e表示。
不完全:路由的源頭未知或是通過其他方法獲悉的,在BGP表中,不完整源頭用*表示
如下示例所示。
2、下一跳屬性(NEXT_HOP)
該爲公認必選屬性,描述了到公佈目的地的路徑下一跳路由器的IP地址。由BGP NEXT_HOP屬性所描述的IP地址不經常是鄰居路由器的IP地址,要遵循下面的規則:
如果正在進行路由宣告的路由器和接收的路由器在不同的自治系統中,NEXT_HOP是正在宣告路由器接口的IP地址,如下圖所示。
如果正在進行路由宣告的路由器和接收的路由器在同一個AS內,並且更新消息的NLRI指明的目的地也在同一個AS內,那麼NEST_HOP就是宣告路由的鄰居的IP地址。如下圖所示。
如果正在宣告的路由器和接收的路由器是內部對等體,並且更新消息的NLRI指明目的地在不同的AS,則NEXT_HOP就是學習到路由的外部對等實體的IP地址。如下圖所示。
從上面圖可以知道,在去往192.168.5.0的網段中會出現路徑不可達的情況,解決這個問題的方法是保證內部路由器知道與兩處自治系統相連的外部網絡,可以使用靜態路由的辦法,但實際的做法是在外部端口上以被動模式運行IGP。但在某種情況下,該方法並不理想。
第二種方法是採用配置選項來做,這個配置選項被稱做next-hop-self。
下面具體詳述了下一跳的不可達的解決方法:
* 解決下一跳不可達的方法:
n 靜態路由
n 在IBGP鄰居所處的IGP中宣告
n 將與EBGP直連的網絡重分佈進IGP
n neighbor x.x.x.x next-hop-self(將指向EBGP鄰居更新源的地址變爲自己的更新源地址)(RR有的版本會將下一跳改變)
* 一般情況下,在本路由器上將直連的網絡引入BGP,下一跳爲0.0.0.0,本路由器聚合的路由的下一跳也爲0.0.0.0。
* 在本路由器上將從IGP學來的路由引入BGP時,在本路由器上看BGP的轉發表,下一跳爲IGP路由的下一跳。在多訪問網絡環境中,用直連接口建立鄰居關係,會產生第三方下一跳。
實例說明:如下圖所示,
R2與R1是IBGP鄰居,R1與R3是EBGP鄰居,當用直連接口建鄰居時,R2引入BGP的前綴172.16.2.0/24,在R3的bgp轉發表裏,將顯示爲R2的多訪問網絡接口地址(如:10.1.1.2)。產生第三方下一跳的現象。
n 如果R1、R2、R3全部用直連接口建鄰居時會產生第三方下一跳。
n 如果R1、 R2用環回口而R1、R3用直連建立鄰居時,會產生第三方下一跳。
n 如果R1、R2用直連而R1、R3用迴環口時,不會產生第三方下一跳,如下所示配置。
n 如果R1、R2、R3都用環回口建立鄰居,則不會產生第三方下一跳,如下配置所示。
R3#show ip bgp BGP table version is 4, local router ID is 172.16.3.1 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, * - incomplete Network Next Hop Metric LocPrf Weight Path *> 172.16.1.0/24 10.1.1.1 0 0 100 i *> 172.16.2.0/24 10.1.1.2 0 100 i *> 172.16.3.0/24 0.0.0.0 0 32768 i |
R1 router bgp 100 no synchronization bgp log-neighbor-changes network 172.16.1.0 mask 255.255.255.0 neighbor 3.3.3.3 remote-as 200 neighbor 3.3.3.3 ebgp-multihop 2 neighbor 3.3.3.3 update-source Loopback1 neighbor 10.1.1.2 remote-as 100 no auto-summary R3 router bgp 200 no synchronization bgp log-neighbor-changes network 172.16.3.0 mask 255.255.255.0 neighbor 1.1.1.1 remote-as 100 neighbor 1.1.1.1 ebgp-multihop 2 neighbor 1.1.1.1 update-source Loopback1 no auto-summary R3#sh ip bgp BGP table version is 8, local router ID is 172.16.3.1 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, * - incomplete Network Next Hop Metric LocPrf Weight Path *> 172.16.1.0/24 1.1.1.1 0 0 100 i *> 172.16.2.0/24 1.1.1.1 0 100 i *> 172.16.3.0/24 0.0.0.0 0 32768 i |
R1 router bgp 100 no synchronization bgp log-neighbor-changes network 172.16.1.0 mask 255.255.255.0 neighbor 2.2.2.2 remote-as 100 neighbor 2.2.2.2 update-source Loopback1 neighbor 3.3.3.3 remote-as 200 neighbor 3.3.3.3 ebgp-multihop 2 neighbor 3.3.3.3 update-source Loopback1 no auto-summary R2 router bgp 100 no synchronization bgp log-neighbor-changes network 172.16.2.0 mask 255.255.255.0 neighbor 1.1.1.1 remote-as 100 neighbor 1.1.1.1 update-source Loopback1 no auto-summary R3 router bgp 200 no synchronization bgp log-neighbor-changes network 172.16.3.0 mask 255.255.255.0 neighbor 1.1.1.1 remote-as 100 neighbor 1.1.1.1 ebgp-multihop 2 neighbor 1.1.1.1 update-source Loopback1 no auto-summary R3#sh ip bgp BGP table version is 10, local router ID is 172.16.3.1 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale Origin codes: i - IGP, e - EGP, * - incomplete Network Next Hop Metric LocPrf Weight Path *> 172.16.1.0/24 1.1.1.1 0 0 100 i *> 172.16.2.0/24 1.1.1.1 0 100 i *> 172.16.3.0/24 0.0.0.0 0 32768 i |
第三方下一跳:收到路由更新的源地址與將要發出去的接口地址在同一網段的時候,路由的下一跳不改變,爲原來路由更新的源地址。
* 有時雖然路由的下一跳可達,但會出現訪問網絡出現環路的現象。
實例說明:
R5、R3,R1、R2爲EBGP鄰居關係,R1、R3爲IBGP鄰居關係。那麼R5通過BGP傳給R3的路由(如10.1.1.0/24),R3通過IBGP傳給R1,R1通過EBGP傳給R2,這時R2訪問10.1.1.0/24這個網絡的下一跳就在R1上。這時R2去訪問R5的時候,就會產生環路。
則R2(走下一跳)——R1(走物理鏈路)——R2,這樣環路產生了。
解決方法:
* neighbor x.x.x.x next-hop-unchanged (此命令只能用在EBGP多跳的環境下,將路由的下一跳,從自己的更新源地址改變爲從IBGP學來的下一跳地址)(這時路由的下一跳在路由表裏將改變。)
* neighbor x.x.x.x route-map XX {in|out}然後在route-map裏面set ip next-hop來改變前綴的下一跳。(在路由表裏下一跳會改變。)
* 策略路由PBR,強制命令R2到10.1.1.0/24的時候走R3。(路由表裏下一跳不會改變)
3、本地優先級屬性(Local_preference)
本地優先級是公認自由決定的屬性,它告訴AS中的路由器,那條路徑離開AS的首選路徑。本地優先級越高,路徑被選中的可能性越大。本地優先級這種屬性只能在同一個AS中的路由器之間交換,本是優先級只適用於內部鄰居,用於內部對等體之間的Update消息。
本地優先級,可以在本AS和大聯盟內傳遞。越大越優先。影響路由器的出站流量。默認情況下,local-preference爲100。
使用下面的命令,如下圖所示
是將路由器收到的所有外部BGP路由的默認本地優先級修改爲指定值。對IBGP鄰居路由器傳過來的路由,不會改變它們的local-preference。如果將一個IBGP鄰居傳來的路由傳給另外一個IBGP鄰居,那我必須是RR。
實例說明:如下圖所示。
未使用本地優先級操作路徑,如下所示路由器C的BGP表。
在路由器A 上修改本地優先級,如下所示。
在使用本地優先操縱後的路徑,查看路由器C 的BGP表。
4、原子聚合屬性
原子聚合是一個公認自決的屬性。類型代碼爲6,它告訴鄰接AS,始發路由器對路由進行了聚合。可以使用下面的命令進行配置,
命令只聚合已經包含在BGP表中的網絡,這與使用network來通告彙總路由要求不同,後者要求網絡必須出 現在IP路由選擇表中
配置命令aggregate-address後,一條與彙總路由對應的指向null0的BGP路由將自動被加入到IP路由表中。如下示例所示。
可以使用show ip bgp命令來查看
關於原子聚合的詳細內容在以後的章節中詳細說明。
5、權重屬性
cisco私有的參數。本地有效。缺省條件下,本地始發的路徑具有相同的WEIGHT值(即32768),所有其他的路徑的weight值爲0。越大越優選。影響路由器的出站流量。
權重隻影響當前路由器,指定鄰居的權重。使用下面命令來修改權重。
可以在neighbor的入向設置。範圍0-65535。Neighbor 1.1.1.1 weight 10,從對等體1.1.1.1接收過來的所有路由的weight值都設置爲10。
還可以用route-map來設定,可以將特定路由的weight值改變。如下所示:
Neighbor 1.1.1.1 route-map AA in Route-map AA permit 10 Match ip address prefix AA Set weight 10 Route-map AA permit 20 |
6、MED屬性
MED屬性也被稱爲度量值,是一種可選非傳遞屬性。承載於EBGP的Update消息中。MED用於向外部鄰居指出進入AS的首選路徑,當入口有多個時,AS可以使用MED來動態地影響其他AS如何選擇進入路徑,在BGP中,MED是唯一一個可影響數據如何進入AS的屬性。度量值越小,路徑被選中的可能性越大。與本地優先級不同,MED是在自主系統之間交換的。MED影響進入AS的數據流,而本地優先級影響離開AS的數據流。如下圖所示。
Metric和med:BGP的metric對IBGP同樣有效。特指med:從EBGP收到的metric比較的時候才叫MED,MED是借用了BGP的metric在EBGP的時候進行比較。MED(多出口區分)比較EBGP的metric找到最優的出口。
MED相當於IGP路由的metric值,越小越優先。在新的IOS中,將IGP中的路由重分佈進BGP,BGP將自動繼承IGP路由的metric值。在老的IOS裏,如果需要繼承需要在重分佈時加route-map,如:
Redistribute rip route-map RE Route-map RE set metric-type internal |
默認情況下,只有在兩條路徑的第一個(鄰近的)AS相同的情況下才會進行比較:任何聯盟內的子自治系統都被忽略。任何多跳路徑,只有在AS_SEQUENCE中的第一個AS相同的情況下,纔會比較MED;任何打頭的AS_CONFED_SEQUENCE都將被忽略。如果激活了bgp always-compare-med,那麼對於所有路徑都比較MED,而不考慮是否來自同一個AS。如果使用了這個選項,就應該在整個AS中都這樣做,以避免路由選擇環路。
實例說明:如下拓撲圖
下面是一個使用策略路由來實現修改MED值的案例。
實例說明:如下圖所示,此實例採用了本地優先級與MED屬性
7、共同體屬性
BGP團體是一組共享某些共同特性的目的地,用於簡化路由策略的執行,一個團體並不被限制在一個網絡或一個AS之中。是另一種過濾入站或出站BGP路由的方法。
COMMUNITY屬性是一組4個8位組的數值,RFC1997規定,前2個8位組表示自治系統,後2個8位組表示出於管理目的而定義的標識符,格式爲AA:NN,而思科的默認格式爲NN:AA,可以使用命令ip bgpcommunity new-format將思科默認格式改爲RFC1997的標準格式。
團體屬性是一個可傳遞屬性,類型代碼爲8。
* no_export——如果接收到的路由攜帶該數值,不通告到EBGP對等體。如果配置了聯盟,則不能將此路由宣告到聯盟之外。
* no_advertise——如果接收到的路由攜帶該數值,不通告給任何對等體,包括EBGP和IBGP。
* internet ——無任何值,所有路由器默認情況下都屬於該團體,帶此屬性的路由在被收到後,應該被通告給所有的其他路由器
* local_as——帶有此屬性的路由在被收到後,應該被通告給本地AS域內的對等體,但不應該被通告給外部系統中的對等體,包括同一個聯盟內其它自治系統中的對等體。
實例說明:如下圖所示。
三、BGP路由彙總
BGP的彙總有2種:
A.彙總:summary
靜態路由手工彙總指向null 0,再network引入BGP。
如果明細路由斷了,彙總仍然會被引入,且缺乏靈活性。
命令network要求路由選擇表中有與指定的前綴或掩碼完全匹配的條目,爲滿足這種要求,可配置一條指向接口null0的靜態路由,如果IGP執行彙總,則路由選擇中可能已以有這樣的靜態路由。
命令network告訴BGP通告哪些網絡,而不如何通告,僅當描寫的網絡號出現在IP路由選擇中後,BGP纔會通告它,如下圖所示。
B.聚合:aggregate
聚合路由在本路由器上生成一條聚合路由,下一跳爲0.0.0.0。
aggregate-address 172.16.12.0 255.255.252.0 *
advertise-map Set condition to advertise attribute
as-set Generate AS set path information
attribute-map Set attributes of aggregate
route-map Set parameters of aggregate
summary-only Filter more specific routes from updates
suppress-map Conditionally filter more specific routes from updates
nlri
<cr>
* Advertise-map
n 只對advertise-map裏面匹配的路由進行聚合。當advertise-map裏面匹配的明細路由全部消失後,即使聚合路由範圍內還有其他明細路由,聚合路由也將消失。當與as-set合用時,只繼承advertise-map裏面匹配的明細路由的屬性。如果用summary-only,會將所有的明細包括沒有在advertise-map裏面匹配的路由一起抑制。
* As-set
n 聚合路由繼承明細路由的屬性,包括:as-path、local_preference、community、origin-code。與advertise-map合用,只繼承advertise-map裏面匹配的明細路由的屬性。如果繼承了as-path屬性,繼承的as-path如果沒有在大括號{ }中顯示,則有幾個算幾個AS;如果繼承AS是在大括號中排列的,那麼只算一個AS號。只關心AS的號碼,不關心順序。
* As-path、as-seq(as-path)原子聚合不帶任何AS。AS-SET首先是區別於atomic-aggregate,產生了AS的序列,序列中無分先後順序,這一點也不同於有明確順序的AS-SEQEUENCE
* Attribute-map和route-map
* 這兩個參數一樣,可以將聚合路由的屬性清除掉(除了as-path屬性),添加自己需要添加的屬性。Attribute-map 與 as-set的合用時,能否將聚合的路由的屬性重置。(OK可以改)
* Summary-only將聚合路由所包括的所有路由都抑制掉,被抑制的路由在bgp的轉發表裏,顯示爲s,代表suppress的意思。發送更新時,只發送聚合路由。可以與
* neighbor 1.1.1.1 unsuppress-map XX合用,對特定鄰居漏過特定的明細路由。
* Suppress-map,將suppress-map裏面匹配的路由抑制掉,被抑制的路由在bgp的轉發表裏,顯示爲s,代表suppress的意思。發送更新時,只發送聚合路由和沒有被抑制的明細路由。可以與
* neighbor 1.1.1.1 unsuppress-map XX合用,對特定鄰居漏過特定的明細路由。