然后再次查看R2的BGP表项:
R2#show ip bgp R2#
R2此时表项为空,说明R1并没有把关于R4的路由发给R2。
回到R1显示的BGP表项,我们发现下一跳属性为10.10.34.4,和在R3上的属性一致。这说明IBGP邻居之间发送路由更新时不会更改下一跳属性。
而对于R1而言,10.10.34.4这个地址不可达,因此这条下一跳不可达的路由不能成为“best”。
对于这种情况,往往我们可以在IBGP邻居建立时显示的更改这个行为。使得IBGP发送更新时将下一跳属性更改为自己,这样就不会出现下一跳不可达的现象了。
我们在R3上,对R2发送更新时下一跳更改为自己。
R3(config)#router bgp 1 R3(config-router)#neighbor 1.1.1.1 next-hop-self //更改下一跳为自己 R3(config-router)#exit
然后再次回到R1的BGP表,结果如下:
R1#show ip bgp BGP table version is 3, local router ID is 1.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 *>i4.4.4.0/24 3.3.3.3 0 100 0 2 i
这里可以看到,R1将到R4的路由显示为“best”。下一跳属性也相应更改。
接着在R2上的BGP表示查看。
R2#show ip bgp R2#
依然为空。
这里需要注意两个重要的问题:
BGP路由器只会发送最优路由给邻居,不管是EBGP还是IBGP。
由于BGP内部没有相关属性能防止环路,因此为了避免BGP路由在域内产生环路,所以BGP路由器不会将IBGP路由发给另一个IBGP路由器。
在本例中,R1从IBGP邻居R3上学习到的R4路由,所以它为了防止环路,不会将该路由再次发给另一个IBGP路由器,即R2.所以R2上收不到关于R4的路由。
步骤4的配置
现在我们再来关注下R1到达R4的情况。
我们首先将R1的环回口一样加入到BGP进程中,使得R4也能学习到1.1.1.0/24的路由。
R1(config)#router bgp 1 R1(config-router)#network 1.1.1.0 mask 255.255.255.0 R1(config-router)#exit
然后再重置下R1的BGP连接。
接着查看R1的BGP表项:
R1#show ip bgp BGP table version is 2, local router ID is 1.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 *> 1.1.1.0/24 0.0.0.0 0 32768 i * i4.4.4.0/24 3.3.3.3 0 100 0 2 i
此时R4的路由已经去除了“best”标记。
这就是著名的BGP同步。
BGP同步的概念是:不会把来自于IBGP对1路由作为最优,除非该路由已经通过IGP学习到了或者已经存在 在路由表中。
由于R1开启了同步,因此R4的路由无法作为“bset”使用。这样也就使得R1根本无法再路由表中插入R4的路由。
结合之前在R2上丢包的实验,这种路由黑洞将不会发送,如果同步开启的话。
同步的作用就是防止发生上述的路由黑洞。
但往往现在我们默认是关闭的,因此为了避免路由黑洞,我们对于IBGP邻居必须要进行全互连。
最后我们将R1的同步关闭,然后使得AS 1域内的IBGP连接达到全互连。即添加上R2和R3的IBGP连接。
R1: R1(config)#router bgp 1 R1(config-router)#no synchronization R1(config-router)#exit R2: R2(config)#router bgp 1 R2(config-router)#neighbor 3.3.3.3 remote-as 1 R2(config-router)#neighbor 3.3.3.3 update-source lo0 R2(config-router)#exit R3: R3(config)#router bgp 1 R3(config-router)#neighbor 2.2.2.2 remote-as 1 R3(config-router)#neighbor 2.2.2.2 update-source lo0 R3(config-router)#neighbor 2.2.2.2 next-hop-self //更改下一跳命令 R3(config-router)#exit
在一切完成后,接着再在R1上使用1.1.1.1去ping4.4.4.4,查看连通性。
此时就已经能够正常通信了。