118挂牌彩图自动更新图
【MPLSVPN】inter-ASMPLSVPNOptionCMultihop-eBGPforv4betweenR
更新时间:2019-08-10

  由于RR已经拥有本AS内的所有客户路由,因此直接在两个AS的RR之间建立一个MP-eBGP邻居关系,是一个不错的解决方案。那么RR之间要建立MP-eBGP邻居关系,首先两个RR得有到达对方Loopback接口的路由。

  由于AS100及200内部的Core IGP协议,已经有了Core内PE及P路由器(这里的RR)的Loopback路由,我们可能第一反应会想到,打通两个AS的IGP协议,但是这显然是不合理的,但却可以考虑用BGP来打通路由。因此如上图所示。蓝色的箭头表示了IPv4的BGP邻居关系的部署。详细看一下,PE1、RR1、PE-ASBR1都激活IPv4地址族并建立IPv4的iBGP邻居关系,同时宣告自己的Loopback口的网段进BGP。AS200 Backbone内的三台路由器同理。接下去两个ASBR之间维护一个IPv4-eBGP邻接,这样,两个AS的运营商路由器路由(其实主要就是各个路由器的Loopback地址)就都打通了,RR1及RR2彼此通过IPv4 BGP学习到了对方Loopback的路由,就可以建立MP-eBGP的邻居关系了。

  现在我们来看一下,在RR1及RR2之间,建立起MP-eBGP邻居关系之后,路由控制层面的问题。由于RR已经有了本AS内的所有客户路由,RR1-RR2之间建立好MP-eBGP后,这些客户路由就能够在RR的MP-eBGP连接上传播了(以CE2的路由8.8.8.8的传播为例来讲解):

  PE2通过PE-CE路由协议学习到,并注入了BGP,然后形成VPNv4的前缀。这条VPNv4前缀是RD值200:8加上32位的8.8.8.8/32构成的,NEXT_HOP是PE2(的Loopback口IP),RT值为所设定的200:7,MP-BGP为这条前缀分配的标签是705。这条VPNv4前缀被PE2传递给了RR2。

  RR2由于此刻已经和RR1建立了MP-eBGP邻居关系,因此它通过这条连接将VPNv4前缀传递给了自己的eBGP邻居RR1。注意我们看这条VPNv4前缀,NEXT_HOP现在变成了RR2,下一跳变了,VPN标签也要跟着变,所以前缀的标签就变成了RR2给该前缀分配的602。

  RR1收到了这条VPNv4路由,将它传递给PE1。注意这时候,由于RR1收到的是一条eBGP路由,因此NEXT_HOP地址不变,仍然是指向RR2(的Loopback口地址),既然下一跳不变,VPN标签也没变,依然是602。

  PE1收到了这条VPNv4前缀,香港本期开奖结果,剥去RD值得到32bits的IPv4前缀,又加上本地VRF配置了Import RT 200:7,因此BGP路由被装载进VRF路由表,最终被重发布到PE-CE的IGP路由协议中,从而被CE1学习到。

  经过前面的配置,CE1及CE2都已经学习到了对方的路由。我们以CE1为例,现在假设CE1要发送数据包去往8.8.8.8,那么这个数据包到达了PE1,首先数据包的目的地8.8.8.8,已经获取到一个VPN标签.602对吧?这是由RR2的MP-BGP分配的,只有RR2才能理解,那么你要将这个数据包一路传到RR2,还需要套一层外壳,也就是LDP标签吧?这个标签就需要RR1来给(实际数据转发的下一跳设备),而需要使用的是6.6.6.6(NEXT_HOP地址)的标签。遗憾的是在RR1的路由表里,此刻6.6.6.6的路由是条BGP的路由,因此它不会为6.6.6.6路由分配标签,那么数据包在PE1这,它就不知道怎么处理了。为了解决这个问题,我们得让AS100的Backbone内看到的AS200 Backbone内的那些路由(主要是PE2及RR2的Loopback路由)为IGP的,只有是IGP的路由LDP才会分配标签。所以我们在ASBR1上将从IPv4 eBGP邻居ASBR2学习到的BGP路由重发布进OSPF 100。如此一来,在PE1、RR1上,获取到的关于RR2、PE2等设备的loopback路由就是OSPF的了,那么LDP标签分发就没问题了。但是,由于ASBR1及ASBR2是重发布的部署点,在他们路由表里,关于对端AS Backbone内的路由可仍然是BGP的,于是乎,ASBR1不会为这些BGP路由分配标签并且将映射消息发送给RR1,那么在RR1这里,又是untagged。在RR2那同理。为了解决这个问题,我们得利用一个特性。这个特性通过在ASBR1及ASBR2的ipv4 vrf进程里完成,例如在ASBR1上,neighbor 10.1.45.5 send-label,在ASBR2上neighbor 10.1.45.4 send-label。如此一来,ASBR1和ASBR2的邻居关系首先会重建,然后在Open消息中会协商新的ability值,这样ASBR1及ABSR2的BGP就得到了多协议的扩展。首先的变化是,他们都能够为本地路由表里的BGP路由分配标签了,同时也会将为前缀分配的标签值通过扩展的BGP在两个ASBR之间互相通告。(原创博文,红茶三杯 版权所有,转载请注明出处)

  那么这样一来,当1.1.1.1的用户去访问8.8.8.8的时候,流量是怎么传输的呢?

  我们看到,事实上,这两个RR,都在流量往返的过程中,各承担一次数据转发的负担。而从BGP网络的设计角度来说,我们更愿意或者说更希望RR只是扮演一个路由控制层面的把控角色,而不承担具体的用户数据转发工作。那么实现的方法很简单:

  这样一来,RR2传递VPNv4路由给自己的MP-eBGP邻居RR1的时候,不会改变VPNv4前缀的NEXT_HOP属性,依然保持为7.7.7.7(始发这条VPNv4路由的PE2)。那么这样一来:

  在前面的讲解中,为了让AS100及AS200内,拥有对端AS内关键设备的、IGP的Loopback路由,使得LDP能够良好的工作,我们在ASBR1及ASBR2上,将BGP路由重发布进了OSPF 100。这是存在风险的,因为BGP携带的路由前缀往往是非常庞大的。另一方面,实际上,譬如说AS100内的路由器,它们线的Loopback7.7.7.7的路由,其他路由在本环境中意义不大。那么完成可以在PE2及RR2上、PE1及RR1上,在通告自己Loopback路由进BGP的时候,打上community,然后在ASBR重发布过程中,利用community来做路由过滤。(原创博文,红茶三杯 版权所有,转载请注明出处)先定义一个route-map

  那么这样一来,我们在BGP到OSPF的重发布过程中,就可以利用这个Community值来执行路由的过滤。同样的,另一侧的网络配置类似。

  在前面的配置中,我们在ASBR1及2之间使用send-label配置,使得BGP为BGP路由分发标签。拿ASBR1举例说,实际上ASBR1在将本AS内的BGP路由通告给ASBR2的时候,所有的被通告的BGP路由都捆绑了标签,那么对于ASBR2来说,实际上就加重了设备的负担,因为其实我们只是需要几个关键性的路由的标签。那么我们可以在前面配置的基础上,利用已经设定好的Community值,来做一些策略。假设我们在PE1及RR1通告自己Loopback路由进BGP的时候打上了Community值100:1,那么我们可以在ASBR1上进一步配置:

  这样一来,ASBR1只会对匹配了Community值100:1的那些BGP路由分发标签,然后传递给ASBR2,其他BGP路由直接放行,不携带标签。

  借助这个方法,我们可以改良一下前面提到的“1.控制重发布到Backbone IGP内的BGP路由”的方法。在ASBR2上,直接用一条route-map,match mpls-label命令可以帮助我们抓取那些ASBR1传递过来的、带了标签的BGP路由,我们只需要将这些路由注入到Backbone的OSPF 100中。

  建立IPv4 BGP邻居关系的目的是为了打通AS100及AS200的Backbone内的路由,使得两个RR之间能够建立起MP-eBGP邻居关系,另外也为后续的数据转发层面的优化做好准备。BGP邻居关系请见下图:

  完成这个阶段的配置后,通过IGP实现了Backbone内的路由可达性;通过BGP实现了AS之间的路由可达性。但是我们留意到在PE1、RR1、ASBR1去往对端AS内的那些路由都是BGP的,而LDP是不会为BGP路由分配标签的,那么这样就会出问题。举例说,RR1上,学习到的6.6.6.6路由(也就是RR2的Loopback路由)是BGP路由,而当PE1要发送数据去往CE2,那么如果VPNv4路由的下一跳是6.6.6.6,PE1就需要关于6.6.6.6的标签,但是RR1是不可能为BGP路由6.6.6.6分配标签并且通告给PE1的,这样LDP的标签分发就出问题了。

  这个重发布的目的,是使得两个AS的Backbone内的路由器学习到的、关于对端AS Backbone内的路由为IGP路由(OSPF路由),从而才能促使LDP分配标签,否则VPN数据传输的时候外层标签的分配就会有问题。

  完成这个配置后,在PE1及RR1上,看到的关于5.5.5.5、6.6.6.6、7.7.7.7的这些Loopback路由就是OSPF外部路由了。但是还有一个问题,对于ASBR1来说由于他是路由重发布的部署点,这些AS200内的Loopback路由仍然是BGP的,同样的对于ASBR2来说,这些AS100内的Loopback路由也特么仍然是BGP的,那么LDP默认情况下是不会对路由表中的BGP路由去分发标签的。如此就造成了RR1上,关于5.5.5.5、6.6.6.6、7.7.7.7这些路由在LFIB中都是untagged的问题,RR2当然也有类似的问题。

  如此一来,ASBR1及ASBR2的IPv4 BGP得到扩展,能够为BGP路由分配并传递标签映射,以解决外层标签的问题。例如ASBR2会为本地的BGP路由5.5.5.5、6.6.6.6、7.7.7.7分配标签,并且将这些标签联同前缀通过BGP传递给ASBR1。那么在ASBR1上:

  ASBR1收到了ASBR2捆绑的标签,同时,它自己也为这些BGP路由分发了本地标签,同时通过LDP传递给了RR1。这样一来相关的外层标签问题就得到了解决。

  到此,我们的大部分配置都已经完成了,可以测试一下从CE1去traceroute 8.8.8.8。

  下面就是一个典型的数据层面的传输过程(标签值实际在做的时候可能和下图不大一样,各有各的情况吧)。

  前面已经说了如果在PE1-ASBR1;PE2-ASBR2之间增加如图的链路并激活OSPF及LDP连接,那么数据转发层面存在不优化的现象,也就是两台RR会承担一部分的数据转发任务。优化的方式前面也说了,我们直接看配置:

  在ASBR1及ASBR2上我们使用send-label关键字扩展了BGP,使得两台ASBR能够为BGP路由分发标签,并且传递给对端。而这种分发标签的行为,会针对其本地的所有的BGP路由进行标签的分发,实际上,我们仅仅需要几个关键的Loopback路由的标签来完成数据转发任务,例如PE1、PE2、RR1、RR2的Loopback口路由,而对于其他的路由,实际上是不需要标签的。那么能否只为这些关键性的BGP路由来分发标签呢?

  再者,我们在ASBR2及2上都做了BGP到OSPF的重发布,这实际上是存在巨大的风险,因为这无疑会加重OSPF的负担,毕竟BGP是用于携带大量路由前缀的,那么我们能否控制重发布,只将那些关键性的路由(实际上就是前面一点所说的,需要分发标签的BGP路由)注入到OSPF中呢?

  首先关键性的路由是PE1及RR1的Loopback,因为他们都是有可能成为VPNV4前缀NEXT_HOP地址的路由。我们在PE1及RR1上,配置一个route-map用于设置community值100:1,然后在宣告自己Loopback路由的时候进行关联。

  在ASBR1上,现在要向ASBR2来传递本AS内的那些BGP路由了,我们也用一个route-map,匹配前面设置了100:1 community值的路由,然后使用set mpls-label关键字,让BGP只为这些感兴趣的路由分发并传递标签,然后其他的BGP路由放行即可。

  而在ASBR2上,收到了ASBR1传递过来的路由,其中关键性的那几条路由是携带了标签的,那么我们只需要将这些带了标签的路由,重发布进OSPF即可对吧?所以也用一个route-map,match mpls-label这条命令可用于匹配携带了标签的IPv4 BGP路由前缀,然后在BGP到OSPF的重发布的时候调用这个route-map即可。

  顺便说一句,从AS200到AS100的路由发布原理是一样的,思路换一下就行。

  红茶三杯网络工程 项目管理 IT服务管理 CCIE培训学习 沉淀 成长 分享微博:博客:站点: