MPLS VPN初体验

 

本节内容小编提醒,非常多非常详细,一定要认真学习噢~那么我们就来正式进行MPLS VPN初体验吧~...

MPLS高富帅之路

MPLS VPN初体验

首先我们来讲讲MPLS VPN的架构。
1)PE(Provider edge)运营商边界设备运营商边界设备,即与客户边界设备相连接。支持MPLS。在PE上,使用VPN实例对不同的VPN客户进行隔离。PE通过与客户设备CE运行路由协议以便获取客户路由,并将路由生成VPNv4前缀放入MPLSVPN Backbone传递到对端PE。
2)P(Provider)运营商设备运营商设备,即不直接与客户设备相连接。支持MPLS,P设备往往并不知道VPN客户网络、客户的路由。它只负责在Backbone内运载标签数据。
3)CE(customeredge )客户边界设备客户网络中,即与PE直连的设备,主要的功能是将VPN客户的路由通告给PE,以及从PE学习同一个VPN下其他站点的路由。


MPLS VPN(Layer3)详细讲解
在上图所示的网络中,中间是运营商搭建的“MPLS VPN Backbone”,也就是MPLS VPN骨干网络。这个网络面向客户提供VPN业务,使得不同客户的路由、数据都能够通过这个公共的网络进行传输,并且互不干扰。即使他们通过同一张运营商的网络进行承载,客户间的路由及数据是完全隔离的。现在我们来看看MPLSVPN究竟是怎么一回事。

上图中,我们利用两个客户做示例:客户A及客户B,他们各自有两个站点。现在要求客户A的两个站点之间能够互通,客户B的两个站点之间能够互通,而客户A、B之间是完全隔离的。再者,同一个客户的两站点之间,要能够动态的交互路由信息,也就是说客户A的站点1的CE路由器要能够动态的学习到站点2内的路由。
首先客户A站点1的CE路由器及客户B站点1的CE路由器与PE路由器均运行路由协议(也就是PE-CE之间的路由协议),例如BGP或者OSPF,或者干脆静态路由都行,这么做的目的是把本地站点的路由交给PE1,然后让PE1帮忙传递给PE2,再由PE2交给客户A站点2的CE路由器,从而将路由打通。

现在第一个问题来了。从图中我们可以看出,客户A的站点1及客户B的站点1地址空间是重叠的,都是10.1.1.0/24,PE路由器如何区分不同客户的路由呢?

这就要提到MPLS VPN的一个组件:VRF(VPN Routing &Forwarding Instance),虚拟路由及转发实例,在我司的平台上是VPN-Instance。所谓的VPN实例,我们可以简单的理解为是“一台虚拟路由器”,通过在PE1上创建两个VPN实例,分别用于为客户1及客户2提供服务。在PE1创建的这两个VPN实例相当于两台虚拟路由器,他们各自拥有完全独立的路由表、转发表、路由协议进程、接口、等等,由于是完全独立的两台“虚拟路由器”,因此即使从两个不同的客户学习到同一个网段的路由也不用担心冲突的问题。
现在PE1上创建了两个VPN实例,分别用于和客户1及客户2交互VPN路由(客户的路由),那么为了将路由传递到PE2我们要考虑几个问题:
1、用什么路由协议来“搬运”这些客户的VPN路由(将他们从PE1搬运到PE2)?PE肯定是面向大量客户的,因此路由前缀的数量肯定非常庞大。
2、MPLS VPN Backbone的P路由器主要的功能是高速地转发数据,如果要他们也一起维护客户的路由肯定会增加负担,如何规避这个问题?

你可能已经想到,有一个协议能够胜任这个工作,那就是BGP,BGP能够承载大量的路由前缀,是一个在骨干网络中被广泛使用的路由协议,而且它具有丰富的路径属性和路由策略工具,使得网络的部署变得非常灵活和弹性。另外,BGP还有一个非常突出的优势,那就是它是基于TCP工作的,它不用像OSPF那样要求邻居必须直连,因此我们可以在PE1及PE2之间来建立iBGP的邻居关系,这样客户的路由就可以直接通过BGP传递,而P路由器则无需运行BGP,也无需维护客户的路由。

当然为了让PE1及PE2能够建立起iBGP邻居关系,我们要打通MPLS Backbone内的路由(注意,只是骨干网内部,不包含任何客户的路由),因此我们需要在Backbone内的PE及P路由器上运行一个IGP,例如OSPF或者ISIS,使得骨干网络内部的路由能够打通,为后面的工作做铺垫。
现在PE1及PE2之间有了BGP连接,PE1通过PE-CE间的路由协议所学习到的客户A及客户B的路由就能够通过BGP传递给PE2,但是问题又来了,客户A的站点1及客户B的站点1使用重叠的地址空间,都是10.1.1.0/24,PE1上虽然有VPN实例用于区分,但是现在要把这些路由通通传递给PE2,那么如何保证这些路由在MPLS VPN Backbone中传递时的唯一性呢?如何规避他们的重叠问题?

很简单,我们为路由10.1.1.0/24增加一个“前缀”,这个前缀称为RD(route distinguisher),RD值为64个比特长度,表现形式通常为123:11类似这样,也就是AS:NN的形式。我们给PE上的每一个VPN实例均设置一个唯一的RD值,例如为客户1设置一个6812:1,为客户2设置一个6812:2,然后当要把客户1的路由放进BGP搬运给PE2时,我们将IPv4的路由前缀10.1.1.0/24前面增加该VPN的RD值,得到6812:1:10.1.1.0/24,这样就构成了一个64+32比特也就是96比特的新前缀,这个前缀我们称之为VPNv4前缀,客户B的站点1路由在BGP中传递时就变成了6812:2:10.1.1.0/24,如此则可解决地址重叠的问题,保证所有客户路由的唯一性。

传统的BGP只能够运载10.1.1.0/24这样的IPv4路由前缀,现在我们要让BGP运载6812:1:10.1.1.0/24这样的VPNv4前缀,就需要对BGP进行扩展了,扩展以后的BGP我们称之为MP-BGP,也就是Multi-Protocol BGP,翻译为多协议BGP:
现在客户A及客户B的路由终于是传递到了PE2上,接下去PE2就要把客户A站点1的路由传递给客户A站点2的CE路由器、把客户B站点1的路由传递给客户B站点2的CE路由器。问题又来了,PE2如何知道该吧哪条VPN路由交给哪个客户的CE呢?

显然在PE2上为了区分它自己所直连的不同客户,也需要创建VPN实例,但是从PE1收到的这么一大坨的路由前缀,哪些是要放进哪一个VPN实例的现在还是无从得知,因此我们需要一个新的标记来帮助PE,这就是RT(Route Target)值
如上图所示,PE1在将客户A站点1的路由通过MP-BGP传递给PE2之前为路由打上“标记”,也就是RT值6812:1,而为客户B站点1的路由打上标记6812:2,这些RT的标记实际上是“粘贴”着VPNv4前缀一块儿传给PE2的,其实他们是以BGP的扩展Community形式来存储的。如此一来路由到了PE2后,PE2就能够根据RT值来将不同的路由导入到对应的本地VPN实例中。
终于,路由千辛万苦被传递到了远端站点的CE路由器上。但是,事情还没有结束。设想一下,虽然客户A站点2的CE路由器已经学习到站点1的10.1.1.0/24路由,现在它发送数据到站点1,这个IP数据包先是送到PE2,PE2通过VPN路由表的查找找到匹配的条目来自BGP,那么接下去呢?直接把IP数据包送出去么?

肯定是有问题的,因为IP数据包如果直接送出去,P路由器接收了铁定就丢包了,因为它并没有运行BGP也没有VPN客户的路由,它只有MPLS Backbone内的路由,这就出现了路由黑洞。

怎么办,得为这个IP数据包穿上一件马甲,这个马甲整个MPLSBackbone都能认识,而且能帮助我们把这穿了马甲的数据包从PE2送到PE1去,这就是MPLS标签。当PE2把来自VPN客户的IP数据包送到MPLS VPN Backbone之前,要为数据包压入一层标签:
这层标签显然是P路由器给分发的,为谁分发的? 为PE1路由器的Loopback路由分发的标签,而这个Loopback地址,就是PE2上去往目标网段路由(客户A的站点1)的下一跳地址。PE2为数据包压入标签后,送到P路由器,P路由器沿着建立好的LSP将标签包送到PE1路由器。当然,为了保证整个MPLS VPN Backbone能够建立LSP,要在设备上都激活MPLS和LDP,这就是为什么我们称之为MPLSVPN。

但是,标签包是到了PE1,PE1该如何处理里头的数据呢?这个包是去往10.1.1.0/24网络的,而自己有两个10.1.1.0/24网络直连啊,为了解决这个问题,我们就需要为数据包再压入一层标签:
PE2将IP数据包送上MPLS VPN Backbone之前,为数据包压入两层标签,其中外层标签,也就是标签1011我们称之为IGP标签(或者LDP标签),它是由P路由器通过LDP协议分发的。而1233标签是内层标签,我们称之为VPN标签,它是由PE1路由器通过MP-BGP分发给PE2的。

外层标签是为了将数据沿着LSP送到PE1,而内层标签是为了再数据到达PE1后,让PE1判断该数据包究竟是应该送到哪一个VPN的哪个接口,因为VPN标签是PE1分配的所以它肯定不会搞错。
完美的解决方案。
数据包终于穿越了整个MPLS VPN网络,到达了站点1。这就是MPLS VPN。

综上所述,我们大概可以看出,MPLS VPN的实现,大致需要如下组件:

  • 首先需要在MPLS VPN Backbone内采用一个IGP(如OSPF、IS-IS)来打通骨干网络内部的路由。
  • 在PE上,创建VPN实例,与不同的VPN客户对接,VPN实例关联RD及RT值,并且将相应的端口添加到对应的VPN实例。
  • 在PE上,基于VPN实例运行PE-CE间的路由协议,从CE学习到客户站点内的VPN路由。
  • 在PE之间,建立MP-BGP连接,PE将自己从CE处学习到的路由导入到MP-BGP形成VPNv4的前缀并传递给对端PE,并且也将对端PE发送过来的VPNv4前缀导入到本地相应的VPN实例中。
  • 为了让客户的数据能够穿越MPLSVPN Backbone,在所有的PE和P路由器上激活MPLS及LDP


关于VRF(也就是我司的VPN-Instance)的概念,大家可以参考如下链接具体地了解一下哦:http://3ms.huawei.com/hi/blog/432623_1388431.html?h=h



点击下方[阅读原文],查看更多


    关注 华为产品资料


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册