硬件平台
软件版本
案例介绍
案例 1
问题分析思路
问题总结
案例 2
问题分析思路
问题总结
经验总结
相关命令
路由器以及多层交换机设备
运行IOS/IOS-XR的设备
BGP众多的属性特征与策略为进行灵活的路由控制提供了必要的基础,那么我们先来简单回顾一下常用的主要属性:
通常在AS内部一般用Local_Pref进行策略部署,而对于inter-AS而言As-Path是比较常用的策略,可以实现多种路由选路调整,结合团体属性以及符合规则的正则表达式我们可以为整个BGP网络设置灵活的策略体系。但是在一些情况下BGP策略部署可能与设计的预期有所不同,让我们来看看下面两个案例吧(由于IP地址及BGP信息涉及客户隐私,因此以下案例信息并不来自于客户真实设备,所有信息均来自于实验室设备,供学习参考):
网络结构如下,其中R2为可控制路由器,R1和R4均为上联ISP路由器。网络基本设置如下:
1# R2-R1, R2-R4,R1-R5以及R4-R5之间均为EBGP邻居
2# AS200与AS300都能学习到AS1000的路由并且传递给AS100,在这个过程中都没有策略调整BGP路由属性。
3# R2与R1以及R2与R4之间均为10GE接口,R2在接收来自R4与R1的EBGP路由时也没有任何的route-map进行属性调整。
4# R4的路由器ID为172.16.0.1。R1的路由器ID为192.168.0.1
那么根据BGP选路原则,R2有可能优选R4最为到达R5 BGP路由的下一跳(因为R4拥有更低的路由器ID)。因此去往R5的路由选择如下线路R2—R4—R5。
但几个月后客户发现R2与R1之间的流量明显上升,而R2与R4之间的流量有所下降,检查路由表发现有大量之前选择R4的路由现在选择了R1,经过排查分析,案例中所涉及的R5,R1,R4以及R2对于这部分来自AS1000的路由都没有做任何调整。
最初R2上的路由如下,他的确显示来自AS1000的路由会优选R4(AS300)。
然而现在则优选R1(AS200)
现在我们再来看一下关于具体BGP路由20.20.20.0/32的一些信息。
对于来自R1(192.168.0.1)以及R4(172.16.0.1)的路由20.20.20.0。分析如下:
- 相同的weight权重(默认设置)
- 相同的as-path长度
- 相同的local-pref
- 相同的Original属性(同为external)
- 由于as-path的第一个AS号不同,因此默认情况下MED并不比较
- 到达IGP下一跳相同的cost(下图)
那么按照BGP选路原则路由器是否应该就选择拥有较小路由器ID的邻居作为下一跳呢?其实在进入这一项对比之前BGP会优选最早学习到的路由(也就是存在时间最长的路由),而这点正是我们这个案例的问题所在。
由于互联网络BGP路由有较多不定因素,因此对于某个具体条目的稳定性较难确定,所以对于本例来说R1-R5, R4-R5之间的线路稳定性将会决定R2对于来自R5(AS1000)的BGP路由选择。而这个因素并不是AS100自身所能控制的。因此R4-R5之间的链路震荡将导致路由优选到较稳定的R1-R5链接上。
本案例的关键点在于R2(AS100)没有对来自R1(AS200)以及R4(AS300)学习的路由进行有效控制,最终使得路由选择受到非可控因素的影响。可考虑在R2上部署一些BGP策略,如调整相应的weight权重或者local_pref属性就可以实现灵活的策略控制和流量调整。
网络结构如下:
1# AS100拥有R1和R4两个出口路由器。AS100内部均为IBGP邻居
2# R1与R4上均设置默认路由作为出口,并通过IBGP进行分发
3# R1与R4作为AS100的核心汇聚路由器负责聚合AS100内的地址段,然后发布给EBGP邻居
4# R1与R4互相备份,当上行链路中断时流量自动切换到另一台设备
出于浮动路由的考虑R1与R4上设置的静态汇聚路由和默认路由均设置AD值为250。
然后通过BGP下的network进行分发:
R1与R4相互学习,根据BGP选路原则,路由器会优选本地产生的路由,比如通过network或者aggregate产生的(本地产生的weight值为默认为32768,远端学习到的weight默认为0)。因此R1和R4仍然优选自身设置的路由。下图为R1上的路由信息。
当R1上行链路中断时,默认路由切换到R4。
但是当R1链路恢复时路由仍然走R4,不能切换回R1。
本案例的核心问题在于浮动路由的AD为250,而IBGP学习路由的默认AD值为200。如果在路由器上AD为250的这种浮动路由已经存在,并且network到IBGP中,那么通过IBGP学习到的路由就无法被优选(因为BGP将优选来自本地的路由),自然不会影响到我们的静态路由。
但是当静态路由消失时,比如链路中断,此时BGP表中的local也不存在了,那么从对端学习过来的IBGP路由就会生效,并最终放到路由表中。当静态路由再恢复的时候由于AD值小于IBGP,因此无法在对比时被优选。所以在R1上行链路恢复时默认路由无法切换回来。
既然找到了原因那么解决方法就出来了。把静态路由的AD设置为180或者其他低于200的值。
AD值在路由协议之间进行对比,而各路由协议内有自身的对比规则,比如本例中BGP优选来自于Local的路由。而IBGP学习到的路由没有能够在BGP内部被优选,因此无法进入到AD对比环节,这就是最初问题没有暴露出来的原因。
关于浮动路由的AD值设置需要考虑整体的路由策略,因此如何去选择一个平衡的数值就比较重要。对于本例而言,在R1与R4上的静态路由是指导转发的,而相互学习的IBGP路由是备份,因此这样的默认路由AD值理应低于IBGP AD。 那么回过头来我们再看看那些汇聚路由的AD是否合理呢:
关于这样的BGP汇聚路由也建议设置AD的时候小于IBGP AD,主要原因如下:
1# 汇聚路由通常是发送给EBGP邻居使用,在本AS内不具备实际转发效应(由明细路由完成),但是一旦产生路由黑洞(汇聚就容易产生黑洞,即那些没有明细路由但被包含在汇聚路由网段内的地址),建议让去往黑洞的数据直接在本机丢弃(通过null 0实现),不要再转发至别的路由器。因此汇聚路由在本机生效有利于减少网络中的垃圾流量。
2# 按照之前的原理分析当R1与R4已经形成IBGP时,设置新的AD为250的汇聚路由必须在R1和R4两台设备上同时配置,并确保同时生效。假设首先在R1 上配置,那么R1会生效,并且发送给R4, 那么在R4通过IBGP学习到之后,再行配置的AD为250的汇聚路由就不会生效,因此网络中其实只有R1在通告该汇聚路由。一旦R1路由器故障,那么R4需要重新进行路由通告,从而增加网络的收敛时间。
BGP有众多的属性特征从而可以部署灵活的策略体系,对于出现预期外的问题或者现象根据策略规则,进行细节分析都能找到问题的线索。一些不常用的属性和因素在某些情况下会成为问题的关键,本例可供大家学习参考,希望对您的BGP网络部署和排错有一些帮助。
show ip bgp sum
show ip bgp neighbors x.x.x.x
show ip bgp neighbors x.x.x.x advertised-routes
show ip bgp neighbors x.x.x.x routes
show ip bgp neighbors x.x.x.x received-routes
show ip bgp x.x.x.x
show ip route