关于运营商BGP邻居建立排障思路探讨
2022-03-09冉崇书
冉崇书
(中国电信股份有限公司广东公司,广东 广州 510080)
0 引言
BGP(Border Gateway Protocol,边界网关协议)是一种用于自治系统AS(Autonomous System)之间的动态路由协议。BGP主要用于控制路由的传播和选择最佳路由。用TCP作为其传输层协议交换整个BGP路由表。当路由表发生变化时,发送更新信号。
BGP是一个距离向量协议,提供在管理域之间管理路由的方法。BGP经历了不同的发展阶段,1989年、1990年和1993年分别公布了BGP协议的版本一(BGP-1)、版本二(BGP-2)和版本三(BGP-3),从1993年开始研发当前版本BGP-4,协议标准为RFC1771。如今BGP-4已经广泛应用于网络中,它提供了一套新的机制以支持无类域间路由。这些机制包括支持网络前缀的通告、取消BGP网络中“类”的概念,BGP-4也包括AS路径的集合,为提议的超网方案提供了支持。
1 BGP原理简介
1.1 BGP报文有五种类型
(1)Open:你好,跟我交个朋友吧!
(2)KeepAlive:我还活着呢,别不理我
(3)Update:有新闻……
(4)Notification:我不跟你玩了!因为你@#$%#$^%%##$#$^
(5)RouteRefresh:再给我发一遍所有信息吧
1.2 BGP协议中消息的应用
(1)当TCP连接建立成功后,发送OPEN消息进行协商。
(2)连接建立后,如有路由需要发送或路由变化时,发送Update消息通告对端路。
(3)连后要定时发送KeepAlive消息以保持BGP连接有效性。
(4)如果因用户配置变化等原因,希望重新得到对端曾经发送的所有路由,并且TCP连接关系不中断,则发送RouteRefresh请求对端发送所有路由。
(5)发现错误或用户干预时,要发送Notification消息通告BGP对端,并中断。
2 故障排查的步骤和原理
(1)配置错误:导致配置错误的原因有对技术细节不了解或者沟通不畅而导致配置错误。
(2)人为错误:打字错误,使用了错误的命令,割接方案设计的问题。
(3)“故障是否是因为软件版本不同而导致的?这个功能是不是在软件版本A是正常的,而目前配置的设备正在运行软件版本B”。
(4)由不同厂家的兼容性问题而导致的故障,如不同厂家设备是否都遵循RFC1771。
(5)由对端导致的故障:因为其他运营商或大客户宣告了错误的路由导致的网络故障。
请记住:一个看起来很复杂的故障,从最简单的测试或者最基础的错误开始排查。这个方法似乎一点都不“高大上”,但往往很复杂的故障,其实都是由一些很低级的错误而导致的[1]。
3 BGP邻居无法建立排查方法
图1 BGP邻居无法建立故障诊断流程图
3.1 BGP邻居之间路由不可达导致邻居无法建立
碰到BGP无法建立的问题,我们第一步需要检查的是邻居地址是否可达。我们可以先使用ping命令进行检查,但注意进行ping操作的时候一定要带上源地址并且设置包长为1 500。
如果建立邻居的地址无法ping通,可能原因有:①链路问题,检查链路互联地址能否ping通;②路由问题,检查建立邻居地址路由表是否正确;③链路MTU限制,不允许大包通过。
3.2 ACL禁止TCP的179端口导致邻居无法建立
如果ping测没有问题,检查一下TCP端口会不会被过滤。此时可以在两端查看是否禁止TCP的179端口。如果设备过滤了179端口,也会导致BGP邻居无法建立。检查配置如下:
再检查TCP的状态。正常BGP建立的前提是两台设备的TCP需要处于esatblished的状态。
如果有禁止TCP的179端口的ACL,需要删除ACL相关配置,或者放通TCP 179端口。
3.3 router-id冲突导致邻居无法建立
邻居两端的router-id一样时,BGP在协商时会检测到冲突,导致邻居无法建立。配置检查如下:
通过debug BGP邻居协议1.1.1.1的BGP报文,可以看到BGP ID无效导致BGP邻居无法建立的日志。
<R2> debugging bgp all peer 1.1.1.1
Jul 15 2021 03:27:01.504 R2 %%01BGP/3/DEBUG_INFO(d):CID=0x8013046c; BGP(VPN 0): Bgp Id field in the OPEN message received from 1.1.1.1(SourceIfIndex:29)is invalid or not negotiable.
小结:
(1)如果没有显式的配置BGP的router-id,BGP的router-id会继承系统的router-id。
(2)debug BGP协议报文,看到两端BGP邻居无法建立的原因。
3.4 邻居AS号配置错误导致邻居无法建立
一定要和对端确认BGP AS号,避免配置错误导致邻居无法建立。检查配置如下:
AS号配置错误,也会导致TCP的状态无法建立的。
3.5 BGP源地址指定错误导致邻居无法建立
如果经过以上4步,BGP邻居还没有正常建立,继续分析其他配置,如果使用connection-interface指定用于建立BGP邻居的源地址时出现指定错误,或在使用loopback口建立邻居时没有使用此命令指定相应的loopback口,也会导致邻居无法建立。检查配置如下:
在不使用connection-interface显示指定源地址时BGP不设置源地址,而是交给TCP来选,TCP通过查路由表来确定出接口,然后用出接口上的接口地址作为建立邻居的源地址。
3.6 ebgp-max-hop配置错误导致邻居无法建立
在用loopback口建立直连eBGP邻居时一定要配置ebgp-max-hop,否则邻居无法建立。ebgp-max-hop两端必须都配置,建议两端配置的跳数配置成一样的。检查配置如下:
如果未配置ebgp-max-hop,查看TCP链接,发现没有和R1(1.1.1.1)成功建立TCP连接,BGP邻居无法建立。
小结:除了ebgp-max-hop,valid-ttl-hops也能达到类似目的。
3.7 MD5秘钥错误导致邻居无法建立
上述的各种排查步骤都使用后,邻居仍然无法建立。还有一种经常碰到的场景是两边密码配置不一致。如果MD5密码不一致,会产生MD5认证密码信息错误的日志。检查配置如下:
查看日志,BGP MD5认证失败,邻居无法建立。
小结:我们必须在在两端的路由器上输入相同的密码,两端的密码要一致;检查系统的日志,看看是否有密码错误的提示;在设备的两端重新输入密码,eBGP的邻居建立起来了。
3.8 peer route-limit限制导致邻居无法建立
如果BGP的邻居建立后马上中断,检查BGP邻居会不会配置了route-limit限制,对端发送的路由数量超过limit的条数,导致邻居建立后很快又down(中断)。检查配置如下:
查看BGP邻居状态,处于IDLE(Ovlmt)状态,表示接收路由超限导致邻居无法建立。
3.9 邻居配置了peer ignore导致邻居无法建立
再看看是不是有人人为关闭了BGP邻居。
检查方法:查看邻居状态,配置了peer ignore一端的邻居会在displaylay bgp peer会显示Idle(admin)
小结:在BGP视图下配置shutdown,也会有相同的结果,只是peer ignore只是针对一个邻居,shutdown则是针对所有邻居。
4 结束语
本文总结了BGP邻居无法建立经常碰到的一些原因及处理办法,按上述步骤去排查后,绝大部分的BGP邻居无法建立的问题都可以解决。除了上述原因,还有可能不同厂商之间对协议的理解存在差异、网络路由震荡等其他复杂问题导致BGP邻居无法建立,此时就需要更深层次的分析了。只要熟练掌握BGP的原理、协议和状态机,遇到问题不慌不乱,有思路,按步骤进行排查,问题是一定可以解决的。