由于静态路由优先级配置过低导致BGP邻居UP时出现短暂路由震荡

发布时间:  2014-06-10 浏览次数:  88 下载次数:  0
问题描述

【组网描述】

AS 65001域内用OSPF打通。RouterA和RouterB均从域内其他设备收到OSPF明细路由。

RouterA和RouterB之间建立IBGP邻居,RouterA和RouterC、RouterB和RouterD建立EBGP邻居。RouterC和RouterD是骨干区域,为了防止路由震荡,BGP下都配置了dampening。

为了控制向AS 100发布的路由数量,并不将OSPF明细路由发布给EBGP邻居。客户在RouterA和RouterB上配置相同的静态黑洞路由做聚合,然后BGP network该网段路由。

【问题描述】
客户做主备平面切换测试,重启RouterA后,发现流量中断,数分钟后流量自动恢复。据了解故障期间在RouterD上发现该网段路由被dampen抑制。
处理过程

【分析思路】

1、明确故障时间点是任何问题分析的出发点。

2、流量中断问题首先确认路由是否正常,是否存在丢失或震荡,从而做到问题定界。

3、查看配置和操作记录,寻找可能引起震荡的线索。

4、针对触发条件,选取路由震荡过程中一个时间点作为分析的出发点,单步分析每一个静止时间点发生的变化和由此造成的影响,从而理清故障过程。

切忌:把震荡过程中瞬间发生的大量事件混杂在一起反而无从下手。

 

【故障分析】

1、如果故障发生在RouterA重启时,则备平面可能存在问题;如果故障发生在RouterA启动以后,则可能是路由发布存在问题。

经确认,RouterA重启时流量并未中断,而是在RouterA与RouterB之间邻居建立后才发生故障,半小时后故障自动恢复。因此排除备平面存在故障的可能,可以将邻居UP后对外发布路由作为分析的出发点。

 

2、在RouterD上发现该网段路由被dampen抑制,说明RouterB向RouterD发布的路由发生了震荡,因为路由被dampen抑制导致流量中断,抑制结束后流量恢复。因此,问题实际上是要定位RouterB上为什么会出现路由震荡。

RouterA和RouterB上的路由源是静态路由,出接口是NULL 0,该静态路由本身不会发生震荡,因此,初步怀疑路由出现环路。

但是,经确认RouterC和RouterD上都配置了策略,不会把源自AS65001的路由再发回给RouterA和RouterB。因此排除四台之间路由发布成环的可能,只能是RouteA和RouterB之间发生了震荡。

 

display ip routing-table x.x.x.x verbose查看,稳定状态下,RouterA上只有一条静态路由,而RouterB上有IBGP和静态两条路由,其中IBGP路由状态为Active,preference是170;静态路由状态是Inactive,preference是200。

因此,怀疑是静态路由preference低于协议路由造成在Active与Inactive之间变化,引起BGP有时能引入静态路由,有时无法引入,导致BGP频繁的发布路由更新和撤销。

 

3、查看配置,没有发现IGP协议引入此静态路由,且稳定状态下IP路由表中并未发现OSPF路由,因此排除IGP、BGP、静态三者之间互引导致循环引入的可能。

RouterA和RouterB在BGP下都配置了preference 10 170 170,而静态路由的preference配置为200,这样会导致IBGP路由优先级高于静态路由,满足出现静态路由和IBGP路由交替活跃的条件。

 

4、问题的触发条件是RouterA重启,对于BGP来说,就是邻居重建。无论邻居建立之前发生什么,路由都是在邻居UP时候进行发布。结合前面分析的故障时间,抓住邻居刚UP的这一时间点,故障过程就容易理清了。

在BGP邻居UP之前,静态路由活跃,RouterA和RouterB的BGP路由表中都只有一条本地引入的静态路由。见表格故障步骤0。

当BGP邻居UP后,RouterA和RouterB都会向邻居发布路由,因此,两端都会收到来自对端的IBGP路由,此时RouterA和RouterB上都会同时存在preference为170的IBGP路由和preference为200静态路由,优选IBGP路由,静态路由都会变为不活跃。见表格故障步骤1。

于是静态路由无法被BGP引入,RouterA和RouterB同时向邻居发布路由撤销。IBGP路由撤销后,两端又都只剩静态路由。见表格故障步骤2。

静态路由重新被优选变为活跃,又可以被BGP引入了,于是BGP 再次向邻居发布路由。如此反复。见表格故障步骤3。

由于两台不同设备在路由收发处理过程存在一定时间差,一旦某一台在发出路由之前先收到对端来的路由,就会由于静态路由不能被引入到BGP路由表,而不再向对端发布BGP路由,此时另一端始终只有静态路由,不再收到IBGP路由也就不会再撤销路由,打破了步骤2到3的循环,达到稳定状态。见表格故障步骤4。

 

 

RouterA

RouterB

0:邻居UP前

S:200

S:200

1:邻居UP后,发路由给邻居

B:170

S:200

B:170

S:200

2:静态不活跃,撤销步骤2发给邻居的路由

S:200

S:200

3:静态路由重新活跃

重复步骤1到2

...

...

4:在RouterB路由发出前先收到来自RouterA的IBGP路由

达到稳定状态

S:200

B:170

S:200

注:

1、S表示静态路由,B表示BGP路由,后面跟的数字为preference值。

2、步骤4 RouterA和RouterB均有可能先收到路由,角色可互换。

 

在BGP路由反复发布、撤销的过程中,路由不仅会发往IBGP邻居,也会发往EBGP邻居,因此,在RouterC和RouterD上路由会被dampen抑制,导致流量中断。当路由达到步骤4的稳定状态后,流量并不会立刻恢复,而是等到dampen惩罚值逐渐衰减,数分钟后惩罚值降低到reuse阈值时,路由才会解除抑制,流量重新恢复。
根因
作为路由源的静态路由preference过低,且被协议引入并互相发布。收路由侧的静态路由会变为不活跃,又会造成协议路由撤销,静态路由重新活跃后,又重新被协议引入并发布。如此反复,导致路由震荡。
解决方案

【方案一】

设计初衷是用此静态黑洞路由做聚合发给EBGP邻居的。RouterA和RouterB均有此静态路由和OSPF明细路由,所以不必互相发布此静态路由。因此,在RouterA和RouterB之间可以做策略不互相发布此路由。两端都不会收到IBGP路由,静态路由始终活跃,不会发生震荡。

 

【方案二】

可以通过peer x.x.x.x route-update-interval命令调整路由发布间隔,RouterA和RouterB路由发布间隔时间不同,就可以避免每次都同时发布路由更新,更快达到步骤4的稳定状态。

 

【方案三】

静态路由preference调整为160,这样静态(160)<IBGP(170),静态路由优于IBGP路由,不会出现震荡。同时,O_ASE(150)<静态(160),如果从域内收到了相同掩码的OSPF网段路由,会优先走OSPF,而不会走到静态黑洞。

 

【方案四】

用BGP的aggregate命令做聚合,而不是引入静态聚合路由。这样就不会出现静态路由与BGP路由交替活跃的情况。
建议与总结

解决方案很多,不一一列举。方案的选取关键是满足客户需求,同时避免对现网造成较大影响,且不留隐患,综合考虑。比如:方案二配置改动最少,影响最小。但是,方案二虽然可以达到稳定,但这种稳定状态下RouterB优选来自RouterA的聚合路由,也就是说所有能命中聚合网段但命中不到明细路由的流量,不是直接被丢掉而是被发往RouterA再丢弃,存在RouterB与RouterA之间不必要的流量。方案三如果静态路由的preference小于150,有可能会导致存在相同网段的OSPF路由时流量仍走到静态黑洞被丢弃。此类等等,都应考虑。

END