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

  • Post author:
  • Post category:其他


概述

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

查看

TC

P连接状态。

在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坑多,请慎用(手动狗头),有问题一定多关注网络边界、路由通告规则和选路规则。






版权声明:本文为qq_38178062原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。