HCIP之排障(二)BGP故障排除

概述

        BGP协议排障的大致思路是,首先检查BGP邻居关系是否正常,然后检查BGP路由是否正确。如有必要,再检查BGP协议与其他路由协议的协同方面是否存在问题。

        BGP协议故障问题大概有以下几种,我们针对下图的网络拓扑进行展开,详细解读。

  •  BGP邻居(对等体)关系无法建立
    • IBGP邻居(对等体)关系无法建立
    • EBGP邻居(对等体)关系无法建立
  •  BGP路由故障
    • 没有学习到路由
    • 路由器从EBGP邻居(对等体)学习到的路由在传递给IBGP时,没有修改下一跳
  •  BGP路由黑洞

         本实验网络中,R1、R2、R4、R5运行BGP协议。R1属于AS10,R2、R3、R4属于AS100,R5属于AS50,AS100内运行OSPF协议作为IGP,所有BGP邻居关系都使用Loopback 0接口来建立。R1的Loopback 1接口和R5的Loopback 1接口模拟了两个需要通信的网络。


BGP邻居(对等体)关系无法建立

EBGP邻居(对等体)关系无法建立

        例:假设图中R1和R2的对等体关系无法建立

        因为BGP是基于TCP会话连接的,所以在检查BGP邻居关系时,首先必须确认TCP连接没有问题。当然在查看TCP连接建立之前,首先使用Ping命令,查看两个对等体相互指定的peer {router-id}能否ping通。下图为BGP状态机。

       BGP状态机

        在路由器R1上,使用display bgp peer命令查看bgp邻居状态,重点关注State字段,如果State:Connect,根据BGP状态机,我们可得知,此时TCP连接建立失败。

        在路由器在R1,上使用debugging bgp all;terminal debugging;打开调试功能,查看日志。

        若输出CR TimerExpired,则表示重连计时器超时,TCP连接无法建立。并且提示State is changed from CONNECT to CONNECT,则表示BGP状态机一直在CONNECT状态转圈圈,在不停得尝试建立TCP连接

        在路由器R1上,使用display tcp state命令查看TCP状态,如果看到R1向R2发送了SYN请求。并且179端口处于Listening状态,等待R2回送SYN_ACK,表明R1发给R2的TCP请求并没有获取R2的回应,在BGP的配置中,涉及到TCP建立连接问题的,只有在对等体建立时,双方的认证问题。此时可查看bgp的配置命令,双方的password是否设置,如果设置了,秘密是否一致。


        如果State:Idle,根据BGP状态机,我们要打开debugging,查看是哪种状态转向的Idle

        如果debugging显示,State is changed from OPENCONFIRM to Idle。根据BGP状态机,我们可知,在TCP中断,或者是传输出错的条件下,当R2无法正确接收R1的KeepAlive报文时,会出现这种状况。此时我们需要查看R1和R2的BGP配置信息。

         通过抓包我们看到,R1发送给R2的BGP报文出现了错误,并且R2触发了重传,这样R1的报文无法从10.0.1.1到达10.0.2.2。

        从实验拓扑中,我们可以看到,R1和R2分别处于AS10、AS100,属于不同的AS区域,当R1和R2建立对等体时,属于EBGP对等体的建立。因为在建立EBGP对等体时,最大条数默认为1,而我们的配置,要求bgp通过LoopBack 0建立,这样就增加了一条,所以在配置BGP对等体时,需要设置ebgp-max-hop大于1。

        peer {router-id}  ebgp-max-hop {xx}   //这里我们一般要求ebgp-max-hop为2即可,如果不添加数字,则默认设置最大条数为255

        查看BGP邻居,即可正常建立对等体关系。


        例:假设图中R4和R5的对等体关系无法建立

        接下来我们将视角转向R4、R5,R4和R5也需要通过Loopback 0建立EBGP对等体。

        在进行完基础的配置之后,如果无法建立EBGP对等体,首先可以通过debugging查看错误信息,若提示CR Timer Expired,则可以确定为TCP连接问题,我们可以通过display tcp status查看TCP连接状态。

        在R5上查看TCP状态,如果R5在监听179端口,并且R5的Loopback 0的状态处于Syn_Rcvd,则表示,R5的Loopback 0收到了R4 Loopback 0的TCP请求SYN报文,但是R5没有向R4发送SYN请求,也没有回复SYN_ACK。出现这样的原因,则有可能因为R5不知道如何去往R4的Loopback 0(10.0.4.4)。

        此时我们查看R5的路由表,display ip routing-table,可以发现,并没有去往10.0.4.4的路由,通过配置静态路由即可。

        在这里我们可以看到,小小的疏忽,就有可能导致很复杂的Debugging过程,所有我们还是回到文章开头说到的:BGP是基于TCP会话连接的,在试图指定BGP对等体之间,一定要ping测互相指定对等体的地址的通断性。

        如果通过debugging看到Error/Bad Peer AS,则表明其中一方的peer {router-id} as-number {as-number} as-number指定错误,通过查看bgp配置信息,修正即可。

        IBGP对等体无法建立,排查过程与EBGP相仿,这里不再展开阐述。


BGP路由故障

没有学习到路由

        例:此时所有BGP对等体建立完成,R1正常学习到了20.0.5.5/32的路由,R5没有学习到20.0.5.5/32的路由。

        出现此类故障,我们采用逐段排查法,首先查看R4的BGP路由表(display bgp routing-table),如果R4也没有学习到20.0.1.1/32的路由,因为R4和R2为AS100 连通AS50和AS10的边界,此时我们需要关注R2

        查看R2的BGP路由表,如果R2学习到了20.0.1.1/32的路由,并且是可用的状态,正常情况下,R2应该会把这条路有传递给R4,但是R4并没有接收到这条路由,说明可能是该路由在R2向R4传递的过程中遇到了问题。

        首先,我们查看R2、R4在BGP配置中,是否调用了路由控制策略。如果调用了路由控制策略,则表示路由策略将路由进行了过滤,调整路由策略即可。

        如果R2、R4的BGP均没有调用路由控制策略,此时我们需要将关注点放到路由条目本身。我们知道,两个BGP对等体之间的路由传递过程是可以受到团体属性影响的,所以,不妨在R2上使用display bgp routing-table community命令,查看20.0.1.1/32是否携带团体路由属性。

        注意:如果路由器从BGP对等体学习到一条携带了Community属性的路由,并且Community属性中包含“No-Adversity”,则这条BGP路由仅能供该路由器自己使用,该路由器不能将该BGP路由通告给任何BGP对等体

        如果此条路由携带了团体属性,并且是No-Advertise,这样的话,此条路由条目仅可供R2自己使用,不可以通告给R4。

        我们可以查看R1的BGP配置信息,可以看到,R1创建了团体属性策略,去往10.0.2.2的路由,均会携带团体属性。 此时我们可以在R2创建策略,控制R2收到R1通告的BGP路由后,清除这些Community No-Advertise团队属性。


路由器从EBGP邻居(对等体)学习到的路由在传递给IBGP时,没有修改下一跳

        如果此时R5还没有学习到20.0.1.1/32的路由条目,此时我们需要关注BGP路由的通告规则:当一台路由器从自己的IBGP对等体学习到BGP路由时,如果BGP同步被关闭,即使没有从IGP学习到相应的路由,它也会将这些BGP路由通告给EBGP对等体。并且只通告最优的路由。

        此时我们查看R4的查看路由表,发现学习到的20.0.5.5/32并非是最优的,如果仅有此一条去往20.0.5.5/32的路由,但是没有被选为最优解,说明此路由在物理上不可达。此时我们需要关注此路由的下一跳,如果下一跳是10.0.1.1,则需要查看R4的路由表,显然,R4的路由表中,并没有去往10.0.1.1的路由。也就说明了,为什么R4没有将此条路由通告给R5。

        发生此故障的原因,则是因为R2在学习到R1的去往20.0.1.1/32的路由时,并没有将下一跳修改为自己的地址,就将路由信息通告给了R4,导致R4学习到后此条路由后,并不知道通过R2可以到达20.0.1.1/32,默认其不可达。   

        此时,我们需要在R2设置,通告给R4的BGP路由时,要将下一跳地址,改为自己。

        peer {R4-router-id} next-hop-local

        在此强调,如果从一个AS到另外一个AS,发生了路由学习故障,一定要逐段排查,重点关注网络的边界。

        那么,此时就万事大吉了吗?20.0.5.5和20.0.1.1逻辑上可达吗?


路由黑洞

        在R1上使用源地址20.0.1.1ping测20.0.5.5

        ping -a 20.0.1.1 20.0.5.5

        非常失望......Request time out!!!!!!

        我们知道路由器之间无需直连,只需保证TCP的连通性,即可建立BGP对等体关系,这样虽然使得路由的传递更加得灵活,也引入了新的问题:路由黑洞

        我们可以查看网络拓扑,当R2收到发往20.0.5.5的数据包时,进行路由查询,查询到的结果为,下一跳是R4,但是因为无法直接到达R4,于是R2查询IGP,R2发现可以通过OSPF到达R4,但是下一跳为R3,于是R2将包给了R3,但是在R3上没有运行BGP,所以R3无法通过BGP进行路由,只能查询路由表,发现路由表中,OSPF及其他IGP协议均无法获取去往20.0.5.5的路径,于是将该数据包丢弃。此时,在R3上形成了路由黑洞。

        当从R1的20.0.1.1无法到达R5的20.0.5.5,我们可通过Tracert命令,检测去往目的地的每一条信息,对故障进行定位。

        解决路由黑洞的方法有:

  1.  AS区域全部路由器运行BGP,并且所有设备两两之间建立IBGP对等体,保证所有设备之间BGP可达。
  2. 使用路由反射器或者联邦技术,所有路由器建立IBGP对等体。
  3. 在网络的边界,使用GRE隧道技术,建立Tunnel,通过上次的连通性,建立P-P连接。
  4. 开启路由同步,将IGP和BGP互相引入。只要传递到EBGP的路由,IGP肯定也可达。

路由同步

        当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),他将不能使用该条路由或把这条路由通告给自己的EBGP对等体。除非这台路由器路由器从IGP协议(包括OSPF、静态路由等)也学到了这条路由,也就是要求IBGP与IBP路由同步。


总结

        BGP坑多,请慎用(手动狗头),有问题一定多关注网络边界、路由通告规则和选路规则。 

             

             

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值