由于从同一邻居收到不同RD的VPNv4路由导致选路变化

发布时间:  2013-12-12 浏览次数:  89 下载次数:  0
问题描述

如图CE双归场景,最初客户按照AS号规划RD(route-distinguisher),PE1和PE2上vpna的RD都是100:1。CE1的路由通过PE1和PE2发往ASBR1,ASBR1收到两条VPNv4路由的RD相同。客户规划PE1侧为主路径,PE2侧为备路径,因此根据IGP cost和peer-ip的差异,ASBR1都会优选PE1侧的VPNv4路由发布给ASBR2。
后来客户按照IP重新规划RD,PE1上vpna的RD改为1.1.1.1:1,PE2上vpna的RD改为1.1.1.2:1。客户先调整备路径后调整主路径,调整后发现流量走了备路径,如下图所示。
 
注:黑色箭头表示路由发送方向,红色箭头表示流量方向。
处理过程

【分析思路】
首先,要清楚L3VPN流量是通过标签交换做隧道转发的,因此需要在入隧道的PE(即收到路由的PE3)查看路由信息。
然后,结合VPNv4选路规则分析路由被优选的原因。
最后,根据定位到的问题跟因解释问题触发条件以及问题发生前后的差别。

【相关知识点】
VPNv4路由通过 RD来区分地址空间,因此根据RD+IP/mask来区分路由。IP/mask和RD都相同的才被认为是相同路由,在VPNv4层面会按照BGP选路规则进行选路,只发布一条最优路由给邻居。IP/mask相同但RD不同的被认为是不同的路由,在VPNv4层面不做选路,以RD为单位,各RD都会发布一条最优路由给邻居。
收到路由的PE会将各RD的路由(假设vpn-target都可以匹配)都交叉到VPN实例中,在VPN实例中不再区分RD,按照BGP选路规则优选出一条最优路由。
例如:a、b、c、d、e五条VPNv4路由的IP/mask相同,其中a、b的RD为1:1,c、d、e的RD为2:1。在VPNv4路由表中会以RD为单位进行选路,RD为1:1的路由a>b,RD为2:1的路由c>d>e,不同RD的路由之间不进行比较,因此会发布RD为1:1的路由a和RD为2:1的路由c给邻居。邻居PE收到a、c两条路由后都会交叉到VPN实例中,在VPN实例中不区分RD,会在a和c中选出一条最优路由。

【现网问题分析】
当PE1和PE2上的RD相同时,ASBR1对来自PE1和PE2的相同RD的VPNv4路由做选路,根据BGP选路规则会优选到IGP cost较小的路由,只发布这一条主路径的路由给ASBR2,PE3也只能收到这一条路由,因此流量路径固定走PE1侧。
当PE1和PE2上的RD不同时,ASBR1对来自PE1和PE2的不同RD的VPNv4路由不做选路,ASBR2可以从ASBR1收到两条不同RD的VPNv4路由,都转发给PE3,PE3将这两条路由都交叉到vpna中。
由于PE3无法感知到AS 100中IGP cost和peer-ip的差异,在PE3上这两条路由的所有路径属性均相同、下一跳都是ASBR2、都来自同一邻居ASBR2,所以根据BGP选路规则无法区分出哪条更优,只能根据收路由的先后顺序优选先收到的路由,而不能保证必然优选源自PE1的路由。
流量在PE3上根据最优路由打上标签,流量经过ASBR2和ASBR1时都是通过标签交换来选择转发路径。
据了解,客户先调整PE2侧的RD,后调整PE1侧的RD,因此PE3先收到源自PE2侧的路由后收到PE1侧的路由,所以PE3优选了源自PE2的路由,流量在ASBR1上做标签交换后就会走到PE2侧,而不会根据ASBR1上的IGP cost选择走PE1侧。

根因
PE1和PE2上的RD不同时,ASBR1上对不同RD的路由不做选路,ASBR2可以从ASBR1收到两条RD不同的路由,PE3上这两条路由都交叉到vpna中。因为所有路径属性均相同且来自同一邻居,所以根据BGP选路规则无法判断哪条更优,只能根据收路由的顺序做出选择。客户先调整PE2侧的RD,后调整PE1侧的RD,因此PE3先收到源自PE2侧的路由后收到PE1侧的路由,所以流量走到了PE2侧。
解决方案
【解决方案】
针对现网场景,可以在ASBR1上配置策略apply cost-type internal,将IGP cost作为MED发布,这样在AS 200中就可以感知到AS 100中IGP cost的差异,通过MED做出选路。ASBR1配置举例:
ip ip-prefix ce1addas index 10 permit 123.1.1.1 32
#
route-policy rp-asbr2 permit node 10
 if-match ip-prefix ce1addas
 apply cost-type internal
route-policy rp-asbr2 permit node 100
#
bgp 100
 ipv4-family vpnv4
  peer <asbr2> route-policy rp-asbr2 export

【问题延伸】
  

场景一、
路由并不只是发到AS 200就结束,还会继续发布到AS 300,再到AS 400等等,MED无法带到更远的AS中,也不方便去AS 200、AS 300添加策略。因此apply cost-type internal的方式不可取。
解决方案举例:鉴于MED无法带到更远的AS中,可以考虑增加PE2侧路由AS-Path的长度,这样无论走多远,都会因为AS-Path长度优选主路径。CE1配置举例:
ip ip-prefix ce1addas index 10 permit 123.1.1.1 32
#
route-policy rp-pe2 permit node 10
 if-match ip-prefix ce1addas
 apply as-path 65001 additive
route-policy rp-pe2 permit node 100
#
bgp 65001
 ipv4-family unicast
  peer <pe2> route-policy rp-pe2 export

场景二、
并不是所有的流量都以PE1作为主路径,有些路由(假设111.1.1.1/32)是以PE2为主路径。即到个别目的地址的流量走PE2,其他流量都缺省走PE1。
解决方案举例:仍然按照个别走PE2缺省走PE1的思路,在CE1做路由策略,个别路由向PE2发布时不增加AS-Path长度向PE1发布时增加,其他路由向PE2发布路由时增加AS-Path长度向PE1发布时不增加。CE1配置举例:
ip ip-prefix pe1addas index 10 permit 111.1.1.1 32
#
/* 只对满足pe1addas的路由增加AS-Path长度,其他路由不增加 */
route-policy rp-pe1 permit node 10
 if-match ip-prefix pe1addas
 apply as-path 65001 additive
route-policy rp-pe1 permit node 100
#
/* 对满足pe1addas的路由不增加AS-Path长度,其他路由增加 */
route-policy rp-pe2 permit node 10
 if-match ip-prefix pe1addas
route-policy rp-pe2 permit node 100
 apply as-path 65001 additive
#
bgp 65001
 ipv4-family unicast
  peer <pe1> route-policy rp-pe1 export
  peer <pe2> route-policy rp-pe2 export

注:问题延伸场景还有很多,具体需求具体分析即可,篇幅有限不一一罗列。

建议与总结
RD规划成相同或不同,并没有哪种方式绝对的更优,需要根据实际需求而定。如果需要进行负载分担或VPN FRR等,RD不同更容易实现;而类似于本案例描述的场景,RD相同则更容易控制跨域流量的走向。
同样的道理,问题延伸中各场景的方案举例也没有哪种方式绝对的更优,具体需求具体分析,关键是如何更好的满足客户的实际需求。

END