BGP 下一跳的理解和實驗

下一跳
路由器將BGP路由更新給ibgp鄰居,下一跳默認是不變的,可以通過next-hop-self修改
路由器將bgp路由更新給ebgp鄰居,下一跳自動更新爲本路由器的更新源地址
第三方下一跳(重定向)

r1#traceroute 4.4.4.4                        
                                             
Type escape sequence to abort.               
Tracing the route to 4.4.4.4                 
                                             
  1 12.1.1.2 40 msec 40 msec 28 msec         
  2 100.1.1.4 [AS 100] 84 msec *  84 msec          (R2對路徑進行重定向)

r2#show ip bgp                                                                 
BGP table version is 10, local router ID is 2.2.2.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> 1.1.1.1/32       1.1.1.1                  0             0 1 i 
*> 2.2.2.2/32       0.0.0.0                  0         32768 i   
r>i3.3.3.3/32       3.3.3.3                  0    100      0 i   
r>i4.4.4.4/32       3.3.3.3                  0    100      0 4 i (但是BGP表中仍然是顯示爲3.3.3.3鄰居地址)
*> 12.1.1.0/24      0.0.0.0                  0         32768 i   
* i100.1.1.0/24     3.3.3.3                  0    100      0 i   
*>                  0.0.0.0                  0         32768 i   
路由器利用重定向,自動將到R4的下一跳定義爲R2的紅色接口

Next-Hop
這個屬性定義了某條前綴的下一跳IP地址
所以下一跳必須是路由表中的某條前綴(包括默認路由0.0.0.0/0)!下一跳屬性通常在 3 個地方被設置
前綴一開始注入BGP時,下一跳依賴於注入方式
aggregate-address——-0.0.0.0(本路由器)
network/redistribute——原路由的下一跳地址,如果原路由的下一跳地址不存在(指向null)本路由器將成爲該BGP路由的下一跳!即0.0.0.0

該爲公認必選屬性,描述了到公佈目的地的路徑下一跳路由器的IP地址。由BGP NEXT_HOP屬性所描述的IP地址不經常是鄰居路由器的IP地址,要遵循下面的規則:
如果正在進行路由宣告的路由器和接收的路由器在不同的自治系統中,NEXT_HOP是正在宣告路由器接口的IP地址,如下圖所示。

如果正在進行路由宣告的路由器和接收的路由器在同一個AS內,並且更新消息的NLRI指明的目的地也在同一個AS內,那麼NExT_HOP就是宣告路由的鄰居的IP地址。如下圖所示。

如果正在宣告的路由器和接收的路由器是內部對等體,並且更新消息的NLRI指明目的地在不同的AS,則NEXT_HOP就是學習到路由的外部對等實體的IP地址。如下圖所示。

從上面圖可以知道,在去往192.168.5.0的網段中會出現路徑不可達的情況,解決這個問題的方法是保證內部路由器知道與兩處自治系統相連的外部網絡,可以使用靜態路由的辦法,但實際的做法是在外部端口上以被動模式運行IGP。但在某種情況下,該方法並不理想。
第二種方法是採用配置選項來做,這個配置選項被稱做next-hop-self。
下面具體詳述了下一跳的不可達的解決方法:
解決下一跳不可達的方法:
1,靜態路由
2,在IBGP鄰居所處的IGP中宣告
3,將與EBGP直連的網絡重分佈進IGP
4,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)。產生第三方下一跳的現象。
-如果R1、R2、R3全部用直連接口建鄰居時會產生第三方下一跳。
-如果R1、 R2用環回口而R1、R3用直連建立鄰居時,會產生第三方下一跳。
-如果R1、R2用直連而R1、R3用迴環口時,不會產生第三方下一跳,如下所示配置。
-如果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。(路由表裏下一跳不會改變)