MPLS VPN

注意
  • 此文提到的 MPLS VPN 具体指的是 BGP/MPLS IP VPN

  • 此文提到的组网方案主要是Intranet

MPLS VPN 组网方案:

Intranet:一个VPN中的所用用户组成闭合用户群,同一VPN站点之间可以互访,不同VPN站点之间不能互访。

Extranet:一个VPN用户希望提供部分本VPN的站点资源给其他VPN用户

Hub&Spoke:在VPN中设置中心访问控制设备,其他用户的互访都通过中心访问控制设备。

MPLS VPN 介绍

MPLS VPN 使用 BGP 在骨干网上发布 VPN 路由,使用 MPLS 在 骨干网上转发 VPN 路由,是一种常见的三层VPN技术。

组成部分:CE、PE、P,这些在 广域网 中有介绍。 CE作为MPLS VPN用户,不需要支持MPLS,也不需要感知到VPN的存在; PE作为运营商边缘设备,既需要支持MPLS,也需要对VPN路由进行处理,性能要求较高; P只需要具备基本MPLS转发能力,不维护VPN相关信息。

站点和VPN的关系

站点(Site)指的是相互之间具有IP连通性的一组IP系统,并且这组IP系统的IP连通性不需要通过运营商网络实现。

站点的划分根据设备的拓扑关系,而不是地理位置,如果公司A的X省网络和公司A的Y省网络之间的CE增加一条物理专线,那么它们就合为一个站点。

对于多个连接到同一服务提供商的站点,制定策略,划分为不同的集合,属于相同集合的站点之间才能通过服务商网络互访,这种集合就是 VPN

一个Site的设备可以属于多个VPN,换而言之,一个Site可以属于多个VPN。

MPLS VPN 技术实现包括:

  • MP-BGP(拓展的BGP,支持VPNv4地址族):负责在PE和PE之间传递站点内的路由信息

  • LDP:负责PE与PE之间的隧道建立

  • VRF:负责PE的VPN用户管理

  • 静态路由、IGP、BGP:负责PE与CE之间的路由信息交互

MPLS VPN 路由交互

MPLS VPN 路由交互包括:本地CE到入口PE、入口PE到出口PE、出口PE到远端CE

本地CE到入口PE

本地CE到入口PE之间使用静态路由、IGP或BGP交互路由信息,交互的都是标准的IPv4路由

入口PE到出口PE

PE收到路由

PE在收到CE传递来的路由之后,需要独立保存不同VPN的路由,并且需要解决地址重叠问题。

  • VRF(Virtual Routing and Forwarding,虚拟路由转发),又称VPN实例,用于实现VPN之间的路由表隔离

  • RD(Route Distinguisher,路由标识符),RD用来区分本地VRF,该属性仅本地有效。8个字节的RD+4个字节的IPv4地址组成96位VPNv4路由,使不唯一的IPv4地址转化为唯一的VPN-IPv4地址,该VPNv4路由在ISP域内传递(区分),RD给某VRF里面的路由打上标签,进而实现地址的复用而不产生冲突。

配置RD时,只需要指定RD的Administrator和Assigned Number子字段。

  • RT(Route Target),VPNv4路由携带的一个重要属性,它决定VPN路由的收发和过滤,PE依靠RT属性区分不同VPN之间路由。RT的格式长度和RD一样,都是8字节,都是三个字段(名称也一样)。

RT包括ERT和IRT:

  • Export Target:本地PE从直连站点学习到IPv4路由后,转换为VPN IPv4路由,并为这些路由添加Export Target。作为BGP的扩展团体属性随路由发布。
  • Import Target:PE收到其他PE发布的VPNv4路由时,检查其ERT属性。当此属性与PE上某个VRF的Import Target匹配时,PE将路由加入到该VRF的路由表中。

RT与RD区别?

RD与RD如此相似,为什么需要使用两个,直接使用一个属性来完成两项工作不好吗?

在网上查看了一些资料后,形成的个人理解: RD主要用于区分本地vpn路由,实现地址复用,说明的是来自哪里;而RT是为了指明这些vpnv4路由该去往何处,说明的是要去哪里。

拿学生毕设例子来说,一个学院下有多个专业,一个专业划分一VPN,一个专业的学生组成一个Site,专业的老师按照也组成一个Site,现在规定老师只能带本专业的学生毕设(对应Intranet组网方案),学生与毕设导师之间的选择,相当于同一VPN内不同站点之间的路由交互。

拿计算机学院为例,学生信息看作路由信息,其中学生姓名作为私有IP地址,不同专业(VPN)之间可能存在同名情况,无法区分,为了区分清楚,添加上专业名称作为标识符,对应的就是RD,但这仅仅描述了学生的信息,还需要包括老师的信息,需要将学生信息发送给老师所在的Site,进行交互,那么就还需要RT来告诉对端PE此条信息要去何处。

那么还是那个问题,我直接使用RD进行过滤不就好了吗,何必多一个RT呢?但问题是在某些复杂的情况下,一个VPN可能有多个RD([VPN FRR]( VPN FRR技术 | 网英的日常 (netheroone.cn) )),此时会对于一个VPN实例,会有两个或以上的VPNv4路由。

因此,可以这么理解:RD只是用来确保路由前缀的唯一性的,并不能说明该前缀属于哪个VRF,还要搭配RT才能确认属于哪个VRF。

PE之间路由传递

PE之间使用MP-BGP进行路由传递,理由如下:

  1. BGP使用TCP作为其传输层协议,提高了协议的可靠性,可以跨路由器的两个PE设备直接交互路由

  2. BGP拓展性强,为PE间传播VPN路由提供了便利

  3. PE之间需要传输的路由条目比较大,BGP只发送更新的路由,提高传递路由的数量同时不占用过多的链路带宽。

PE之间传输路由时,会有几个问题:直连PE的P上没有VPN的路由,无法根据IP地址进行转发,并且IP头部中不携带VPN相关的信息,PE无法区分数据所属的VPN。

解决办法是利用MPLS的标签来解决:

  • PE和P设备之间运行LDP,交换公网标签,建立PE之间的LSP隧道(公网隧道)

  • 入口PE在通过MP-BGP传递VPNv4路由时,携带私网标签,用于区分不同VPN的数据。分配私网标签的方法有:

    1. 基于路由的MPLS标签分配:为VPN路由表的每一条路由分配一个标签(one label per route)。这种方式的缺点是:当路由数量比较多时,设备入标签映射表 ILM(Incoming Label Map)需要维护的表项也会增多,从而提高了对设备容量的要求。
    2. 基于VPN实例的MPLS标签分配:为整个VPN实例分配一个标签,该VPN实例里的所有路由都共享一个标签。使用这种分配方法的好处是节约了标签。
  • 出口PE在接收到VPNv4路由后,需要执行 私网路由交叉隧道迭代 来选择路由

    • 私网路由交叉:VPNv4路由与本地VPN实例的VPN-Target进行匹配的过程称为私网路由交叉。PE在收到VPNv4路由后,既不进行优选,也不检查隧道是否存在,直接将其与本地的 VPN实例进行交叉。
    • 隧道迭代:为了将私网流量通过公网传递到另一端,需要有一条公网隧道承载这个私网流量。因此私网路由交叉完成后,需要根据目的IPv4前缀进行路由迭代,即该IPv4路由的下一跳有对应的LSP存在;只有隧道迭代成功,该路由才被放入对应的VPN实例路由表。

出口PE到远端CE

MP-BGP 将VPNv4传递到远端PE之后,远端PE需要将VPNv4路由导入正确的VPN实例。MPLS VPN使用 RT 控制VPN路由信息的发布与接收。 PE根据RT将路由导入正确的VRF后,将RD值剔除,将IPV4路由通告给远端CE设备,这样远端的站点就学习到了路由。

路由交互全过程
路由交互全过程

MPLS VPN 报文转发

各方案的组网实例

前文提到 MPLS VPN 有三种组网方案,Intranet、Extranet和Hub&Spoke。

Intranet

一个VPN中的所有用户形成闭合用户群,相互之间进行流量转发,VPN中的用户不能和其他VPN的用户通信,站点通常属于一个组织。PE为每个站点创建VPN实例,并配置全网唯一的RD;PE通过IRT和ERT来控制不同VPN的站点无法互访。

Intranet组网方案中,骨干网通过IGP实现IP连通,使用MPLS LSP 公网隧道传输VPN数据,使用MP-BGP传递VPNv4路由

PE和CE之间的路由交换可以使用IGP、静态路由,要注意在PE上将IGP或静态路由的路由引入BGP,从而将站点的私网路由转换成BGP的VPNv4,通告给远端的PE; 还可以使用BGP,但此时就无需在PE上手动执行路由重分发操作,PE会自动将客户(站点)路由转换为VPNv4路由并通告给远端PE,远端PE也会将收到的VPNv4路由转为标准IPv4路由通告给远端CE。

AS号替换

若PE与CE之间运行 EBGP,则可能出现两个站点的AS号相同的情况。

若CE1通告EBGP向PE1发送一条私网路由,并经过PE2发送到CE2,则CE2会由于AS号重复丢弃路由,导致属于同一VPN的站点之间无法连通。

解决办法:在PE上执行 peer substitute-as 使能AS号替换功能,即PE使用本地AS号替换收到的私网路由中CE所在VPN站点的AS号,这样就不会因为重复而丢弃了。

例如假设PE1的本地AS号为123,则PE1在向CE1发送BGP路由时,若发现AS_Path中包含65001,则会用123替换65001。所以,如果有一条路由从CE2传给PE2,再由PE2传给PE1,当PE1再传递给CE1,此时BGP的AS_Path为{123,123},后面的123是被替换的。

但这样在某些场景又会出现环路:

CE1和CE3处于同一个VPN站点1,CE2处于站点2,Site1和Site2的AS号都为65001,为了Site1和Site2之间的路由正常学习,使能了AS替换功能。当CE1传递站点内路由给PE1,PE1传递给CE3,此时CE3会接收路由,导致路由环路。

解决办法:配置SoO(Site of Origin),例如在本例子中,在PE1的BGP上配置 peer 192.168.100.1 soo 200:1peer 192.168.200.1 soo 200:1 (192.168.100.1和192.168.200.1分别是CE1和CE3上和PE1建立BGP对等体的接口地址。)

配置了BGP邻居的SoO后,当接收到该邻居的BGP路由后,会在路径属性中携带该SoO属性并通告给其他BGP邻居。向该邻居通告BGP路由时,会检查路由中的SoO属性是否等于配置的SoO值,如果相同则不通告,避免引起环路

Extranet

VPN用户可将部分站点中的网络资源给其他VPN用户进行访问。

上图中,Site2作为能被VPN1和VPN2访问的共享站点,需要保证:

  1. PE2能够接收PE1和PE3发布的VPNv4路由

  2. PE2发布的VPNv4能够被PE1和PE3接收

  3. PE2不把从PE1接收的VPNv4路由发布给PE3,也不把从PE3接受的VPNv4发布给PE1

Hub&Spoke

将多个站点中的一个站点设为Hub站点,其余站点为Spoke站点。站点间互访必须通过Hub站点,通过Hub站点集中管控站点间的数据传输。

Spoke-PE需要设置Export Target为 Spoke 、Import Target为 Hub

Hub-PE需要使用两个接口或子接口(创建两个VPN实例),一个用于接收Spoke-PE发来的路由(Import Target 为 Spoke),另个一向Spoke-PE发布路由(Export Target 为 Hub)

发布路由过程:

  1. Spoke -CE1 发布路由给Spoke - PE1 。

  2. Spoke-PE1 通过IBGP将该路由发布给Hub-PE。

  3. Hub-PE通过VPN 实例( VPN_in ) 的Import Target属性将该路由引入VPN_in路由表,并发布给Hub-CE 。

  4. Hub - CE学习到该路由,并将该路由发布给Hub-PE的 VPN 实例( VPN_ out ) 。

  5. Hub - PE通过VPN_out发布该路由给Spoke-PE2( 携带VPN_out 的Export Target属性) 。

  6. Spoke-PE2该路由发布给Spoke-CE2 。

具体部署方案

Hub&Spoke 不支持 Hub-CE 与 Hub-PE 使用 IGP ,Spoke-CE 与 Spoke-PE 使用 EBGP 的方式来部署。

支持: 方式一: Hub - CE 与 Hub- PE , Spoke - PE 与 Spoke - CE使用EBGP。在该方式中,Hub-CE通告VPN_out对应的EBGP连接发送给Hub-PE的路由可能带有 Hub-PE 的AS号,因此需要在Hub-PE上配置 允许本地AS编号重复

方式二: Hub - CE 与 Hub- PE , Spoke - PE与Spoke - CE使用 IGP

方式三: Hub-CE 与 Hub-PE 使用 EBGP, Spoke - PE 与 Spoke -CE使用 IGP

为什么不能使用IGP+EBGP?

答:会产生环路。

MCE组网

当一个私网需要根据业务或者网络划分VPN 时,不同VPN 用户间的业务需要完全隔离。此时,为每个VPN单独配置一台CE将增加用户的设备开支和维护成本。

• 具有MCE ( Multi-VPN-Instance, CE多实例CE ) 功能的CE设备可以在MPLS VPN组网应用中承担多个VPN 实例的CE功能,减少用户网络设备的投入。

MCE 将 PE 的部分功能扩展到 CE 设备,通过将不同的接口与 VPN 绑定,并为每个VPN创建和维护独立的路由转发表

MCE与对应的PE之间可以通过物理接口、子接口或者逻辑接口进行互联,PE上需要将这些接口绑定到对应的VPN实例。

MPLS的LSP表项

d56aebf86bc888a96926fde82f9d0c6.png

9f66f123edbf56dd77e77f29fdc9aa8.png

9847a10c2c4837d676fa0551f2b70cd.png

需要明确的一点,标签分发方向和数据报文转发方向是 相反 的,即发送标签时是作为上游,而转发报文时是作为下游。 需要注意的是,P设备作为Egress,向倒数第二跳发送的还是隐式空标签,PE1和PE2则是发送非空标签。

以PE1来说,第一条表项,即PE1作为Egress角色向下游发送标签24246后,数据报文携带该标签进入PE1时,进行解封装,因此无out label 第二条表项,PE1作为倒数第二跳的Transit角色,对于FEC 2.2.2.9 ,向下游发送标签24252,数据报文携带该标签进入PE1,进行标签交换,由于P设备作为Egress时向倒数第二跳发送隐式空标签,即3,因此PE1标签交换后out label为3,因此弹出标签,直接查路由表转发 第三条表项,in label标签为空,即报文进入PE1时并不使用MPLS转发,但PE1作为transit,使用MPLS标签转发 第4、5条表项类似第2、3条。

参考文章