首页 > > > MPLS L3 VPN
相关阅读:
前两篇介绍了MPLS的基础,MPLS的control plane,data plane,MPLS unicast。有一点一直没有说,为什么MPLS会变得流行?之前讲过了MPLS转发上的不同,能带来性能上的改善,这是RFC上给出的提出MPLS的原因。但是之前也说过,随着设备的发展,这方面的优势已经不存在了。那为什么MPLS会变得流行?是因为MPLS的各个应用场景所带来的优势。这次来看一个MPLS的应用:MPLS L3 VPN。
MPLS L3 VPN或许是MPLS最广泛的应用,MPLS 的流行也与MPLS L3 VPN的广泛部署有关。那什么是MPLS L3 VPN?一个词一个词看。
MPLS L3 VPN又称为BGP/MPLS IP VPN,由RFC4364定义。这不是某个特定的而技术或者协议,而是一些技术的集合应用。
要说MPLS L3 VPN的好处,要先从VPN的实现模式说起。目前的VPN实现主要有两种模式:overlay和peer-to-peer。
VPN是为了替代物理专用网络而出现,物理专用网络是通过架设或者租用物理线路来实现跨地域的互联。那VPN最开始的实现,就是服务提供商(Service provider)向用户提供模拟的线路,用户基于模拟线路来实现跨地域互连,这里的模拟线路也叫做VC(Virtual circuit)。这种VPN的实现方式,就是overlay 模型。VC的提供者,也就是服务提供商不参与用户网络的组建。用户需要在自己的设备CPE(Customer Premises Edge)上,建立跨地域的连接。服务提供商的角色如下图所示:

从用户的角度来说,逻辑上,用户各个地域之间的设备,是按照下图方式连接的。用户的CPE之间路由协议数据通常是在用户设备之间直接交换。例如,Alpha要访问Beta,那用户需要自己在Alpha网络里面配置好目的地是Beta的路由(或者通过IGP,BGP配置),再通过VC线路转发。

早期的overlay VPN可以通过一系列二层技术实现,例如X.25,Frame Relay,ATM或者SMDS。随着技术的发展,overlay VPN也可以通过IP-over-IP tunneling来实现,最常见的就是GRE VPN,IPSec VPN。OpenStack中的VPNaaS就是基于IPSec实现的。
overlay VPN的好处是,服务提供商与用户的分工明确,并且也容易理解,毕竟服务提供商还是提供可租用的线路。这也是最早VPN的实现方式。但是,随着用户场景是发展,出现了以下问题:
用户的问题永远是最大的问题,因此,另一种VPN实现模型:peer-to-peer被提出。peer-to-peer model下,服务商的edge设备是一个路由器(PE),直接与用户的edge设备(CE)交换路由。也就是说,服务提供商不仅参与数据的传递,同时也参与路由协议数据的传递。 peer-to-peer模式下,服务商的角色如下图所示:

这与最开始的租用线路已经很不一样了。同时服务提供商也参与用户网络的构建,两者分工变得模糊。但是peer-to-peer解决了overlay模型的实际问题。
没有悬念,MPLS L3 VPN是一种peer-to-peer模式的实现,但不是唯一的实现。实际上,现在的服务提供商网络里面,存活着其他的peer-to-peer模型的VPN网络,这里就不展开了。相比其他的peer-to-peer 模式VPN,MPLS L3 VPN的优势在于控制简单,成本低,支持IP地址重叠等等其他。总之就是那么好,所以现在MPLS L3 VPN已经成为peer-to-peer 模式VPN的主流实现。
经过前面的描述,实际上已经部分的揭开了MPLS L3 VPN的面纱了。先来看看一个整体架构图:

对比这个图和之前一个图,并没有多太多东西。
VPN提供的是什么服务?在公共基础设施上进行私有网络服务的传播,大白话就是CE1要能访问到CE2,CE3要能访问到CE4,同时CE1不能访问CE3,CE4(类似的对CE2,3,4都只能访问同一个VPN内的私网)。那接下来就分别从控制层面,和转发层面来描述一下MPLS L3 VPN是如何达到这样的效果。
所谓控制层面,就是路由数据怎么传递的?例如,CE2里面是怎么就有了CE1网络的路由,并且能正常工作。
全称VPN Routing and Forwarding tables。
MPLS L3 VPN引以为傲的一个地方就是支持不同VPN中IP地址重叠。为了实现这个功能,MPLS L3 VPN里面做了很多工作。VRFs就是其中之一。
一个PE可能同时连着多个VPN,当多个VPN中存在重复IP地址的时候,且目的地是重复IP地址的网络流量到达PE,PE怎么区分该网络流量属于哪个VPN?PE通过管理多个路由转发表来解决,每个VPN对应一个路由转发表。这样可以对重复的地址指定不同的转发出口。现实情况下,每个VPN在PE上,有以下独立的内容:
除了最后一点,前三点就是一个常规路由器应该做的工作。因此,在PE上,对应每一个VPN,都有一个virtual router与之连接。另一方面,PE还需要与服务提供商网络的P路由器连接,以提供MPLS Tunnel。因此,PE路由器还有一个非虚拟的路由器,其实就是原来的PE。对应上图中的PE1,支持VRFs的PE内部逻辑架构如下图所示。

前面提到了,PE内部对每一个VPN,都会有一个独立的路由交换进程与对应的CE相连。因此,如果有多个VPN连接PE,那就会有多个独立的路由交换进程,分别与CE交换各自的路由。这就是两个路由器之间普通的交流,可以是IGP例如:OSPF,EIGRP,也可以是BGP,如果不嫌麻烦,也可以配置静态路由。总之,现在CE1的路由,已经传递到了PE1中的VPN1的VRF table当中。
MP-BGP是BGP-4的扩展,改版多次,最新的版本由RFC4760定义。尽管在传播的内容上有所不同,但是这里的MP-BGP本质还是一个BGP。在MPLS L3 VPN的场景下,本质上就是一个iBGP,BGP session建立在PE1和PE2之间。PE1通过这个BGP session将CE1的路由传递给PE2。这里有两个问题:
先看第一个问题,我们知道,BGP-4只支持IPv4。而MP-BGP扩展了BGP-4之后,支持了多种协议,其中就包括了专门为MPLS L3 VPN指定的VPNv4地址。
IPv4地址是4个字节,VPNv4在IPv4地址之前,增加了8个字节的标识符,这样VPNv4地址总共就12个字节长。增加的8个字节叫做RD(Route Distinguisher)。一个VPNv4的地址格式如下图所示:

RD就是一个数字,不应该认为RD包含了实际的信息,它也不应该被用来表示当前路由归属于哪个VPN。它的唯一目的就是区分相同IPv4 prefix的路由,这样BGP进程不会认为这些路由相同而进行合并。常见的RD构成方法是Type=0,Administrator Subfield=iBGP AS number,Assigned Number Subfield=每个VPN唯一的编号。还有其他的RD构成方法,因为没有必要,就不展开了。
现在第一个问题解决了,相同目的地址(IP prefix)的路由能够在MP-BGP中,通过VPNv4地址区分开来。但是仅仅是能把它们区分开来,BGP进程如何知道路由该分发给哪个VPN?
RT决定了BGP路由属于哪个VPN,并且决定了,当BGP路由到达对端PE时,要传递给哪些VRF。这看起来就是对路由进行分类,这与BGP community 的作用类似,但是BGP community只支持2字节的内容,而RT被定义为8个字节的内容。不过好在BGP community也扩展了,因此RT被编码在了BGP Extended Community里面(RFC4360)。RT的结构与RD类似。这样,RT也作为BGP的内容,随着VPNv4地址,在BGP session中传递。
现实中,RT与VRFs强相关。VRF有两个参数,一个是Export Targets,一个是Import Targets。当VRF Table中的IPv4 prefix被转换成VPNv4地址,并生成MP-BGP数据时,所有的Export Targets会作为BGP community 数据,一起加入到BGP数据,传递给对端的PE。而对端PE在收到了BGP数据时,只要自身的VRF tabel的Import Targets包含了至少一个BGP路由中的RT,那么这条VPNv4地址就会写入到这个VRF tabel中。
一条BGP路由,只能有一个RD,但是可以有多个RT。RT和RD有着同样的结构,为什么不用RD来区分VPN(即用RD实现RT功能)?首先,分开定义有分开定义的灵活性。其次,当一条路由需要传递到多个VPN时,如果没有RT,就需要创建多条BGP数据,每条有着不同的RD。而有RT的话,只需要创建一条BGP数据,带上多个RT即可。从数据的长短来看,后者更有优势。
前面说过的PE中对应VPN的Virtual router包含了与VPN相关的路由器变量,就是指RT和RD。通常的做法是,创建VRF时,就指定VRF对应的RD和RT,这样,MP-BGP进程会自动的取出RD与RT,生成VPNv4和BGP extended community,进而生成相应的MP-BGP数据中。在MPLS L3 VPN场景下,一条MP-BGP数据的结构如下图所示:

整体结构与BGP-4类似,在之前的BGP漫谈说过,简单过一下内容。
最后再来总结一下,当PE1把这份沉甸甸的MP-BGP数据送到PE2之后,PE2会怎么处理。
经过MP-BGP的不懈努力,PE2终于有了CE1的路由信息,并且多个VPN可以共用这个路由传输通道且相互不影响。
这部分与CE-PE是一样的,通过PE2中的Virtual router和对应的路由交换进程,CE1的路由最终到达了CE2。整个过程如下图所示。现在CE1->PE1->PE2->CE2都有了到达CE1连接网络的路由。

注:这里应该是VPN1的,但是因为盗的图,所以变成了VPNA。
所谓转发层面,就是实际的网络流量如何传输?CE2的数据包如何到达CE1?
CE2因为从PE2学习到了CE1网络的路由,因此,对应的路由下一跳是PE2。CE2直接将目的地址是CE1的数据包发往PE2。这对CE2来说就是一个普通的路由转发。数据包到达PE2,准确的说是到达了PE2中对应的Virtual router中。
PE2中的VRF Table收到了CE2传来的数据包,因为之前是从PE1学习的CE1网络的路由,因此,对应的路由下一跳(next hop)是PE1,这个时候的nexthop叫做BGP nexthop。根据nexthop,VRF Table会将数据包发往PE1地址。还记得前面说过的随MP-BGP一起发送的MPLS Label吗?这时候,VRF Table还会把与BGP路由绑定的MPLS Label加入到数据包中。这个MPLS Label标识了VPN,因此通常也称为VPN Label,或者私网Label。这样在VRF内部,IP 数据包就变成了MPLS数据包。
由于PE1并未与PE2直接相连,虽然VRF 会将数据包发往PE1,但是数据包不能直接到达目的地。虽然PE1未与PE2直接相连,但是在建立MPLS Tunnel的时候,PE1已经把自己的路由信息传递给了PE2,也就是说,PE2知道如何到达PE1,为了让数据包能转发到MPLS Tunnel,这个时候会做nexthop转换。根据上一篇讲的内容,PE2中,对应PE1的下一跳(nexthop),是MPLS Tunnel中PE2的downstream LSR。因此这里的nexthop会变成PE2对应的downstream LSR,这个nexthop叫做IGP nexthop。与此同时,PE2还会给数据包打上MPLS Tunnel的Label。此时,数据包相当于有了两个Label,都在一个Label Stack里。这里的MPLS Label通常称为Tunnel Label,或者公网Label。CE2的数据包从进入PE2到出PE2,对应的MPLS Label的变化如下图所示:

如果CE4也向对端的CE3发送数据,那么对应的MPLS Label的变化如下图所示。

可以看出,虽然不同的VRF会打出不同的VPN Label。但是经过PE之后,最外层标签统一都是公网标签。带着公网标签,数据包进入到MPLS Tunnel。
前面两篇说过,MPLS转发只关心外层标签,不关心外层标签之内,究竟是IP packet还是另一个MPLS packet。因此,对于MPLS Tunnel来说,所有的数据包都是普通的unicast传输。虽然实际上有两个VPN的数据在MPLS Tunnel中传输,但是LSR完全不知道。简单回顾一下,MPLS Tunnel或者LSP是如何处理外层标签,也就是Tunnel Label。

如果采用了PHP(Penultimate Hop Poping,上一篇有讲),那么倒数第二个路由器会将Tunnel Label弹出。这样,PE1收到的就直接是带VPN Label的数据包,PE1根据VPN Label,能找到对应的出口网卡/线路。毕竟这个VPN标签是自己生成并发出去的。发出去之前,该记录的都已经记录了。

到了对应的线路,也就到了CE1了。就这样数据包从CE2一路到达了CE1。
再来回顾几点。
首先,如果用户只有一个uplink,并且用户心够大,那么用户不用从PE学习路由,可以直接将默认路由设置到PE。但是还需要向PE上报自己的路由,OpenStack Dynamic Routing项目就是这样一个模式,只支持单向路由传输。
多个VPN共用MPLS Tunnel,MPLS Tunnel中的P路由器不用知道用户的路由,因为外层标签就有了全部的转发信息。对于服务提供商来说,没有必要在全网都部署高性能的路由器,只需要把高性能路由器部署在PE路由器,P路由器只需要做Label Switching即可。一方面节约了成本,另一方面方便管理。
CE-PE/PE-CE之间都是普通的路由转发,路由交换协议。对于CE来说,完全不需要知道VPN相关的任何信息,IP地址也可以任意使用。用户虽然使用了VPN服务,但除了钱以外,基本不需要付出什么。另一方面,CE路由器的要求也大大降低,这也降低了用户的使用成本。
这才是大家好才是真的好。不论是从用户的角度,还是服务提供商的角度,都更愿意使用MPLS L3 VPN,这也是MPLS L3 VPN如此流行的原因。
最后的最后,如果服务提供商的骨干网络不支持MPLS,也是有别的替代方案。数据在骨干网络中传输的,是通过MPLS Tunnel,现实中还有其他的Tunnel,例如GRE Tunnel。因此可以将本文所有描述的内容保持不变,唯一就是将MPLS Tunnel替换成GRE Tunnel,也能实现类似的peer-to-peer模式的VPN。但是为什么GRE based MPLS VPN不流行呢?首先,GRE的overhead较大,一个MPLS 标签才4个字节,而光是GRE内容就12个字节,还不算额外的IP Header。另外,GRE对QoS的支持不如MPLS好。因此实际中如果可以选择的话,MPLS Tunnel的优势还是很明显的。GRE based MPLS VPN的介绍,可以参考RFC4023 Encapsulating MPLS in IP or Generic Routing Encapsulation (GRE)。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3158076/ ,如需转载,请注明出处,否则将追究法律责任。