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。(路由表里下一跳不会改变)