Technorati 标签: ,,,,

下面是BGP一些常见的问题和解决手段进行了一个整理.

1, BGP路由的基本使用原则有哪些?

■多条路径的时候,bgp之选最优的给自己使用(通过bgp的选路原则进行比较),当然也可以使用负载均衡.

■BGP只会把自己使用的路由通告给邻居,也就是说本地bgp路由表里面不是最优的路由是不会进行转发操作的.

■BGP从EBGP获得的路由会向它所有bgp相邻体通告(包括EBGP和IBGP),但是因为有水平分割,该路由不会再从原路发送回去。

■BGP从IBGP获得的路由不向它的IBGP邻居通告。

2, BGP路由协议是如何避免环路的?

BGP不同于其他IGP协议,其路由都包含了丰富的路由属性,并通过路由属性来对路由进行过滤,其中一个属性为AS_PATH,该属性为该路由经过的所有AS的序列,这样对于收到的路由,通过对AS_PATH进行检查,如果发现自身的AS号已经出现在AS_PATH属性中,那么就表示自身发布的路由又重新回到自己所处的AS中,(比如说自己的AS为100,当路由传递过来的时候,AS-PATH属性已经为:200,300,100,400,这个时候如果自己收到的时候再进行比较,最后发现100已经在原来的AS-PATH中了那么就表示路由出现了环路)已经出现了路由环路,这时就会丢弃接收到的路由,从而避免继续对外发布路由,导致环路产生。

当然还可以参考上面的BGP使用原则,比如BGP从IBGP收到的路由不继续往IBGP邻居发送(水平分割),这也是协议上避免环路的一种方法(反射路由的处理类似,请参看后续章节)。正常情况下BGP会丢弃AS_PATH中包含自身AS号的路由。对于特定情况下导致的AS号重复的合理环境,可以通过如下命令来进行控制“peer { group-name | peer-ipv4-address } allow-as-loop[ number ]”,其中number取值范围为<1-10>,默认值为1,即允许接收路由的AS_PATH中包含一个自身AS号。当然,在向EBGP邻居发布时,也还要在AS_PATH最后再加上自身的AS号。

3, BGP邻居建立不起来的原因有哪些?

■两边BGP的peer地址不可达(TCP不可达),这个问题一般是因为没有路由所导致的。可以用扩展ping,把源地址和目的地址都带进去然后ping一下进行测试,因为一个路由器的出口可能有多个,所以建议用扩展ping来进行测试。

■邻居的IP地址和AS号配置错误,或者两边配置不匹配导致的,最常见的就是一边是用loopback作为update-source,一边是用物理接口作为update-source,很容易就配置错误.

■OPEN报文协商失败.

clip_image002

OPEN报文主要包括了BGP的版本号,holdtime,router-ID以及可选参数等.

如果对端携带了本端不支持的能力,就会因为报错产生Notification然后导致邻居建立不起来,这类的问题一般都出现在不同厂商之间的兼容性问题。

■BGP的MD5验证配置错误。

■BGP的router-ID有冲突.

当然建立不起来邻居的原因这里只是列出一些典型的情况,具体可以用debug ip bgp events等工具进行具体排查.

4,有什么样的故障排查手段是针对BGP连接建立不起来的情况?

常见的办法有:

■debug ip bgp

clip_image004

打开debug开关是最直接的,但是也是最危险的。因为除非在实验环境,如果真的在公网上面的bgp出口网关.轻易打开debug的话,很有可能造成设备性能到极限最后cpu到100%停止转发或者缓存溢出等问题。

■show ip bgp neighbor,如果bgp邻居始终徘徊在active状态,表示TCP的三次握手都不成功,这个时候最需要排查的就是底层的点到点是否通,有没有路由,建议用扩展ping来尝试一下。或者是看看是否是因为认证密码配置不匹配。

■telnet 到设备上面,一般各类厂商对于重大debugging类的问题要通过console口打印出来.所以可以通过telnet在设备上面将terminal monitor打开,如果是因为OPEN报文中携带了对端不支持的能力而导致状态机初始化,这个时候一般都会打印到屏幕上面。遇到这类的问题就只有通过抓包进行比较到底问题出在了哪里,然后通知研发....:)

5, 使用loopback环回口为什么无法建立邻居?

如果TCP可达的情况下,需要检查配置中是否有:

neighbor x.x.x.x update-source loopback0

neighbor x.x.x.x ebgp-multihop x

第一条命令是IBGP和EBGP邻居都需要的命令,而第二条命令只用于EBGP。默认跳数是1,如果用loopback作为更新源,至少都需要把EBGP-multihop修改为2,否则的话ttl超时数据包就没有用了。

6, BGPnetwork命令用的时候有什么需要注意的?为什么我的IGP路由表中有一个路由是10.0.0.1/24,当在bgp进程下面用命令:network 10.0.0.0以后,连本地的bgp路由表都没有这条路由?

在使用bgp的network命令的时候,必须要当前缀和掩码完全匹配的时候才能实现正常的发布。

10.0.0.0是一个A类的网段,如果没有mask参数,缺省的掩码是8位的,而在本地IGP路由表中是24位的,所以应该把mask参数加上:

network 10.0.0.0 mask 255.255.255.0

最后才能正常的发布.

BGP配置模式下network命令可以带mask参数,也可以不带,不是强制性的,但是当不带mask参数的时候,缺省使用的是路由的自然掩码.在全局路由表中必须具有相同的前缀和掩码的路由才能被network命令正常发布.

7, 为什么从直连的EBGP邻居向IBGP邻居发布路由时,路由会失效?

在BGP中,向IBGP邻居和EBGP邻居发送路由的时候,下一跳的处理是不同的。向EBGP邻居发送路由的时候,next-hop都会改为本地路由器的出接口IP地址作为下一跳,而向IBGP邻居发送路由的时候next-hop是不变的。

不变的意思是. [AS100 router-1]-----------[AS200 Router-2 -----------router-3]

如果有一个路由是AS100 router-1通告给AS200的router-2的时候,router-2的下一跳是router-1.但是当R2将该路由通告给R3的时候,这个时候R3学到的这个路由的下一跳仍然是R1.

如果R3没有IGP路由到R1的,这个时候就会失效。因为TCP不可达。

解决方案就是在R2上面:

neighbor R3 next-hop-self.

将这个命令配置在BGP进程中。

然后再重新刷新bgp,那个时候R3学到的路由的下一跳才会改成R2.