1.2 BGP/MPLS IP VPN工作原理

本节要介绍BGP/MPLS IP VPN的私网VPN-IPv4路由发布原理以及利用VPN-IPv4路由进行报文转发的工作原理。

在基本的BGP/MPLS IP VPN组网中,VPN路由信息的发布只涉及CE和PE(第3章将要介绍的跨域BGP/MPLS IP VPN组网,还涉及到ASBR),P设备只维护骨干网的路由,不需要了解任何VPN路由信息。PE设备一般维护所有VPN路由。

VPN路由信息的发布过程包括三部分:(1)源端CE把普通IPv4路由发布到直连的PE上,然后转换成VPN-IPv4路由;(2)源端PE把VPN-IPv4路由发布到目的端PE上,以使MPLS隧道两端的PE相互学习对端的私网路由;(3)目的端PE把所学习的源端VPN-IPv4路由转换成普通的IPv4路由发布到直连的CE上,使MPLS隧道两端的Site间相互学习对方的私网路由。

第(1)和(3)部分涉及的都是CE与PE间的路由发布和接收。在BGP/MPLS IP VPN中,CE与PE之间可以通过各种路由方式连接,包括静态路由、RIP、OSPF、IS-IS或BGP路由。CE与直接相连的PE建立邻居或对等体关系后,把本Site的普通IPv4路由发布给直接连接的PE。相反,PE也可以向直连的CE发布转换后的另一端Site的IPv4私网路由。

在BGP/MPLS IP VPN中,关键的是就是第(2)部分,是PE间相互学习私网VPN-IPv4的过程。具体将在1.2.1节介绍

1.2.1 PE间VPN-IPv4路由发布原理

在BGP/MPLS IP VPN中,同一个VPN的各PE间要建立MP-IBGP对等体关系,通过MP-BGP Update消息发布本端的VPN-IPv4路由,以便相互学习对端所连接的用户网络VPN-IPv4私网路由,加入到自己对应的VPN实例中。

在PE间整个私网路由的发布和学习过程中涉及到几个重要的步骤:私网标签分配、私网路由交叉、公网隧道迭代、私网路由的选择。下面分别予以介绍。

1. 私网路由标签分配

BGP/MPLS IP VPN中的PE设备在收到用户报文后要进行MPLS标签封装,这个MPSL标签是插入在二层协议头和三层协议头之间。但在BGP/MPLS IP VPN中,PE对用户报文所封装的不是仅一层公网隧道MPLS标签,还要封装用来代表用户网络路由的一层私网MPLS标签,即要封装两层MPLS标签,私网MPLS标签在里层,公网MPLS标签在外层。

PE在利用MP-BGP向对端PE发布私网路由时,会通过MP-BGP的Update报文携带该私网标签(还携带对应VPN实例配置的RD、VPN-Target属性),其目的是使对端PE连接的Site中的用户通过该VPN-IPv4路由访问本端所连接的对应Site中的目的用户时,VPN报文中会带上这层MPLS标签(作为内层标签),到达本端PE时,就可以直接根据报文中所携带的私网标签找到对应的路由表项,然后转发给对应的Site中的目的用户。

说明

BGP的Update消息在发布时仍然会在外面加上一层MPLS骨干网各设备间建立

的本地LDP LSP标签,报文中的源IP地址是本端PE上代表MPLS LSR-ID的Loopback接口IP地址,目的地址就是与本端PE建立了MP-IBGP对等体关系的其他PE上代表MPLS MSR-ID的Loopback接口IP地址。

私网路由标签、RD和VPN-IPv4路由信息都在MP-BGP Update消息中的NLRI (Network Layer Reachability Information,网络层可通达性信息)字段中,而VPN-Target属性是在Update消息Extended_Communities(扩展团体)属性字段中。设备是否接收所收到的路由更新的唯一依据是Update消息中所携带的VPN-Target属性是否与本所配置的VPN实例的VPN-Target属性匹配,匹配到哪个VPN实例,该路由就会加入到哪个VPN实例的VRF中。

另外,RD、VPN-Target属性仅在MP-BGP Update消息中,用于路由更新,在VPN报文中是不携带的,但私网路由标签会在VPN报文的帧头后添加,用于MP-BGP对等体区分VPN报文所属的VPN实例。

PE上为私网路由分配私网标签的方法有如下两种。

■ 基于路由的MPLS标签分配:为VPN路由表的每一条路由分配一个标签(one label per route)。这种方式的缺点是:当路由数量比较多时,设备入标签映射表ILM(Incoming Label Map)需要维护的表项也会增多,从而提高了对设备容量的要求,因为每个LSP都会对应一条ILM表项。

■ 基于VPN实例的MPLS标签分配:为整个VPN实例分配一个标签,该VPN实例里的所有路由都共享一个标签。使用这种分配方法的好处是节约了标签。

经验提示】私网路由标签是由MP-BGP分配的,用于在MP-BGP对等体间唯一标识一条路由或一个VPN实例。该私网路由标签是在本端PE设备接收到私网路由更新、加入到对应的VPN实例VRF,并引入到本地BGP路由表中后由BGP分配的,仅在本地MP-BGP对等体间有意义,即不同MP-BGP对等体对于同一私网VPN-IPv4路由的私网标签分配是独立的,即所分配的私网标签可以一样,也可以不一样。MP-BGP对等体学习到该私网路由后,也会在VPN路由表中的对应路由表项中映射相同的私网路由标签,使得通过该VPN-IPv4路由访问的VPN报文能带上对应的私网标签。

为每个VPN实例中每个路由所分配的MP-BGP LSP可以通过执行display mpls lsp命令查看到。如下所示上面显示的“LSP Information: BGP LSP”部分所列出的就是PE为所学习的各用户私网路由分配的LSP标签(参见输出信息中的粗体字部分)。

  <PE1>display mpls lsp 
  -----------------------------------------------------------------------
                   LSP Information: BGP  LSP 
  -----------------------------------------------------------------------
  FEC                In/Out Label  In/Out IF                      Vrf Name        
  14.1.1.0/24        1026/NULL     -/-                            vpna            
  14.1.1.0/24        1027/NULL     -/-                            vpnb            
  10.137.1.0/24      1028/NULL     -/-                            vpna            
  10.137.3.0/24      1029/NULL     -/-                            vpnb            
  -----------------------------------------------------------------------
                   LSP Information: LDP LSP 
  -----------------------------------------------------------------------
  FEC                In/Out Label  In/Out IF                      Vrf Name        
  2.2.2.9/32         NULL/3        -/GE0/0/0                                      
  2.2.2.9/32         1024/3        -/GE0/0/0                                      
  3.3.3.9/32         NULL/1024     -/GE0/0/0                                      
  3.3.3.9/32         1025/1024     -/GE0/0/0                                      
  1.1.1.9/32         3/NULL        -/-

2. 私网路由交叉

当PE通过MP-BGP的Update消息接收到其他PE发来的VPN-IPv4路由时,并不一定会把这些所有学习到的路由都加入自己的对应VPN实例中,而是要先经过一定规则检查,只有通过检查的VPN-IPv4路由才可进行下一步的VPN-Target属性匹配。

两台PE之间通过MP-BGP传播的路由是VPNv4路由。当接收到来自对端PE或RR(路由反射器)发来的VPNv4路由后,本端PE先进行如下处理。

■ 检查其下一跳(是与本端PE建立了iBGP对等体关系的对端PE,或RR)是否可达。如果下一跳不可达,该路由被丢弃。

■ 对于RR发送过来的VPNv4路由,如果收到的路由中Cluster_List包含自己的Cluster ID,则丢弃这条路由,因为这是一条环回路由。

说明

在路由反射器(Route Reflector,RR)技术中规定,同一集群内的客户机只需要与该集群的RR直接交换路由信息,因此客户机只需要与RR之间建立IBGP连接,不需要与其他客户机建立IBGP连接,从而减少了IBGP连接数量。在BGP/MPLS IP VPN方案中,通常MPLS骨干网中各节点都在同一个AS中(也有经过多个AS的),一个VPN中的各PE之间是iBGP对等体关系。

有关RR原理请参见《华为路由器学习指南》。

■ 进行BGP的路由策略过滤,如果不通过,则丢弃该路由。

经过上述处理之后,PE把没有丢弃的路由与本地的各个VPN实例所配置的Import Target属性进行匹配,这个匹配的过程就称为“私网路由交叉”。也就是“私网路由交叉”就是把所接收到的私网VPN路由所携带的Export Target属性与本地PE上VPN实例的Import Target属性进行匹配,一致的话就认为交叉成功,可以作为候选(还不能最后决定)加入到该VPN实例的VPN路由。最终可执行display ip routing-table vpn-instance命令要查看某VPN实例中已学习的VPN-IPv4路由,如下是在一个BGP/MPLS IP VPN实际应用中查看名为vpna中的VPN-IPv4路由,都是用户私网路由。

  <PE1>display ip routing-table vpn-instance vpna 
  Route Flags: R - relay, D - download to fib 
  -----------------------------------------------------------------------
  Routing Tables: vpna 
           Destinations : 7        Routes : 7         
   
  Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface 
   
       10.137.1.0/24  Static  60   0          RD   14.1.1.2        GigabitEthernet0/0/1 
       10.137.2.0/24  IBGP    255  0          RD   3.3.3.9         GigabitEthernet0/0/0 
         14.1.1.0/24  Direct  0    0           D   14.1.1.1        GigabitEthernet0/0/1 
         14.1.1.1/32  Direct  0    0           D   127.0.0.1       GigabitEthernet0/0/1 
       14.1.1.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet0/0/1 
         34.1.1.0/24  IBGP    255  0          RD   3.3.3.9         GigabitEthernet0/0/0 
  255.255.255.255/32  Direct  0    0           D   127.0.0.1       InLoopBack0

PE上有种特殊的路由,即来自本地CE、属于不同VPN的路由。对于这种路由,如果其下一跳直接可达或可迭代成功,PE也将其与本地的其他VPN实例的Import Target属性匹配,该过程称之为“本地交叉”(对来自其他PE的VPN路由进行的路由交叉可称之为“远端交叉”)。例如:CE1所在的Site属于VPN1,CE2所在的Site属于VPN2,且CE1和CE2同时接入PE1。当PE1收到来自CE1的VPN1的路由时,也会与VPN2对应的VPN实例的Import Target属性匹配,因为在BGP/MPLS IP VPN方案中,一个Site可以加入多个VPN,并连接多个远程站点。

3. 公网隧道迭代

经过前面的私网路由交叉完成后,需要根据VPN-IPv4路由的目的IPv4前缀进行路由迭代,查找合适的隧道,以便确定到达该目的网络的报文所用的VPN隧道。在一个PE上每个隧道都有一个唯一的Tunnel ID。只有隧道迭代成功,该路由才可能(也不是最后的决定)被放入对应的VPN实例路由表。将路由迭代到相应的隧道的过程叫做“隧道迭代”。

私网VPN路由隧道迭代成功(即找到对应的隧道)后,保留该隧道的标识符Tunnel ID,供后续转发报文时使用。VPN报文转发时会VPN实例中对应的路由表项的Tunnel ID查找对应的隧道,然后从隧道上发送出去。

4. 私网路由的选择规则

经过路由交叉和隧道迭代成功,来自其他PE的私网VPN路由仍有可能不能被放入VPN实例路由表中,从本地CE收到的普通IPv4路由和本地交叉成功的路由也不是全部被放入VPN实例路由表,还要进行私网路由的选择。

对于到同一目的地址的多条路由,如果不进行路由的负载分担,按如下规则选择其中的一条。

■ 同时存在直接从CE收到的路由和交叉(包括本地交叉和远端交叉)成功后的同一目的地址路由,则优选从CE收到的路由。

■ 同时存在本地交叉路由和从其他PE接收并远端交叉成功后的同一目的地址路由,则优选本地交叉路由。

对于到同一目的地址的多条路由,如果进行路由的负载分担,则:

■ 优先选择从本地CE收到的路由。只有一条从本地CE收到的路由而有多条交叉路由的情况下,也只选择从本地CE收到的路由。

■ 只在从本地CE收到的路由之间分担或只在交叉路由之间分担,不会在本地CE收到的路由和交叉路由之间分担。

■ 负载分担的AS_PATH属性必须完全相同。

以上从入口PE到出口PE之间的私网VPN路由发布的四大流程,可用图1-20简单描述。

1.2.2 VPN-IPv4路由发布示例

下面以图1-21为例(PE-CE之间使用BGP,公网隧道为LSP),说明将CE2的一条路由发布到CE1的整个过程。

(1)在CE2的BGP IPv4单播地址族下引入CE2下面所连接网段的IGP路由。

(2)CE2将该路由随EBGP的Update消息一起发布给Egress PE。Egress PE从连接CE2的接口收到Update消息,根据入接口所绑定的VPN实例,把该路由转化为VPN-IPv4路由,加入对应的VPN实例对应的VRF中。

图1-20 从入口PE到出口PE之间的私网VPN路由发布的流程

图1-21 VPN-IPv4路由发布示例

(3)Egress PE为该路由分配MPLS标签(是内层标签),并将标签和VPN-IPv4路由信息加入MP-IBGP的Update消息中的NLRI字段中,Export Target属性加入MP-BGP Update消息的扩展团体属性字段中,将Update消息发送给其MP-IBGP对等体的Ingress PE。

(4)Ingress PE对收到来自Egress PE的路由进行路由交叉。交叉成功则根据路由目的的IPv4地址进行隧道迭代,查找合适的隧道。如果迭代成功,则保留该隧道的Tunnel ID和MPLS标签(内层标签),然后再进行VPN-Target属性匹配,匹配成功后将该VPN路由加入到对应VPN实例VRF中。

(5)Ingress PE根据对应VPN实例所绑定的接口,把该路由通过BGP Update消息(本示例中PE与CE之间也采用BGP路由)发布给CE1。此时发布的路由是普通IPv4路由。

(6)CE1收到该路由后,把该路由加入BGP路由表。通过在IGP中引入BGP路由的方法可使CE1把该路由加入IGP路由表。

通过以上步骤就把CE2端的私网路由依次成功发布到了直连的PE2、远端的PE1,以及远端Site CE2上,完成整个VPN路由的发布过程。当然,以上过程只是将CE2的路由发布给CE1。要实现CE1与CE2的互通,还需要将CE1的路由发布给CE2,其过程与上面的步骤类似,在此不再赘述。

1.2.3 BGP/MPLS IP VPN的报文转发

在基本BGP/MPLS IP VPN应用中(不包括跨域的情况),VPN报文转发采用两层标签方式。

■ 外层(公网)标签在骨干网内部进行交换,指示从本端PE到对端PE的一条LSP。VPN报文利用这层LSP标签可以沿LSP到达对端PE。

公网隧道可以是LSP隧道、MPLS TE隧道和GRE隧道。当公网隧道为LSP隧道或MPLS TE隧道时,公网标签为MPLS LSP标签(MPLS TE隧道的CR-LSP也是采用LSP标签);当公网隧道为GRE隧道时,公网标签为GRE封装。

■ 内层(私网)标签在从对端PE到达对端CE时使用,指示报文应被送到哪个Site,

这就是为不同路由或不同VPN实例所分配的私网路由标签。

当PE之间已在通过MP-BGP相互发布VPN-IPv4路由时,会将本端所学习的每个私网VPN-IPv4路由所分配的私网标签通告给了对端PE,这样对端PE根据报文中所携带的私网标签可以找确定报文所属的VPN实例,通过查找该VPN实例的路由表,将报文正确地转发到相应的Site。

说明

特殊情况下,属于同一个VPN的两个Site连接到同一个PE时,PE不需要为VPN报文封装内、外层标签,只需查找对应VPN实例的路由表,然后再找到报文的出接口即可将报文转发至相应的Site。

下面以图1-22为例说明BGP/MPLS IP VPN报文的转发过程。图中是CE1发送报文给CE2的过程,其中,I-L表示内层标签,O-L表示外层标签。本示例中内、外层标签均为MPLS LSP标签。

图1-22 BGP/MPLS IP VPN报文转发示例

(1)CE1向Ingress PE发送一个要访问远端CE2所连接Site中目标主机的VPN 报文。

(2)Ingress PE从绑定了VPN实例的接口上接收VPN数据包后进行如下操作。

■ 先根据绑定的VPN实例的RD查找对应VPN的转发表(VRF)。

■ 匹配VPN报文中的目的IPv4前缀,查找对应的Tunnel ID,然后将报文打上对应的私网(内层)标签(I-L),根据Tunnel ID找到隧道。

■ 将VPN报文从找到的隧道发送出去,发出之前VPN报文要加装一层公网(外层)MPLS标签(O-L1)。此时VPN报文中携带有两层MPLS标签。

接着,该报文携带两层MPLS标签穿越骨干网。骨干网的每台P设备都仅对该VPN报文的外层标签进行交换,内层私网路由标签保持不变。

如图1-23是Ingress PE向Egress PE发送的一个ICMP请求报文的报文结构示例,它包括了两层MPLS标签,其中外层标签为1025(MPLS Bottom os label stack:0,表示后面还有MPLS标签,非栈底标签),内层标签为1026(MPLS Bottom os label stack:1,表示此为MPLS栈底标签)。

图1-23 PE接口发送的报文的二层MPLS标签结构

经验提示】因为Egress节点为倒数第二跳分配的标签,通常是支持PHP特性的,所以在倒数第二跳把报文传输Egress节点时会先弹出外层标签。这样一来,Egress接收到的报文往往只带有一层标签。如图1-24是Ingress PE连接P的接口上接收到来自对端的响应ICMP报文的报文结构示例,其中显示只有一层MPSL标签(MPLS Bottom os label stack:1,表示此为MPLS栈底标签)。在Egress PE连接P的接口接收ICMP请求报文的报文结构一样,也只有一层MPLS标签,也是因为外层标签在倒数第二跳(P)弹出了。

这样一来,可以想象,如果是两PE相连,则报文在PE间直连链路上传输时均只带一层MPLS标签,这层标签就是内层私网标签,因为此时两PE互相为对方的倒数第二跳,在发送报文时会弹出外层的MPLS标签。但在这种PE直连情况下,我们一般配置不支持PHP,这样两个直连的PE在发送报文时就不会弹出外层标签了。

(3)Egress PE收到该携带两层标签的报文后,交给MPLS协议模块处理。MPLS协议将去掉外层标签(本示例最后的外层标签是O-L2,但如果应用了PHP特性,则此标签会在到达Egress PE之前的一跳P弹出,Egress PE只能收到带有内层标签的报文,参见图1-24)。

图1-24 PE接口接收的报文的一层MPLS标签结构

(4)剥离了外层LSP标签后,Egress PE就可以看见内层标签I-L,先根据内层私网路由标签查找到VPN实例,然后通过查找该VPN实例的路由表,可确定报文要转发的目的Site和出接口。

同时,Egress PE发现报文中的内层标签处于栈底,于是将内层标签剥离,根据对应的VPN实例路由表项将报文发送给CE2。此时报文是个纯IP报文。

这样,报文就成功地从CE1传到CE2了,CE2再按照普通的IPv4报文转发过程将报文传送到目的主机。以上报文转发的流程可用图1-25进行描述。

图1-25 报文转发的基本流程