多层面排查BGP协议故障
2020-05-20河南刘进京
■ 河南 刘进京
编者按:很多网络运维工作者在实际运维中会遇到了BGP协议相关的故障,本文就将以实际网络环境来讨论不同原因引起的BGP协议故障,以及解决方法。
BGP协 议(边界网关协议)主要负责以自治系统为单位,在网络之间互相交换路由,并且执行路径的选择,其属于主要用于大型网络服务商的网络协议。
在实际的网络运维中,有时会遇到了BGP协议相关的故障,对其进行分析和有效排查,及时排除故障,对于网络的正常运行是很重要的。
搭建简单实验环境
这里就以简单的例子,来说明BGP的维护以及故障排查的方法。
路由器R1和R2组成名为AS100的自治系统,路由器R3组成自治系统AS103。在R1和R2之间使用环回口S0/0.12建立对等体关系,R1的环回口IP为172.16.1.1/24,R2的 环回 口IP为172.16.0.2/24。R2和R3之间通过物理接口S0/0.23建立对等体关系。因为R1和R2在同一个自治系统内部,所以可以使用环回接口建立对等体。
首先,在R1上执行“show running-config | section route bgp”命令,让其尝试和R2建立对等体关系。对于R2来说,需要执行同样的操作,和R1与R3建立IBGP的对等体关系。执行以下命令,为R1设置下一跳信息:
然后执行“show ip bgp summary”指令,可以检查当前的BGP的汇总信息。执行“show ip bgp neighbors”命令。来查看邻居关系的详细信息。
最后执行“show ip bgp”命令,来查看BGP的数据库信息。
由链路异常引起的故障
在网络运维过程中,有时会遇到一些和BGP有关的故障。例如,在本例中,R1无法收到本自治系统之外的其它路由信息(例如自治系统AS103),在R3上存在172.16.0.3/24的网段,但是在R1上却无法获取这些信息。
首先需要检查R1和R2之间是否可以正常的传送路由,在R1上执行“show ip bgp summary”命令,在返回信息底部查看和R2的邻居关系参数,在其中的“State/PfxRcd”列中显示为“0”,表示从R2上收到了0个路由信息,但是两者已经建立了邻居关系。
然后执行“show bgp neighbors 172.16.0.2”命令,来查看邻居信息,在返回信息中显示“BGP state=Established”,说明两者的邻居关系没有问题。之后检测R2和R3之间的邻居关系,在R2上执行以上指令,发现可以从R1上收到一定数量的路由信息,但是和R3对应的“State/PfxRcd”列 显示的确实“Idle”信息,表示尝试向外部发送Hello包,这说明R2并不知道到达R3的路径。
根据以上信息,可以判断出对方的Neighbors无法找到,无法和其进行通讯。执行“ping 172.16.23.3”命令,无法和对方进行通讯,172.16.23.3为R3的IP。执行“show ip route”命令,在R2的路由表中找不到和R3相关的路由信息。
之后排查的方法升级,首先检测接口信息,在R2上执行“show ip interface brief”命令,在返回信息中的 和“Serial0/0.23”接 口对应的“Status”列中显示“administratively down”内容,说明该端口被Shutdown掉了,这导致R2和R3无法进行直接的通讯,自然无法和对方建立对等体关系。
处理的方法是,执行“int s0/0.23”,“no shutdown”命令,来重启打开该接口,之后R2就会和R3建立对等体关系。当邻居关系建立之后,R2就可以从R3收到BGP路由信息了。
对应的,R1也可以收到相同的BGP路由信息。可以看出,该故障是由于链路异常造成的,导致邻居关系无法正常建立。
由BGP邻居配置参数错误引发的故障
如果R1无法接收来自AS103的路由信息,而且检测和R2的邻居关系处于正常状态,但是在进入R2管理界面后,显示“received from neighbor 172.16.23.3 2/2(peer in wrong AS)”之类的错误提示信息,说明可以从R3收到信息,但是对方配置的AS号码是错误的。
这说明两台路由器之间的AS号码的配置没有对应起来,在R2上执行“show ip bgp summary”命令,在返回信息中和R3对应的“State/PfxRcd”列显示的是“active”信息,说明在R2和R3之间可以互相发送Hello包,但是其中的参数没有匹配和对应。造成无法协商的情况,即使用Hello包中的参数无法继续协商建立邻居关系。
然后执行“ping 172.16.23.3”命令,和R3可以正常通讯。在R2路由器上执行“show running-config| section route bgp”命令,根据返回信息,可以看到“neighbor 172.16.23.3 reote-as 103”信息,说明关于R3的邻居配置关系是正确的。在R3上执行同样的指令,显示“neighbor 172.16.23.3 reote-as xxx”命令,可以看到虽然邻居关系已经配置完成,但是对方的自治系统号却是错误的。
因为R3向R2发送Hello包,里面会携带自身所识别的对方的AS号码。在两台路由器之间建立对等体关系时,一些核心的必要的参数必须互相协商互相对应起来。当携带了错误的AS号码后,自然会出现问题。
因此说,在配置BGP时对于各种参数的要求是很严格的。在R3上执行以下命令,将对方的AS号码修改为正确的值:
这样就解决了上述故障。
由BGP数据库注入路由引发的故障
当R1无法收到自治系统AS3中的路由信息,可以按照上述方法查看R1和R2之间,以及R2和R3之间的BGP邻居关系。
当确认建立了对等体关系,彼此之间满足顺利传送路由的要求。但是在R1、R2和R3上 执 行“show ip bgp”命令,都没有发现收到172.16.3.0/32网段的信息。因为R3的172.16.0.3/24是自身的直连网段,在R3上执 行“show ip route”命令,显示“172.16.3.0/24 is directly connectd”内容,就说明了上述分析的正确性。该网段应该被注入到R3的BGP数据库,注入的方法有多种,包括通过network指令将其匹配到BGP数据库中,或者将直连网段重分发到BGP数据库中等。
这里我们需要关注的是R3究竟采用何种方法实现注入,针对该方法是否存在配置错误的情况。
执 行“show runningconfig | section route bgp”命令,根据返回信息看到其尝试使network命令,直接匹配该网段并将其注入BGP数据库。但是显示的“network 172.16.0.0 mask 255.255.255.0”信 息 却与实际情况不符。
实际上,这是在注入时很容易出现的错误,即试图将172.16.0.0所有网段都注入到BGP数据库中。执行“show ip route”命令,可以看到存在很多网段信息。在上述172.16.0.0网段中的确包含172.16.3.0/24网段,但是在BGP的network配置存在非常严格的要求,即不允许存在包含关系,只有该network被严格的匹配到了路由表中的相应的条目,该路由才会被就注入BGP的数据库中。
只有执行以下命令,才可以实现精确的放入到BGP数据库中:
当问题被解决后,在R1和R2中就会正确的收到自治系统AS3中的路由信息。
根据以上分析,在路由器之间建立了邻居关系后,如果在网段注入上出现问题,同样会导致问题的发生。
另外,在将自己的路由注入到BGP数据库时,将本地的IGP协 议(例 如OSPF等)使用重分发指令实现注入。在默认情况下,该路由协议中的所有路由都会被重分发进去。如果项重分发其中的某些路由信息,必须正确的配置过滤机制。
由邻居关系策略引起的故障
如果R1依然无法获取172.16.3.0/24网段的路由,可以按照上述方法,在R1和R2以及R2和R3之间检查对等体关系。
如果不存在问题,可以在R2上执行“show ip bgp”命令,在返回信息没有发现172.16.3.0/24网段的信息。这可能是因为R3并没有发送Hello包,也可能是R2在接收时将其过滤掉了。在R3上执行上述命令,可以发现存在172.16.3.0/24网段信息。而且在其前面显示“>”号,表示是最佳路由,可以发送给邻居。这就需要在R2上检测过滤机制以及Route-map策略配置了,即策略也有可能影响BGP邻居路由信息的传似。在R2上执行“show bgp neighbors 172.16.23.3”命令,在返回信息中显示“Inbound path policy configured”行,说明入站的路径策略已经被配置过。
在“Route map for incoming advertisement is”栏中显示其名称为“FROM-AS103”。在“Local Policy Denied Prefixes”栏中显示本地策略中拒绝的前缀,可以看到在Route-map方向上有一条路由被拒绝了。
由此分析,从R3发送方向过来的路由信息被R2上的Route-map进行了一些控制,例如对其进行了过滤,导致无法接收来自R3的路由信息。在R2上执行“show running-config | section route bgp”命令,在 返回信息中显示“Neighbor 172.16.23.3 route-map FROM-AS103 in”行,说明该Route map的确对来自R3的路由进行了控制。如果其配置有误,就可能造成上述问题的发生。
执行“show route-map”命令,显示默认的规则为“DEFAULT”,将“Metric”设置为2000。执行“show ip prefix-list”命令,显示该Default前缀列表内容,其中包括“seq 5 permit 0.0.0.0/0”行,说明如果收到默认路由,就将其Metrict的值设置的很大,而该值越大则优先级越低。
这就说明如果R2从R3那里接收到默认路由的话,则很不倾向于转发数据包(即不倾向于将默认路由指向R3)。虽然可以看上去没有问题,但是只存在该默认规则,在Route map当中,如果没有被匹配到的流量,默认情况下其和访问列表以及前缀列表的规则都是一致的。默认情况下,都会丢弃其他所有的路由。即只允许默认路由进入,其余的路由均被丢弃。
解决的方式是,执行:
添加了允许所有的规则,这样包括R3的路由都会被放进来。执行“clear ip bgp * from in”命令,软重置一下入站方向的策略。之后执行“show ip bgp”命令,可以看到已经可以接收来自R3的网段信息了。