MPLS VPN

BGP/MPLS IP VPN网络一般由运营商搭建(是一个独立的网络,独立于Internet),VPN用户购买VPN服务来实现用户网络之间的路由传递、数据互通、互联互通等。不能正常上网

image-20241113204055187

MPLS VPN使用BGP在运营商骨干网上发布VPN路由,使用MPLS在运营商骨干网上转发VPN报文。BGP/MPLS IP VPN又被简称为MPLS VPN,是一种常见的L3VPN(Layer 3 VPN)技术。

对于用户而言:

是感觉不到VPN的存在的,相当于你是直连的。是运营商提供的访问所以不需要部署和维护的,

可以有效地减低企业运维难度和成本。而且是部署在运营商的网络上,安全性有保证

对运营商而言:

MPLS是在无连接的IP网络中增加了面向连接控制平面,

支持地址空间重叠的、重叠VPN、组网方向灵活、可扩展性强

可以使用MPLS TE(流量工程)合理的调控现有的网络资源,最大限度的节省成本

MPLS VPN架构

网络架构

MPLS VPN网络架构由三部分构成:

  1. CE(Customer Edge):位于公司的边界
  2. PE(Provider Edge):ISP的边界
  3. P(Provider):中间转发的设备

站点(site):就是MPLS VPN的用户,由CE和其他用户设备构成的

技术架构

MPLS VPN是多种技术组合使用的一种综合解决方案

  1. MP-BGP:负责在PE与PE之间建立邻居,传递站点的路由信息
  2. LDP:负责PE和PE之间建立隧道
  3. VRF:负责PE的VPN用户管理,区分用户的路由信息
  4. 路由协议:静态、IGP、BGP,负责CE与PE之间的路由信息交换

image-20241113204547763

常见组网

Intranet

image-20241113233645022

一个VPN中的所有用户形成闭合的用户群,同一站点之间可以互访,不同VPN站点之间不能互访.其站点通常是属于同一个组织、公司。

PE通过为每个站点创建VPN实例,并配置全网唯一的RD。和通过配置Import RT和Export RT来控制不同VPN的站点做到无法互访。

Extranet

image-20241113233655526

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

通过加入对应的RT值来实现效果

可以看到图中的site1和site3的出方向和入方向的RT值是一样的,此时我们在site2上的入向RT值中加入site1、site3的出向RT就可以同时收到这两个站点的报文。

当PE2发出报文时会携带两个出向RT值,在site1、site3上的入方向上看到Site2中的出方向中包含自己的RT值就会收

这样就可以实现:

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

PE2发布的VPNv4路由能够被PE1和PE3接收;

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

Hub&Spoke

image-20241113233713205

在VPN中设置中心访问设备(总公司,中心站点),其他用户(分支)的互访都必须通过中心访问设备(总公司)进行访问,分支和分支之间不能直接访问。

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

通过设置RT值来实现这个需求

当分支站点site1和site3要访问总部(中心站点)或互访时,把RT入向设置为中心站点的RT值,出向设置为分支站点的RT值。图中使用的RT值用名词的形式表现,但实际上还是使用100:1这种形式

在Hub站点的HUB-PE和HUB-CE之间用两个接口或子接口相连,其中HUB-PE上使用两个VPN实例与HUB-CE相连,一个用来收(入方向),图中的名称为:VPN_in。在这个实例中只有入方向的RT值;另一个发(出方向),VPN_out。在实例中只有出方向的RT值。

假设RT:Hub为100:1,spoke为:100:2

从站点1到站点2的路由发布过程为:

  1. Spoke-CE1发布路由给Spoke-PE1,然后在Spoke-PE1上为这个路由打上RD值和IRT为100:1、ERT为100:2的RT值。
  2. Spoke-PE1通过IBGP将该路由发布给Hub-PE。
  3. Hub-PE通过VPN实例(VPN_in)的IRT属性把100:2的路由引入VPN_in路由表,并发布给Hub-CE。
  4. Hub-CE学习到该路由,并将该路由发布给Hub-PE的VPN实例(VPN_out)。
  5. Hub-PE通过VPN_out发布该路由给Spoke-PE2并携带VPN_out的ERT值100:1。
  6. Spoke-PE2该路由发布给Spoke-CE2。
组网方案
  1. Hub-CE和Hub-PE之间、Spoke-PE和Spoke-CE之间都采用EBGP的方式连接
  2. Hub-CE和Hub-PE之间、Spoke-PE和Spoke-CE之间都采用IGP的方式连接
  3. Hub-CE和Hub-PE之间使用EBGP,Spoke-PE和Spoke-CE之间使用IGP

不存在Hub-CE和Hub-PE之间使用IGP,,Spoke-PE和Spoke-CE之间使用EBGP的方式

image-20241114214823391

Spoke-CE1通过EBGP将路由发布给Spoke-PE1,然后Spoke-PE1通过IBGP将路由发布给Hub-PE。

Hub-PE通过BGP-VPN实例(VPN_in)的Import Target属性将该路由引入VPN_in路由表;

并通过OSPF100多实例发布给Hub-CE。

Hub-CE通过OSPF100学习到该路由,并通过OSPF200将路由发布给Hub-PE。

Hub-PE的BGP-VPN实例(VPN_out)引入OSPF200多实例路由,并将携带VPN_out的Export Target属性的路由发布给所有Spoke-PE。

Spoke-PE2的VPN实例根据IRT属性引入该路由;然后Spoke-PE2通过EBGP发布给本地Spoke-CE2。

Hub-PE的BGP-VPN实例(VPN_out)通过Export Target属性将路由发布给Spoke-PE2的同时,也会将该路由发布给Spoke-PE1。

此时,这条路由是Hub-PE通过IGP(OSPF200多实例)引入的,是没有AS号的。

这样就会造成选路问题

**而从Spoke-CE1来的192.168.1.0/24路由,其AS_Path不为空,所以从Hub-PE返回的路由会优于从Spoke-CE1来的路由。这样会引起路由振荡,**其过程如下:

Spoke-CE1发来的路由因为AS_Path变成非最佳路由。

Spoke-PE1发布Update撤销路由的报文给Hub-PE来撤销192.168.1.0/24路由。

Hub-PE(通过撤销相应的OSPF LSA)撤销发给Hub-CE的路由。

Hub-CE(原理同上)撤销发给Hub-PE的路由。

Hub-PE发布Update撤销路由撤销发给Spoke-PE1的路由。

于是在Spoke-PE1上从Spoke-CE1来的路由又变成最佳路由。Spoke-PE1又通过IBGP将路由发布给Hub-PE。Hub-PE又会返回该路由,从Spoke-CE1来的路由又变成非最佳路由。如此反复。

MCE

image-20241114002341936

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

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

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

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

MPLS VPN路由和数据的交互

路由传递

image-20241113205942590

CE到PE(Intranet场景)

image-20241113210357501

CE和PE之间可以使用静态、OSPF、ISIS、BGP等交换路由信息。

CE和PE之间交互的都是标准的IPV4路由

通过OSPF连接

分别在两个设备之间使用一个独立的OSPF进程并放到VPN实例中(VRF)

然后在PE上把OSPF和BGP(vpnv4地址族下)的路由协议相互引入即可。这样就可以把客户的路由转换成BGP的VPNv4路由

[CE1]ospf 1
[CE1-ospf-1]area 0
[CE1-ospf-1-area-0.0.0.0]network 192.168.x.0 0.0.0.255
[CE1-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255

[PE1]ospf 1 vpn-instance VPNX
[PE1-ospf-1]area 0
[PE1-ospf-1-area-0.0.0.0]network 192.168.100.0 0.0.0.255
[PE1-ospf-1-area-0.0.0.0]quit
[PE1-ospf-1]import bgp

[PE1]bgp 123
[PE1-bgp]ipv4-family vpn-instance VPNX
[PE1-bgp]import-route ospf 1

通过ISIS连接

与OSPF类似,使用一个独立的进程并放到VPN实例中(VRF)

然后在PE上把OSPF和BGP(vpnv4地址族下)的路由协议相互引入即可。这样就可以把客户的路由转换成BGP的VPNv4路由

[CE1]isis 1
[CE1-isis-1]network-entity 49.0001.0000.0000.1111.00
[CE1-isis-1]is-level level-2
[CE1-isis-1]quit
[CE1]interface GigabitEthernet x/x/x
[CE1-GigabitEthernet0/0/0]isis enable 1

[PE2]isis 1 vpn-instance VPNX
[PE2-isis-1]network-entity 49.0002.0000.0000.2222.00
[PE2-isis-1]is-level level-2
[PE2-isis-1]import-route bgp level-2
[PE2-isis-1]quit

[PE2] interface GigabitEthernet 0/0/x
[PE2-GigabitEthernet0/0/2] isis enable 1

[PE2] bgp 123
[PE2-bgp] ipv4-family vpn-instance VPNY
[PE2-bgp] import-route isis 1

通过静态连接

CE3设备上配置到达站点A内各个网段的路由。

[CE2]ip route-static 192.168.1.0 24 PE2
[CE2]ip route-static 192.168.x.0 24 PE2  

PE2设备需要配置到站点B内各个网段的静态路由

[PE2]ip route-static vpn-instance VPNX 192.168.2.0 24 CE3
[PE2]bgp 123
[PE2-bgp]ipv4-family vpn-instance VPNX
[PE2-bgp]import-route static

这样就可以把PE2的VPNX实例的路由表中的静态路由引入到BGP中,让他变成BGP的VPNv4路由,然后通告给远端PE1.

通过EBGP连接

CE2只需要执行基础的BGP设置,不需要VRF

[CE2]bgp 100
[CE3-bgp]peer 192.168.100.2 as-number 123
[CE3-bgp]network 192.168.1.0 24

PE1上只需要在BGP的VPNv4地址族下,创建对等体邻居即可(不需要像IGP那样引入了)。

[PE1]bgp 123
[PE1-bgp]ipv4-family vpn-instance VPNY 
[PE1-bgp-VPNY]peer 192.168.100.1 as-number 100

这样PE1就会自动的把这些路由转化成VPNv4路由通告给远端PE2

而通过PE1通过BGP从PE2学习到去往站点4的路由后,会把他们转换成ipv4luyou通告给CE2

特殊场景下的BGP配置-AS号替换

在一些特殊的MPLS VPN场景中,可能会出现两个站点的AS相同的情况。

image-20241114205307226

如果CE1通过EBGP向PE1发送一条私网路由,并经过PE2发送到CE2,则CE2会由于AS_Path属性,AS号重复丢弃这条路由,导致属于同一VPN的Site 1和Site 2之间无法连通。

为了解决这个问题可以:

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

[PE1]bgp 123
[PE1-bgp]ipv4-family vpn-instance vpn1
[PE1-bgp-vpn1] peer 192.168.100.1 substitute-as

PE1在向CE1发送BGP路由时,如果发现AS_Path属性中有65001,则会用本地AS号123去替换65001。

所以,如果有一条路由从CE2传给PE2,再由PE2传给PE1,当PE1再传递给CE1,此时BGP路由的AS_Path属性为{123 123}。

特殊场景下的BGP配置:SoO

在CE多归属场景,若使能了BGP的AS号替换功能,可能会引起路由环路,需要SoO(Site of Origin)特性来避免环路。

image-20241114210331236

CE1与CE3处于同一个VPN站点1

CE2位于站点Site2,Site1和Site2站点所在的AS号都为65001。

PE与CE之间运行的都是EBGP路由协议,为了Site 1和Site 2之间的路由可以正常学习,需要在PE1和PE2上配置AS号替换功能。

CE1传递站点内的路由给PE1,PE1传递该路由给CE3,由于配置AS号替换,CE3会接收该路由,就会导致产生路由环路。

配置了BGP邻居的SoO后:

接收到该邻居的BGP路由时,会在路径属性中携带SoO属性并通告给其他BGP邻居。

向该邻居通告BGP路由时,会检查路由中的SoO属性是否与配置的SoO值相同,

若相同则不通告,以此来避免引起环路。

[PE1] bgp 123
[PE1-bgp] ipv4-family vpn-instance vpn1
[PE1-bgp-vpn1] peer 192.168.100.1 soo 200:1
[PE1-bgp-vpn1] peer 192.168.200.1 soo 200:1

入口PE到出口PE

image-20241113210328186

lPE在接收到CE传递来的路由之后,需要独立保存不同VPN的路由,需要解决不同的客户使用重叠IP地址空间的问题。

使用VRF的RD值去区分不同站点传递的路由信息。

PE收到不同VPN的CE发来的IPv4地址前缀,本地根据VPN实例配置去区分这些地址前缀。

但是VPN实例只是一个本地的概念,PE无法将VPN实例信息传递到对端PE,这时候就需要使用RD(Route Distinguisher,路由标识符)。

RD长8字节,用于区分使用相同地址空间的IPv4前缀。

PE从CE接收到IPv4路由后,在IPv4前缀前加上RD,转换为全局唯一的VPN-IPv4路由。

image-20241113210801039

VPN-IPv4地址又被称为VPNv4地址

VPNv4地址共有12个字节,主要由:

8字节的路由标识符RD+4字节的IPv4地址前缀

BGP

PE之间建立BGP邻居关系,并通过BGP进行路由传递。

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

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

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

在MPLS VPN中,我们使用的是RFC2858MP-BGP(多协议BGP)

MP-BGP

MP-BGP采用地址族(Address Family)来区分不同的网络层协议,

既可以支持传统的IPv4地址族,又可以支持其它地址族(比如VPN-IPv4地址族、IPv6地址族等)。

MP-BGP新增了两种路径属性:

MP_REACH_NLRI

Multiprotocol Reachable NLRI,多协议可达NLRI。用于发布可达路由及下一跳信息。

MP_UNREACH_NLRI

Multiprotocol Unreachable NLRI,多协议不可达NLRI。用于撤销不可达路由。

使用RT值来控制路由的发布与接收

image-20241113211705931

MP-BGP将VPNv4传递到远端PE之后,远端PE需要将VPNv4路由导入正确的VPN实例。

MPLS VPN使用BGP扩展团体属性:VPN Target(也称为Route Target)来控制VPN路由信息的发布与接收。

本地PE在发布VPNv4路由前附上RT属性,对端PE在接到VPNv4路由后根据RT将路由导入对应的VPN实例。

在PE上,每一个VPN实例都会与一个或多个VPN Target属性绑定,有两类VPN Target属性:

Import Target(IRT):

PE收到其它PE发布的VPN-IPv4路由时,检查其Export Target属性。当此属性与PE上某个VPN实例的Import Target匹配时,PE就把路由加入到该VPN实例的路由表。

Export Target(ERT):

本地PE从直接相连站点学到IPv4路由后,转换为VPN IPv4路由,并为这些路由添加Export Target属性。Export Target属性作为BGP的扩展团体属性随路由发布。

PE根据VPNv4路由所携带的RT将路由导入正确的VPN实例之后,VPNv4路由的RD值剥除,将IPv4路由通告给相应的客户的CE设备。

站点B和站点D的CE设备就能学习到去往各自远端站点的路由。同理,通过一系列的操作,可以实现同一用户(同一VPN)不同站点之间的路由互通。

至此就完成了控制层面的任务,路由的传递。

路由交互全过程

  1. 现在CE设备上通过:IGP或则EBGP交换私网的路由
  2. PE设备把学习到的私网路由添加到VRF实例中
  3. PE设备把路由引入到MP-BGP(如果PE-CE之间运行的就是BGP,则无需手工执行路由引入操作)然后RD值会被添加到IPv4路由上,构成VPNv4路由。
  4. VPNv4路由被PE设备通过MP-IBGP的Update消息通告给PE2。Update消息携带MP_REACH_NLRI属性(包含VPNv4路由前缀,下一跳和标签等重要信息)和RT属性。
  5. 远端PE根据RT将路由导入特定的VRF,同时将VPNv4路由的RD剥除,将IPv4路由通告给相应的客户的CE设备。
  6. 客户的IPv4路由被通告给CE设备。

数据交互

数据转发时遇到的问题

image-20241113213709470

P设备上没有VPN路由,无法根据IP地址进行转发。

IP头部中不携带VPN相关的信息,PE无法区分数据所属的VPN。

通过标签解决问题

外层标签(公网标签6662):

LDP为VPN路由的NextHop(一般是PE的某个接口地址)分发,P根据外层标签转发数据到PE。

内层标签(私网标签8888):

由PE的MP-BGP为VPN路由分发。PE根据内层标签确定数据所属的VPN。

MPLS VPN报文转发

image-20241113215036381

image-20241113215317595

图中CE3发出了一个IP报文:

PE2会根据绑定的VPN的实例的RD去查对应的VPN的转发表(FIB表)

然后找到对应的目的IPv4的路由前缀,再去查找对应的Tunnel ID

根据Tunnel ID找到隧道,并打上对应的内层标签(I-L)和外层标签(O-L1)

然后将报文从隧道转发出去

image-20241113215726040

经过P设备后对该报文查询LFIB表进行外层标签的交换,让这个报文能到达PE1

如果这个p设备后面只有PE1一跳了,就可以执行次末跳弹出。

image-20241113220052131

PE1收到该携带两层标签的报文,交给MPLS处理,MPLS协议去掉外层标签。

PE1继续处理内层标签:根据内层标签确定对应的下一跳,并将内层标签剥离后,以纯IPv4报文的形式发送给CE1。