使用技术:mpls,bgp(MP-BGP),vpn-instance,IGP

在华为的网络架构中,CE路由器(Customer Edge Router)和PE路由器(Provider Edge Router)是两种不同类型的路由器,它们在网络中扮演着各自的角色。

CE路由器(Customer Edge Router)

  • CE路由器是用户边缘设备,通常位于用户的网络边界。
  • 它是用户网络与服务提供商网络之间的接口。
  • CE路由器通过连接一个或多个PE路由器,为用户提供服务接入。
  • 它通常是一台IP路由器,与连接的PE路由器建立邻接关系,可以是EBGP或OSPF等协议的邻居。

PE路由器(Provider Edge Router)

  • PE路由器是运营商边缘路由器,位于服务提供商的网络边缘。
  • 它充当IP VPN接入路由器,相当于标签边缘路由器(LER)。
  • PE路由器连接CE路由器和P路由器(Provider Router,运营商骨干路由器),是网络中非常重要的节点。
  • 用户的流量通过PE路由器流入用户网络,或者通过PE路由器流到MPLS骨干网。
  • PE路由器负责与CE设备交换路由信息,并与其他PE路由器或P路由器交换VPN相关的路由信息。

简而言之,CE路由器是用户端的路由器,而PE路由器是服务提供商网络的一部分,它们共同协作以提供网络服务。在MPLS VPN网络中,PE路由器负责处理VPN标签,而P路由器则负责在网络核心中转发标签化的数据包。

QQ截图20240316153844.png

1. 骨干IGP配置

在R1,R2,R3,R4运行ospf协议使得R1环回口可以访问R4环回口
建议配置router id

2. CE端 路由协议配置BGP

R5:
bgp 100
  peer 15.1.1.1 as-number 400                  
  network 5.5.5.0 255.255.255.0 
  network 192.168.5.0
R9:
bgp 200
  peer 19.1.1.1 as-number 400                    
  network 9.9.9.0 255.255.255.0 
  network 192.168.9.0
R7:
bgp 300
  peer 17.1.1.1 as-number 400                  
  network 7.7.7.0 255.255.255.0 
  network 192.168.7.0 
R8:
bgp 500
  peer 48.1.1.4 as-number 400                     
  network 8.8.8.0 255.255.255.0 
  network 192.168.8.0 
R6:
bgp 600
  peer 46.1.1.4 as-number 400                    
  network 6.6.6.0 255.255.255.0 
  network 192.168.6.0 

3. VPN实例配置

注意:

  • 一个vpn实例vpn-instance只能有一个route-distinguisher(代表实例身份号,针对本台路由器的实例区分)
  • BGP路由更新会携带一个RT-export值。
  • 一条路由可以配置多个RT值(RT-import值不携带在路由更新里)
  • RT-import属性不会再路由更新里面携带,仅仅用于判断将那些路由导入CE
R1:
ip vpn-instance vpn100                            
  route-distinguisher 100:100
  vpn-target 10:10 export-extcommunity
  vpn-target 50:50 import-extcommunity
ip vpn-instance vpn200
  route-distinguisher 200:200
  vpn-target 20:20 export-extcommunity
  vpn-target 50:50 import-extcommunity
ip vpn-instance vpn300
  route-distinguisher 300:300
  vpn-target 30:30 export-extcommunity
  vpn-target 60:60 import-extcommunity
interface GigabitEthernet0/0/1
 ip binding vpn-instance vpn100
 ip address 15.1.1.1 255.255.255.0 
interface GigabitEthernet0/0/2
 ip binding vpn-instance vpn200
 ip address 19.1.1.1 255.255.255.0 
interface GigabitEthernet4/0/0
 ip binding vpn-instance vpn300
 ip address 17.1.1.1 255.255.255.0
R4:
ip vpn-instance vpn500
  route-distinguisher 500:500
  vpn-target 50:50 export-extcommunity
  vpn-target 10:10 20:20 import-extcommunity                                      
ip vpn-instance vpn600
  route-distinguisher 600:600
  vpn-target 60:60 export-extcommunity
  vpn-target 30:30 import-extcommunity
interface GigabitEthernet0/0/1
 ip binding vpn-instance vpn600
 ip address 46.1.1.4 255.255.255.0
interface GigabitEthernet0/0/2
 ip binding vpn-instance vpn500
 ip address 48.1.1.4 255.255.255.0

测试:

R1:
ping -vpn-instance 17.1.1.7
dis ip routing-table vpn-instance vpn100

4. PE端 MP-BGP配置

R4:
bgp 400
 peer 1.1.1.1 as-number 400 
 peer 1.1.1.1 connect-interface LoopBack0
#
 ipv4-family unicast
  undo synchronization
  peer 1.1.1.1 enable
 # 
 ipv4-family vpnv4
  policy vpn-target
  peer 1.1.1.1 enable
 #
 ipv4-family vpn-instance vpn500 
  peer 48.1.1.8 as-number 500 
 #
 ipv4-family vpn-instance vpn600 
  peer 46.1.1.6 as-number 600
---------------------------------
R1:
bgp 400
 peer 4.4.4.4 as-number 400 
 peer 4.4.4.4 connect-interface LoopBack0
 #
 ipv4-family unicast
  undo synchronization
  peer 4.4.4.4 enable
 # 
 ipv4-family vpnv4
  policy vpn-target
  peer 4.4.4.4 enable
 #
 ipv4-family vpn-instance vpn100 
  peer 15.1.1.5 as-number 100 
 #
 ipv4-family vpn-instance vpn200 
  peer 19.1.1.9 as-number 200 
 #
 ipv4-family vpn-instance vpn300 
  peer 17.1.1.7 as-number 300

测试:

[R1_PE1]dis bgp peer
[R1_PE1]dis bgp routing-table
[R1_PE1]dis bgp vpnv4 vpn-instance vpn100 routing-table

5. MPLS(MP-BGP)配置

注意:

  • 针对某路由前缀,PE之间传递MP-BGP的update路由更新包含三个参数:RD,RT-e,内层标签
  • 内层标签的作用:区分业务报文(非路由更新)属于哪个vpn实例
  • 在运行MPLS之前PE之间的BGP不传递路由更新,因为BGP需要为路由更新分配相应的内层标签
  • 数据在传输时,由两层标签,内层标签是由MP-BGP分配。外层标签是由LDR分配。外层标签为了穿越公网。
  • 在没有运行MPLS之前,PE和CE之间是可以传递bgp路由更新。
[R1_PE1]mpls lsr-id 1.1.1.1
[R1_PE1]mpls
Info: Mpls starting, please wait... OK!
[R1_PE1-mpls]mpls ldp
[R1_PE1-mpls-ldp]quit
[R1_PE1]int g0/0/0
[R1_PE1-GigabitEthernet0/0/0]mpls
[R1_PE1-GigabitEthernet0/0/0]mpls ldp
R2:
  mpls lsr-id 2.2.2.2
  mpls
    mpls ldp
  int g0/0/0
    mpls
    mpls ldp
  int g0/0/1
    mpls
    mpls ldp
R3:
  mpls lsr-id 3.3.3.3
  mpls
    mpls ldp
  int g0/0/0
    mpls
    mpls ldp
  int g0/0/1
    mpls
    mpls ldp
R4:
  mpls lsr-id 4.4.4.4
  mpls
    mpls ldp
  int g0/0/0
    mpls
    mpls ldp

测试

[R2]dis mpls ldp peer
[R3]dis mpls ldp peer 
[R1_PE1]dis bgp vpnv4 all routing-table
[R1_PE1]dis bgp vpnv4 vpn-instance vpn100 routing-table
<R5>ping -a 192.168.5.1 8.8.8.8
<R4_PE4>dis bgp vpnv4 all routing-table label 
[R4_PE4]dis bgp vpnv4 vpn-instance vpn500 routing-table label
<R1_PE1>dis mpls lsp
<R1_PE1>dis fib vpn-instance vpn100
<R1_PE1>dis mpls lsp verbose
<R1_PE1>dis bgp vpnv4 all routing-table 192.168.5.0

注意:

  • 入标签in 是本台路由器为其分配,出标签out是从对端通过bgp update报文学来的。
  • 内层标签通过查找dis bgp vpnv4 vpn-instance vpn100 routing-table label out标签。
  • 外层标签通过dis fib vpn-instance vpn100 查找Tunnel-ID,进而到dis mpls lsp verbose 查找对于Tunnel ID(Token)来封装外层标签
  • 在次末跳会弹出外层标签到达末端PE时报文只会含有内层标签,PE设备根据内层标签来识别该数据属于哪个vpn实例
  • 数据报文(业务)到达末端PE时,PE根据标签(内层)结合dis bgp vpnv4 all routing-table label 表来决定应该将报文送给相应的vpn实例转发。最终通过vpn实例的路由表转发给CE。例如:vpn实例路由表dis ip routing-table vpn-instance vpn500
  • RD:route distinguisher值---对应一个vpn实例---公司站点。RD值作用:在一台路由器上创建多个路由表(小路由表)来隔离路由。每个小路由表就是对于一个vpn实例,对应一个站点。同一PE设备上分配给每个VPN实例的RD值必须唯一。一个vpn实例只能分配一个RD值。
  • VRF:vpn routing and forwarding table vpn路由转发表既“小路由器”的路由表。
  • RT:route target 封装在bgp的扩展community属性中,在路由传递过程中作为可选可传递属性进行传递,作用:路由取舍,路由喜好,路由导入。为了灵活的导入导出路由,同一个vpn实例RT值(export,import)可以配置多个。
  • VPNv4路由:传统ip前缀+RD+RT+label
  • 为什么业务数据传输时不采用RD值进行标识而采用内层标签?①RD值8字节太大(mpls只有4字节);②骨干网早期已经部署了mpls;③靠mpls多层标签可以对流量进行区分,方便QoS。
  • 内外层标签的区别:外层标签( outer mpls label )在mpls vpn中被称为公网标签,用于mpls 网络中转发数据(业务数据)。一般公网标签会在到达PE设备时已被倒数第二跳剥掉,露出内层标签( inner label )内层标签在mpls vpn中被称为私网标签,用于将数据正确发送到相应的vpn中,PE依靠内存标签区分数据包属于哪个vpn。
  • 查看mp-bgp给路由增加RD、RT、 Label不要用命令dis bgp vpnv4 vpn-instance vpn100 routing-table 192.168.5.0 ,不能接具体vpn实例;而是用命令dis bgp vpnv4 all routing-table 192.168.5.0

解决VPN客户地址空间重叠问题需要解决下述三个问题。

  1. PE设备怎么区分不同VPN客户的相同路由?
  2. 冲突路由在公网传播时,接收端PE如何正确导入VPN客户路由?
  3. PE设备收到IP数据包后,如何正确的发送给目的VPN客户?

从上面的技术难点分析,主要问题都是与路由相关的特性,所以解决这些问题必须从路由协议考虑,但现在的路由协议都不具备解决这些问题的条件,因此考虑对路由协议进行改造。

由于BGP的诸多优点对技术难点的解决提供了思路:

  • 公共网络上的VPN路由数量庞大,BGP是唯一支持大量路由的协议;
  • BGP的报文基于TLV的结构,便于扩展;
  • BGP可以承载附加在路由后面的任何信息,并作为可选属性传递给其他邻居。

上面提到的3个技术难点迎刃而解︰

  • 本地路由冲突的问题:可以通过在同一台PE设备上为不同的VPN建立单独的路由,这样冲突的的路由就被隔离开来;
  • 在路由传递过程中,为不同的VPN路由添加不同的标识,以示区别。这些标识可以作为BGP属性进行传递;
  • 由于IP报文不可更改,可以在IP报文头前加一些信息。由始发路由器打上标记,接收路由器在收到带标记的的数据包时,根据标记转发给正确的VPN。

下面将针对上面的三个技术难点逐一进行解决方案的介绍。

如何在网络传递过程中区分冲突路由

  • 将VPN路由发布到全局路由表之前,使用一个全局唯一的标识和路由绑定,以区分冲突的私网路由。这个标识被称为RD ( Route Distinguisher )。
  • 共享PE设备上实现重叠路由的隔离就是在PE设备上将来自每个VPN的路由放入自己对应的VPN Routing Table中,每个VPN Routing Table只记录对应VPN中学来的路由,就像是专用PE一样。这个VPN Routing Table称谓VRF(( VPN Routing and Forwarding table ) ,即VPN路由转发表。
  • 每一个VRF都需要对应一个VPN instance,VPN用户对应的接口绑定到VPN instance中。
  • RD即VPN路由标识符,由8字节组成,配置时同一PE设备上分配给每个VPN的RD必须唯一。
  • RD用于区分使用相同地址空间的IPv4前缀,增加了RD的IPv4地址称为VPN-IPv4地址(即VPNv4地址)。
  • 运营商设备采用BGP协议作为承载VPN路由的协议,并将BGP协议进行了扩展,称为MP-BGP ( Multiprotocol Extensions for BGP-4)。PE从CE接收到客户的IPv4私网路由后,将客户的私网路由添加各种标识信息后变为VPNv4路由放入MP-BGP的VPNv4路由表中,并通过MP-BGP协议在公网上传递。

Hub-Spoke场景中VPN路由的引入问题的解决

  • RD不能解决VPN路由正确引入VPN的问题。
  • 我们需要一种类似于Tag的标识。这个标识由人工分配,发送端PE发送时打上标识,接收端PE收到后根据需要将带有相应标识的路由引入VPN。
  • RT属性用于将路由正确引入VPN,有两类VPN Target属性,Import Target和Export Target,分别用于VPN路由的导出与导入。
  • RT ( Route Target)封装在BGP的扩展Community属性中,在路由传递过程中作为可选可传递属性进行传递。

RT的本质是每个VRF表达自己的路由取舍及喜好的属性,有两类VPN Target属性∶

  • Export Target:本端的路由在导出VRF,转变为VPNv4的路由时,标记该属性;
  • Import Target:对端收到路由时,检查其Export Target属性。当此属性与PE上某个VPN实例的Import Target匹配时,PE就把路由加入到该VPN实例中。

解决数据转发过程中冲突路由的查找

因为数据包没有携带任何标识,所以在ICMP的数据包到达PE1时,PE1并不知道该查找哪个VPN的路由表找到正确的目标地址。

解决该问题的方案有两种:

  • 在数据包中增加标识信息,并且使用RD作为区分数据包所属VPN的标识符,数据转发时也携带RD信息。缺点是由于RD由8字节组成,额外增大数据包,会导致转发效率降低。
  • 借助公网中已经实施的MPLS协议建立的标签隧道,采用标签作为数据包正确转发的标识,MPLS标签支持嵌套,可以将区分数据包所属VPN的标签封装在公网标签内。

MPLS标签嵌套的应用

使用标签嵌套解决数据转发过程中冲突路由的查找问题。

Outer MPLS Label在MPLS VPN中被称为公网标签,用于MPLS网络中转发数据。一般公网标签会在到达PE设备时已被倒数第二跳剥掉,漏出Inner Label。Inner MPLS Label在MPLS VPN中被称为私网标签,用于将数据正确发送到相应的VPN中,PE依靠Inner Label区分数据包属于哪个VPN。

MPLS VPN的工作过程

分为两部分:

  • MPLS VPN路由的传递过程;
  • MPLS VPN数据的转发过程。

MPLS VPN路由传递过程分哪几个阶段

1.PE与CE之间的路由交换

PE与CE之间可以通过静态路由协议交换路由信息,也可以通过动态路由协议(如︰RIP,OSPF ,ISIS,BGP等)交换路由信息。

2.VPN路由注入MP-BGP的过程

VRF中的IPv4路由被添加上RD,RT与标签等信息成为VPN-IPv4的路由放入到MP-BGP的路由表中,并通过MP-BGP协议在PE设备之间交换路由信息。

3.MP-BGP路由注入VPN的过程

PE2在接收到PE1发送的VPNv4路由后将检查路由的扩展团体属性,将携带的Export Target值与本端VPN的Import Target值比较,数值相同则将路由引入VPN的路由表,实现路由的正确导入。

MPLS VPN数据转发过程

三个阶段:

  • CE设备到PE设备的数据转发
  • 公网设备上的数据转发
  • PE设备到CE设备的数据转发

CE设备到PE设备的数据转发

两张表:

FIB表

[R4_PE4]dis ip routing-table vpn-instance vpn500
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: vpn500
         Destinations : 10       Routes : 10       
Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface
        5.5.5.0/24  IBGP    255  0          RD   1.1.1.1         GigabitEthernet0/0/0
        8.8.8.0/24  EBGP    255  0           D   48.1.1.8        GigabitEthernet0/0/2
        9.9.9.0/24  IBGP    255  0          RD   1.1.1.1         GigabitEthernet0/0/0
       48.1.1.0/24  Direct  0    0           D   48.1.1.4        GigabitEthernet0/0/2
       48.1.1.4/32  Direct  0    0           D   127.0.0.1       GigabitEthernet0/0/2
     48.1.1.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet0/0/2
    192.168.5.0/24  IBGP    255  0          RD   1.1.1.1         GigabitEthernet0/0/0
    192.168.8.0/24  EBGP    255  0           D   48.1.1.8        GigabitEthernet0/0/2
    192.168.9.0/24  IBGP    255  0          RD   1.1.1.1         GigabitEthernet0/0/0
255.255.255.255/32  Direct  0    0           D   127.0.0.1       InLoopBack0

[R4_PE4]dis ip routing-table vpn-instance vpn500 verbose 
Route Flags: R - relay, D - download to fib
---------------------------------------
Routing Tables: vpn500
         Destinations : 10       Routes : 10       
Destination: 5.5.5.0/24
     Protocol: IBGP             Process ID: 0
   Preference: 255                    Cost: 0
      NextHop: 1.1.1.1           Neighbour: 1.1.1.1
        State: Active Adv Relied       Age: 07h34m13s
          Tag: 0                  Priority: low
        Label: 1028                QoSInfo: 0x0
   IndirectID: 0x4              
 RelayNextHop: 34.1.1.3          Interface: GigabitEthernet0/0/0
     TunnelID: 0x5                   Flags: RD
Destination: 8.8.8.0/24
     Protocol: EBGP             Process ID: 0
   Preference: 255                    Cost: 0
      NextHop: 48.1.1.8          Neighbour: 48.1.1.8
        State: Active Adv              Age: 07h00m57s
          Tag: 0                  Priority: low
        Label: NULL                QoSInfo: 0x0
   IndirectID: 0x6              
 RelayNextHop: 0.0.0.0           Interface: GigabitEthernet0/0/2
     TunnelID: 0x0                   Flags:  D
[R4_PE4]dis fib vpn-instance vpn500 verbose 
Route Flags: G - Gateway Route, H - Host Route,    U - Up Route
             S - Static Route,  D - Dynamic Route, B - Black Hole Route
             L - Vlink Route
------------------------------------------------------------------------------
 FIB Table:
 Total number of Routes : 10 
 Destination: 48.1.1.255          Mask     : 255.255.255.255     
 Nexthop    : 127.0.0.1           OutIf    : InLoopBack0         
 LocalAddr  : 127.0.0.1           LocalMask: 0.0.0.0             
 Flags      : HU                  Age      : 27422sec            
 ATIndex    : 0                   Slot     : 0                   
 LspFwdFlag : 0                   LspToken : 0x0                 
 InLabel    : NULL                OriginAs : 0                   
 BGPNextHop : 0.0.0.0             PeerAs   : 0                   
 QosInfo    : 0x0                 OriginQos: 0x0                 
 NexthopBak : 0.0.0.0             OutIfBak : [No Intf]           
 LspTokenBak: 0x0                 InLabelBak : NULL                
 LspToken_ForInLabelBak : 0x0                 
 EntryRefCount : 0                   
 VlanId : 0x0                 
 BgpKey : 0                   
 BgpKeyBak : 0                   
 LspType         : 0              Label_ForLspTokenBak   : 0
 MplsMtu         : 0              Gateway_ForLspTokenBak : 0.0.0.0             
 NextToken       : 0x0            IfIndex_ForLspTokenBak : 0
 Label_NextToken : 0              Label : 0
 LspBfdState     : 0  

LFIB表

[R4_PE4]dis mpls lsp
-------------------------------------------------------------------------------
                 LSP Information: BGP  LSP
-------------------------------------------------------------------------------
FEC                In/Out Label  In/Out IF                      Vrf Name       
192.168.6.0/24     1027/NULL     -/-                            vpn600         
6.6.6.0/24         1028/NULL     -/-                            vpn600         
8.8.8.0/24         1029/NULL     -/-                            vpn500         
192.168.8.0/24     1030/NULL     -/-                            vpn500         
-------------------------------------------------------------------------------
                 LSP Information: LDP LSP
-------------------------------------------------------------------------------
FEC                In/Out Label  In/Out IF                      Vrf Name       
2.2.2.2/32         NULL/1024     -/GE0/0/0                                     
2.2.2.2/32         1024/1024     -/GE0/0/0                                     
3.3.3.3/32         NULL/3        -/GE0/0/0                                     
3.3.3.3/32         1025/3        -/GE0/0/0                                     
4.4.4.4/32         3/NULL        -/-                                           
1.1.1.1/32         NULL/1026     -/GE0/0/0                                     
1.1.1.1/32         1026/1026     -/GE0/0/0  

QQ截图20240316214558.png

数据从CE4转发给PE2,在PE2设备上需要查找VPN2的路由表,确定数据进行标签转发后,再查找下—跳与出接口,根据分配的标签进行MPLS的封装。

数据从CE设备到PE设备的转发:

  • 如图所示,CE4所连接的VPN2的用户要与对端VPN2中的172.16.1.1/32用户通信,PE2收到数据包后,查找本地VPN2的路由表,发现数据包需要进行标签转发,分配的私网标签为1027,到达目标地址的下一跳为PE1。
  • PE2通过查找LFIB表,发现到达PE1被分配的公网标签为1030,出接口为G0/0/0 ,PE2将数据包进行MPLS封装,内层为1027,外层为1030,从接口G0/0/0转发出去。

公网设备上的数据转发

数据包在公网上转发时,通过MPLS协议已建立好的标签隧道将数据报文转发到PE1。转发过程中,只改变公网标签。

数据包在公网上的传递过程∶

  • 如图所示,PE2收到VPN用户的数据包后,封装上MPLS的标签,将私网数据通过MPLS建立的标签隧道进行转发,PE2上数据包封装的公网标签为1030,转发给P设备后,查找LFIB表,进标签为1030的数据包,对应的出标签为3,即将公网标签标签剥离后,将数据包发送给PE1,PE1收到的是只有内层私网标签的数据包。

PE设备到CE设备的数据转发

PE1收到剥离公网标签的数据包后,根据私网标签查找转发数据包的下一跳,将数据包正确发送给相应VPN客户。

数据包转发给相应VPN的过程:

  • 如图所示,PE1收到只有一层标签的数据包,查找标签表,发现标签为1027的数据包对应的下一跳为CE2,于是PE2将数据包剥离私网标签,进行IP封装,查找出接口,将数据包发送给CE2处理。
  • 至此,数据包到达正确的目标用户,我们是以单向的数据转发过程为例进行的介绍,其实数据转发的过程是双向的,但过程都是类似的。