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

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网络架构由三部分构成:
- CE(Customer Edge):位于公司的边界
- PE(Provider Edge):ISP的边界
- P(Provider):中间转发的设备
站点(site):就是MPLS VPN的用户,由CE和其他用户设备构成的
技术架构
MPLS VPN是多种技术组合使用的一种综合解决方案
- MP-BGP:负责在PE与PE之间建立邻居,传递站点的路由信息
- LDP:负责PE和PE之间建立隧道
- VRF:负责PE的VPN用户管理,区分用户的路由信息
- 路由协议:静态、IGP、BGP,负责CE与PE之间的路由信息交换

常见组网
Intranet

一个VPN中的所有用户形成闭合的用户群,同一站点之间可以互访,不同VPN站点之间不能互访.其站点通常是属于同一个组织、公司。
PE通过为每个站点创建VPN实例,并配置全网唯一的RD。和通过配置Import RT和Export RT来控制不同VPN的站点做到无法互访。
Extranet

适用于一个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

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

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

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路由和数据的交互
路由传递

CE到PE(Intranet场景)

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相同的情况。

如果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)特性来避免环路。

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

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路由。

VPN-IPv4地址又被称为VPNv4地址
VPNv4地址共有12个字节,主要由:
8字节的路由标识符RD+4字节的IPv4地址前缀。
BGP
PE之间建立BGP邻居关系,并通过BGP进行路由传递。
BGP使用TCP作为其传输层协议,提高了协议的可靠性。可以跨路由器的两个PE设备之间直接交换路由。
BGP拓展性强,为PE间传播VPN路由提供了便利。
PE之间需要传送的路由条目可能较大,BGP只发送更新的路由,提高传递路由数量的同时不占用过多链路带宽。
在MPLS VPN中,我们使用的是RFC2858的MP-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值来控制路由的发布与接收

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)不同站点之间的路由互通。
至此就完成了控制层面的任务,路由的传递。
路由交互全过程
- 现在CE设备上通过:IGP或则EBGP交换私网的路由
- PE设备把学习到的私网路由添加到VRF实例中
- PE设备把路由引入到MP-BGP(如果PE-CE之间运行的就是BGP,则无需手工执行路由引入操作)然后RD值会被添加到IPv4路由上,构成VPNv4路由。
- VPNv4路由被PE设备通过MP-IBGP的Update消息通告给PE2。Update消息携带MP_REACH_NLRI属性(包含VPNv4路由前缀,下一跳和标签等重要信息)和RT属性。
- 远端PE根据RT将路由导入特定的VRF,同时将VPNv4路由的RD剥除,将IPv4路由通告给相应的客户的CE设备。
- 客户的IPv4路由被通告给CE设备。
数据交互
数据转发时遇到的问题

P设备上没有VPN路由,无法根据IP地址进行转发。
IP头部中不携带VPN相关的信息,PE无法区分数据所属的VPN。
通过标签解决问题
外层标签(公网标签6662):
由LDP为VPN路由的NextHop(一般是PE的某个接口地址)分发,P根据外层标签转发数据到PE。
内层标签(私网标签8888):
由PE的MP-BGP为VPN路由分发。PE根据内层标签确定数据所属的VPN。
MPLS VPN报文转发


图中CE3发出了一个IP报文:
PE2会根据绑定的VPN的实例的RD去查对应的VPN的转发表(FIB表)
然后找到对应的目的IPv4的路由前缀,再去查找对应的Tunnel ID
根据Tunnel ID找到隧道,并打上对应的内层标签(I-L)和外层标签(O-L1)
然后将报文从隧道转发出去

经过P设备后对该报文查询LFIB表进行外层标签的交换,让这个报文能到达PE1
如果这个p设备后面只有PE1一跳了,就可以执行次末跳弹出。

PE1收到该携带两层标签的报文,交给MPLS处理,MPLS协议去掉外层标签。
PE1继续处理内层标签:根据内层标签确定对应的下一跳,并将内层标签剥离后,以纯IPv4报文的形式发送给CE1。