前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全网内容最全,质量最高的MPLS及MPLS VPN技术详解,瑞哥力荐!

全网内容最全,质量最高的MPLS及MPLS VPN技术详解,瑞哥力荐!

原创
作者头像
网络技术联盟站
修改2020-10-09 10:56:45
6.7K0
修改2020-10-09 10:56:45
举报
文章被收录于专栏:网络技术联盟站

MPLS 与 MPLS VPN

一、MPLS 基础

1.1 MPLS 概述

IP路由其实已经有不短的历史了,在IP发展的过程中,曾经出现过许多的争论,例如路由和交换速度之争,路由和标签交换的地位之争等等。早先的通过软件实现的路由是“很慢的”,是“耗时、耗设备资源的”,加之查表的机制、相关数据字段的重写使得其速度更加缓慢,而对于交换技术,由于对数据帧的读取“较浅”,加上本身的机制、通过专用的硬件实现使得其速度有很大程度的提升。

为了加快网络的对数据的转发速度,以及提高网络的可服务性和对多样化业务的支持,行业中一度涌现了许多新的技术,例如ATM、帧中继等等。其中有一个技术不得不提,那就是MPLS。虽然随着数据通信技术的飞速发展,IP路由的速度已经得到巨大的提升,控制和数据层面的机制都有了革命性的突破,使得速度上的劣势几乎消除,但是MPLS带来的革命性突破,和丰富的业务支持能力依然使得它在运营商网络中得到广泛的部署。

首先回顾一下IP路由的概念,什么是IP路由?可以简单的将路由理解为当三层设备(Layer3 Device)收到一个IP数据包时,它拿着数据包的目的IP地址在自己的路由表中进行查找,如果找到相匹配的表项,则将数据包依照表项所指示的出接口和下一跳IP地址转发出去。

简单的一句话,包含的东西却是非常多的,实际上路由的动作从微观层面来探讨,可以拆解成复杂的过程,例如当目的地址在路由表中查询时,默认采用“最长匹配原则”,逐位(Bit by Bit)地将目的IP地址与路由表中的各个路由前缀进行匹配,这显然是非常耗时的,再加上如果找到匹配项,而所匹配项的下一跳如果并非直连,则还要进一步递归;再如路由查找过程完成后,还需对数据包的IP头部进行修改(TTL值减一等),并重写数据帧头部,而如果数据帧头部重写过程中缺少二层信息(如MAC),那么就还需要启动相关的协议或机制去查找(如ARP)。因此在某种程度上,IP路由一度被认为是速度缓慢的。

MPLS技术的发展,给行业带来了许多革新,也带来了许多应用和商机。初期最显著的亮点自然是在速度上快于IP路由,因为转发标签数据时仅需对标签进行查询。然而MPLS的亮点远不只是速度上的优势,随着IP路由技术的发展,其速度上的短板已经得到极大的改进,但是这完全无法阻挡MPLS的广泛部署和用。

简单的说,MPLS的思想就是在IP报文的基础上,增加“标签头部”,这个标签头部可以视为是2.5层的概念,也就是说标签头部是压在IP头之前、二层帧头之后的。压了MPLS标签头的数据称为标签报文(LabeledPacket),标签报文在MPLS网络中被转发时,转发设备只需查看标签头中的标签值,即可快速的做出决策并将报文转发出去,因此速度很快。再者由于加了一层标签,这使得IP报文能够被“隐藏”在标签头后面,这就可以解决诸多问题,例如BGP路由黑洞的问题等,当然更加带来了诸多新的业务,例如VPN业务,流量工程应用等等。

1.2 MPLS 术语

1.LSR

LSR(Label Switch Router,标签交换路由器)是支持并激活MPLS的路由器。LSR能够理解MPLS标签并且能够对MPLS标签包进行交换。有三种类型的LSR:

  • Ingress LSR:或者叫入站LSR。如上图所示,R1、R2、R3构建了MPLS域,其中R1及R3身处MPLS域边界,它们一侧连接着MPLS网络,另一侧连接着IP网络。当我们考虑IP数据包从R1左侧的IP网络到达R1,然后被R1转发到MPLS网络时,我们称R1为“入站LSR”,它此刻负责将收到的IP报文压上MPLS标签,然后转发到MPLS网络。
  • Intermediate LSR:R2就是一台Intermediate LSR(也叫transit LSR),它没有连接任何的IP网络,而是完全身处MPLS网络,只负责标签数据交换。
  • Egress LSR:出站LSR,例如上图所示的R3,对于从左向右的数据流来说,它们被R1压上MPLS标签后,被R2转发给了R3,现在这些数据要从MPLS网络转发到IP网络,R3负责将这些数据的标签栈移除,再将得到的IP报文转发到目的地3.3.3.0.24。
2.FEC

FECForwarding Equivalence Class,转发等价类),是在转发过程中,具有相同处理方式和处理待遇的数据流,可通过地址、隧道、CoS等方式来标识,通常在一台设备上,对于一个FEC分配相同的标签。属于一个FEC的流量具有相同的转发方式、转发路径和转发待遇。但是并不是所有拥有相同标签的报文都属于一个FEC,因为这些报文的EXP值可能不相同,执行方式可能不同,因此它们可能属于不同的FEC。决定报文属于哪一个FEC的路由器是入站LSR,因为是它对报文进行分类和压入标签。

下面是一些FEC的范例:

  • 目的IP地址匹配同一个特定前缀的报文;
  • 属于某个特定组播组的组播报文;
  • 根据进程或者IP DSCP字段有相同处理方式的报文。

注:一条FEC可以包含多个流,但不是一个流一个FEC,比如一台主机在看新浪的网页,这是一个流,又在看新浪的视频,这又是一个流,这两个流在新浪发给远程主机时,走的路径应该是相同的,所以一个FEC有多个流,但是每个流并没有属于单独的FEC。

3.LSP

LSP(Label Switched Path,标签交换路径),标签报文穿越MPLS网络到达目的地所走的路径。MPLS网络通过标签分配协议自行进行标签的分配和学习,为流量建立一条标签转发的通道。LSP是单的。

实际上,LSP是报文在穿越MPLS网络或者部分MPLS网络时的路径。为了满足通信节点之间的双向通信,我们往往需要建立双向的LSP。

LSP分为静态LSP和动态LSP两种。静态LSP由管理员手工配置,动态LSP则利用路由协议和标签发布协议动态建立。

静态LSP是用户通过手工为各个转发等价类分配标签而建立的。手工分配标签需要遵循的原则是:上游LSR出标签的值就是下游LSR入标签的值。

由于静态LSP沿途的各LSR不能相互感知到整个LSP的情况,因此静态LSP是一个本地的概念。

静态LSP不使用标签发布协议,不需要交互控制报文,因此消耗资源比较小,适用于拓扑结构简单并且稳定的小型网络。但通过静态方式分配标签建立的LSP不能根据网络拓扑变化动态调整,需要管理员干预。

1.3 MPLS 标签

一个IP数据包如果要进入MPLS网络,会被LSR压入标签栈,一个标签栈中可能包含一层标签,也可能包含多层标签。

标签头部的字段格式如上图所示。以下展示的是一个携带多个标签头部的标签报文:

一个IP数据包可以被压入一层MPLS标签,也可以是多层标签。例如上图所示的IP数据包,就被压入了三层标签。在每层标签头部中都有一个BoS位来标识本标签头部是否是标签栈的栈低(每个标签头部都拥有完整的四个字段),如果本标签头已经是栈底,也就是最后一层标签,或者说后面就是IP头部了,那么该层标签头部的BoS比特值被设置为1,否则设置为0。

1.4 MPLS 标签操作

标签的操作类型包括标签压入(Push,或Insert)、标签交换(Swap)和标签弹出(Pop),它们是标签转发的基本动作,是标签转发信息表的组成部分。

  • Push:指当IP报文进入MPLS域时,MPLS边界设备在报文二层头部和IP头部之间插入一个新标签;或者MPLS中间设备根据需要,在标签栈顶增加一个新的标签(即标签嵌套封装)。
  • Swap:当报文在MPLS域内转发时,根据标签转发表,用下一跳分配的标签,替换MPLS报文的栈顶标签。
  • Pop:当报文离开MPLS域时,将MPLS报文的标签去掉。

在最后一跳LSR,标签已经没有使用价值。这种情况下,可以利用倒数第二跳弹出特性PHP(PenultimateHop Popping),在倒数第二跳LSR处将标签弹出,减少最后一跳的负担。最后一跳LSR直接进行IP转发或者下一层标签转发。

PHP在Egress LSR上配置。支持PHP的Egress LSR分配给倒数第二跳LSR的标签值为3。

下面是一个小例子:

例如上图所示,R1在收到一个IP数据包之后,经过FIB表(转发信息表)查询,它发现去往3.3.3.0/24的下一跳是R2,并且报文需要压入一层标签,标签值为1028。因此R1将IP数据包压入一层标签然后转发给R2。

说明:对于R1而言,去往3.3.3.0/24的出站标签1028是由下一跳设备R2所分配的。设备在转发标签报文时,所使用的出站标签始终是下一跳设备所分配的标签值。

R2收到这个携带了标签的标签包,它取出标签值并在自己的标签转发表里进行查询,发现入站标签1028对应出站标签1026,且下一跳为R3,因此它将报文的标签置换(SWAP)成1026并转发给R3。同样的,R3收到这个标签报文后,在其标签转发表里查询入站标签1026,结果发现入站标签1026对应的出站动作是3(标签值3是一个特殊的、被保留的标签值,当出站标签为3时,意味着要弹出标签头),因此将标签头弹出,这就得到了原始的IP报文,最后R3将这个IP数据包转发出去。

LSP的入口LSR被称为Ingress LSR入站LSR)。位于LSP中间的LSR被称为中间LSR(Transit LSR)。

LSP的出口LSR被称为Egress LSR出站LSR)。Ingress LSR及Egress LSR都是LER。在上图中,对于去往3.3.3.0/24的数据流量而言,R1是Ingress LSR,R2是Transit LSR,R3是Egress LSR。一条LSP可以有0个、1个或多个Transit LSR ,但有且只有一个Ingress LSR和一个Egress LSR 。值得一提的是在本例中,R1是Ingress LER,也及是入站的边界标签交换路由器,它左侧连接着IP网络,而右侧连接着MPLS网络。当R1收到一个IP数据包时,它会怎么处理?它会在FIB表中查找该IP报文的目的IP地址,如果有匹配的表项并且该表项所指示的下一跳是一个IP设备而不是LSR,那么这个报文会被直接路由。

但是如果FIB中的表项指示下一跳是一台LSR并且需要压入标签,情况就不同了,R1会给IP报文压入标签,然后再把这个标签包转发出去,这个时候,IP数据包就通过R1进入了MPLS网络。一旦以标签包的形态进入MPLS网络,在转发的过程中所有LSR(除了出站LSR)就只看数据包的标签头,对其进行查找及交换,而不会去理会标签头里头的IP头部。而至于给这个报文压入的标签值是多少,标签值是怎么确定的,请继续看下文。

1.5 MPLS 转发过程详解

首先,我们要掌握一些基本概念:

NHLFE(Next Hop Label Forwarding Entry,下一跳标签转发表项)

用于指导MPLS报文的转发。

NHLFE包括:Tunnel ID、出接口、下一跳、出标签、标签操作类型等信息。

FTN(FEC-to-NHLFE, FEC到一组NHLFE的映射)

通过查看FIB表中Tunnel ID值不为0x0的表项,能够获得FTN的详细信息。FTN只在Ingress存在。

ILM (Incoming Label Map,入标签到一组下一跳标签转发表项的映射)

ILM包括:Tunnel ID、入标签、入接口、标签操作类型等信息。

ILM在Transit LSR的作用是将标签和NHLFE绑定。通过标签索引ILM表,就相当于使用目的IP地址查询FIB,能够得到所有的标签转发信息。

Tunnel ID

为了给使用隧道的上层应用(如VPN、路由管理)提供统一的接口,系统自动为隧道分配了一个ID,也称为Tunnel ID。该Tunnel ID的长度为32比特,只是本地有效。

在报文的转发过程中:

  • 在Ingress LSR,通过查询FIB表和NHLFE表指导报文的转发。
  • 当IP报文进入MPLS域时,首先查看FIB表,检查目的IP地址对应的Tunnel ID值是否为0x0。如果TunnelID值为0x0,则进入正常的IP转发流程。如果Tunnel ID值不为0x0,则进入MPLS转发流程。
  • 在Transit LSR,通过查询ILM表和NHLFE表指导MPLS报文的转发。
  • 在Egress LSR,通过查询ILM表指导MPLS报文的转发或查询路由表指导IP报文转发。
Ingress LSR的处理:
Transit LSR的处理:
Egress LSR的处理:
小结:

二、LDP

2.1 LDP 概述

标签报文在MPLS网络沿着标签交换路径转发的过程中,中间LSR都只是查看数据的标签值,并且针对该标签进行查询、置换等操作。那么入站LSR究竟该为IP数据包压什么标签呢?标签交换路径是怎样的?如何确保这个IP数据包能够顺利的穿越MPLS网络?这些都是控制层面的问题,肯定是需要协议来解决的,而且应该在IP数据包到达之前就把所有的事情准备好。

所有我们需要一个协议,这个协议能够帮助我们为特定的流量建立LSP,能够为FEC(例如特定的路由前缀)分配标签,并且将标签映射传递(或者说分发)给其他的标签交换路由器。

如果让OSPF、ISIS这样的协议来分发标签是不可能的了(至少在未对协议做扩展之前是不可能的)。那么就需要一个新的协议,独立于所有的路由协议并且能够结合路由协议一起使用,这个协议能够为特定的FEC捆绑标签,并且将标签分发给其他的LSR。LDPLabel Distribution Protocol标签分发协议)就是一个这样的协议。

每一台运行LDP的LSR都会为自己路由表中的路由前缀捆绑标签,然后再将所分配的标签分发给所有的LSR邻居。LDP邻居将这些接收到的标签视为出站标签Outgoing label(或者远端标签),之后邻居将该出站标签和其自己本地的标签存储于一张特殊的表中。通常一台LDP路由器会有多个LDP邻居,那么这些邻居都会给路由分配标签然后将这些标签传给自己。

一台LSR有可能会收到多个LDP邻居分发的标签,可能对于同一个FEC,会同时收到多个邻居分发的标签,通常路由器只使用其中一个标签作为该前缀的出站标签。它通过RIB也就是IP路由表得到该IPv4前缀的下一跳,它将使用这个下一跳LSR所分发的标签作为最终的出站标签。

在LDP完成工作后,一条LSP就建立起来了。

2.2 LDP ID

LDP-ID是长度为6Byte的LDP标识符,包含4Byte的LSR-ID及2Byte的标签空间值,例如192.168.255.1:0。

其中4Byte的LSR-ID为系统视图命令mpls lsr-id所指定的标识符,也就是LSR的标识符 (在对设备做MPLS配置之前,需要首先在系统视图下指定LSR-ID,LSR-ID与IPv4地址的格式相同,例如192.168.25.1)。

标签空间值一般为0,表示标签是基于设备或者说是基于平台的(Per-Platform);如果是非0,就说明用的是基于接口的标签空间。

2.3 标签空间

默认的LDP标签空间是基于设备或者说基于平台的(per-platform)。什么意思呢,看上图中的B路由器,它为前缀X捆绑了标签1088,并且将这个标签捆绑信息发布给所有的LDP邻居,给大家的都一样而且人人有份,都是标签1088。这就是基于平台的意思。除此之外还有基于接口的标签空间。

  • Label Space ID一般为0,表示我们的标签是基于平台(Per-platform)的标签空间。
  • 为前缀分配的标签在本地任意MPLS接口可用并且会分发给所有LSR邻居。
  • 本地分配的标签会分发给邻居,如果与单个邻居有多条连接,则该标签在所有连接上均有效。那么不管本地从哪个接口上收到一个标签包,只要有这个标签,都会对其进行交换。

2.4 传输地址

  • 两台LSR之间在建立LDP会话之前,需要先建立TCP连接,以便进行LDP协议报文的交换。
  • 互为邻居的LSR需基于双方的传输地址(Transport Address)建立TCP连接。
  • 在LDP Hello报文中,包含设备的传输地址,LSR通过Hello报文知晓邻居的传输地址。
  • 在使用Hello报文发现邻居并且知道了对方的传输地址后,邻居之间就会开始尝试TCP三次握手(基于传输地址),并且交互LDP的初始化报文、标签映射报文等,这些报文都使用双方的传输地址作为源、目的IP地址。
  • 传输地址会被用来与邻居建立TCP连接,因此LSR必须拥有到达邻居的传输地址的路由。
  • 缺省情况下,公网的LDP传输地址等于设备的LSR-ID,私网的传输地址等于接口的主IP地址。
  • 在接口视图下,使用mpls ldp transport-address命令,可以修改传输地址。

2.5 LDP 的基本工作过程

Step1:
Step2:
Step3:
Step4:
Step5:
Step6:
Step7:

在MPLS中,运行LDP协议的LSR的操作小结:

  • LSR首先通过运行IGP协议(例如OSPF、IS-IS等)来构建路由表、FIB表;
  • LDP根据相应的模式,为路由表中的路由前缀(FEC)分配标签;
  • LDP根据相应的模式,将自己为路由前缀分配的标签,通过LDP标签映射报文通告给LDP邻居;
  • LSR将自己为路由前缀分配的标签,以及LDP邻居为该路由前缀通告的标签存储起来,并形成联;
  • 当LSR转发到达目的网络的标签报文时,所使用的出站标签总是下游LDP邻居所通告的标签,此处所指的下游邻居,是设备的路由表中到达该目的网络的下一跳设备。

2.6 PHP

PHPPenultimate Hop Poppoing,次末跳弹出或者倒数第二跳弹出),这是MPLS的一个基础性机制。下面,来看一个简单的例子:

在上图中,R3收到发往1.0.0.0/8的标签报文后,需首先在ILM中查询标签值,然后根据指示将标签头部弹出,再到FIB表中查询IP报文的目的IP地址,最后将IP报文转发出去。也就是说,R3需要执行两次查询操作。实际上,对于这个过程来说,是存在优化空间的。

R3如果激活了PHP特性,那么当它为本地直连路由1.0.0.0/8分配标签时,会分配一个特殊的标签,该标签被称为隐式空标签(Implicit NULL Label),其值为3。R3将该标签值通告给R2。当LSR转发一个标签报文时,如果发现相应的入站标签对应的出站标签值为3,那么该LSR将把报文的标签头部弹出,然后将里面所封装的数据转发给下游LSR,也就是执行PHP(Penultimate hop popping,次末跳弹出)操作。

R2作为到达1.0.0.0/8的次末跳(倒数第二跳),收到发往1.1.1.3的标签报文后,发现出站标签值为3,于是将标签头部弹出,将IP报文转发给R3,而R3则仅需执行一次查询操作(查询FIB表)即可获得相应的转发信息,转发效率得到了提升

LDP在帧模式Frame Mode下(现在基本都用帧模式了),LSR会为本地路由捆绑标签值3,3是一个LDP保留的标签,叫做“impilict null隐式空”标签。

倒数第二跳弹出机制(PHP)有两种标签,一是implicit null (隐式空),在LDP中标签值为3;

另一个是explicitnull(显式空),在LDP中标签值为0。如果收到LDP邻居发送来的关于某条路由分配的标签值为3,则我发送前往该目标网段的数据给该邻居时,我会将该标签弹出,再将内层数据转给邻居。而如果邻居关于某条路由分配的标签值为0,那么本地在转数据给邻居时,会带上标签头(标签值为0的),一并发给邻居。在MPLS视图下,使用“label advertise explicit-null”命令,可以让设备向倒数第二跳分配显式空标签;

label advertise implicit-null”命令(默认即开启)则会使得设备向倒数第二跳分配隐式空标签。“labeladvertise non-null”命令则相当于关闭PHP机制,使得设备正常分配标签而不使用空标签。

三、MPLS 的基础配置

3.1 基础命令

  1. 配置设备的LSR ID
代码语言:javascript
复制
[Huawei] mpls lsr-id x.x.x.x

配置LSR ID是进行所有MPLS配置的前提,LSR没有缺省的LSR ID,必须手工配置。 2. 全局激活MPLS

代码语言:javascript
复制
[Huawei] mpls
  1. 全局激活LDP
代码语言:javascript
复制
[Huawei] mpls ldp
  1. 在接口上激活MPLS
代码语言:javascript
复制
[Huawei-GigabitEthernet2/0/0] mpls
  1. 在接口上激活LDP
代码语言:javascript
复制
[Huawei-GigabitEthernet2/0/0] mpls ldp
  1. (可选)配置设备的LDP传输地址Transport Address
代码语言:javascript
复制
[Huawei-GigabitEthernet2/0/0] mpls ldp transport-address intf.

缺省情况下,公网的LDP传输地址等于节点的LSR ID,私网的传输地址等于接口的主IP地址。

  1. (可选)配置LSP建立的触发策略
代码语言:javascript
复制
[Huawei-mpls] lsp-trigger { all | host | ip-prefix ip-prefix-name | none }

缺省情况下,触发策略为host,即32位地址的主机IP路由(不包括接口的32位地址的主机IP路由)触发建立LSP。如果触发策略为all,则所有静态路由和IGP路由触发建立LSP。BGP公网路由不能触发建立LSP。如果触发策略为ip-prefix,则只有通过IP地址前缀列表过滤的FEC项能够触发建立LSP。如果触发策略为none,则不触发建立LSP

3.2 基础实验

  • 设备互联地址如图所示;所有设备开设Loopback0口,该接口IP地址为x.x.x.x/32,其中x为设备编号。Loopback0的IP地址作为OSPF RouterID以及LSR ID、LDP传输地址。
  • R1、R2、R3、R4运行OSPF,通告直连接口及Loopback0。
  • 所有设备激活MPLS,基于直连建立LDP邻居,观察标签的分发情况。
  • 观察1.1.1.1访问4.4.4.4数据包,分析数据包穿越MPLS网络的过程。 R1的配置如下:
代码语言:javascript
复制
#完成接口IP地址的配置:
[R1] interface GigabitEthernet0/0/0
[R1-GigabitEthernet0/0/0] ip address 12.1.1.1 24
[R1] interface loopback0
[R1-Loopback0] ip address 1.1.1.1 32

#配置OSPF:
[R1] ospf 1 router-id 1.1.1.1
[R1-ospf-1] area 0
[R1-ospf-1-0.0.0.0] network 12.1.1.0 0.0.0.255
[R1-ospf-1-0.0.0.0] network 1.1.1.1 0.0.0.0

#配置MPLS:
[R1] mpls lsr-id 1.1.1.1  #配置MPLS LSR ID
[R1] mpls #全局激活MPLS
[R1-mpls] quit
[R1] mpls ldp  #全局激活LDP
[R1-mpls-ldp] quit
[R1] Interface GigabitEthernet 0/0/0
[R1-GigabitEthernet0/0/0] mpls #在接口上激活MPLS
[R1-GigabitEthernet0/0/0] mpls ldp #在接口上激活LDP

R2的配置如下:

代码语言:javascript
复制
#完成接口IP地址的配置:
[R2] interface GigabitEthernet0/0/0
[R2-GigabitEthernet0/0/0] ip address 12.1.1.2 24
[R2] interface GigabitEthernet0/0/1
[R2-GigabitEthernet0/0/1] ip address 23.1.1.2 24
[R2] interface loopback0
[R2-Loopback0] ip address 2.2.2.2 32

#配置OSPF:
[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 0
[R2-ospf-1-0.0.0.0] network 12.1.1.0 0.0.0.255
[R2-ospf-1-0.0.0.0] network 23.1.1.0 0.0.0.255
[R2-ospf-1-0.0.0.0] network 2.2.2.2 0.0.0.0

#配置MPLS:
[R2] mpls lsr-id 2.2.2.2  #配置MPLS LSR ID
[R2] mpls #全局激活MPLS
[R2-mpls] quit
[R2] mpls ldp  #全局激活LDP
[R2-mpls-ldp] quit
[R2] Interface GigabitEthernet 0/0/0
[R2-GigabitEthernet0/0/0] mpls #在接口上激活MPLS
[R2-GigabitEthernet0/0/0] mpls ldp #在接口上激活LDP
[R2] Interface GigabitEthernet 0/0/1
[R2-GigabitEthernet0/0/1] mpls #在接口上激活MPLS
[R2-GigabitEthernet0/0/1] mpls ldp #在接口上激活LDP

R3的配置如下:

代码语言:javascript
复制
#完成接口IP地址的配置:
[R3] interface GigabitEthernet0/0/0
[R3-GigabitEthernet0/0/0] ip address 23.1.1.3 24
[R3] interface GigabitEthernet0/0/1
[R3-GigabitEthernet0/0/1] ip address 34.1.1.3 24
[R3] interface loopback0
[R3-Loopback0] ip address 3.3.3.3 32

#配置OSPF:
[R3] ospf 1 router-id 3.3.3.3
[R3-ospf-1] area 0
[R3-ospf-1-0.0.0.0] network 23.1.1.0 0.0.0.255
[R3-ospf-1-0.0.0.0] network 34.1.1.0 0.0.0.255
[R3-ospf-1-0.0.0.0] network 3.3.3.3 0.0.0.0

#配置MPLS:
[R3] mpls lsr-id 3.3.3.3  #配置MPLS LSR ID
[R3] mpls #全局激活MPLS
[R3-mpls] quit
[R3] mpls ldp  #全局激活LDP
[R3-mpls-ldp] quit
[R3] Interface GigabitEthernet 0/0/0
[R3-GigabitEthernet0/0/0] mpls #在接口上激活MPLS
[R3-GigabitEthernet0/0/0] mpls ldp #在接口上激活LDP
[R3] Interface GigabitEthernet 0/0/1
[R3-GigabitEthernet0/0/1] mpls #在接口上激活MPLS
[R3-GigabitEthernet0/0/1] mpls ldp #在接口上激活LDP

R4的配置如下:

代码语言:javascript
复制
#完成接口IP地址的配置:
[R4] interface GigabitEthernet0/0/0
[R4-GigabitEthernet0/0/0] ip address 34.1.1.4 24
[R4] interface loopback0
[R4-Loopback0] ip address 4.4.4.4 32
#配置OSPF:
[R4] ospf 1 router-id 4.4.4.4
[R4-ospf-1] area 0
[R4-ospf-1-0.0.0.0] network 34.1.1.0 0.0.0.255
[R4-ospf-1-0.0.0.0] network 4.4.4.4 0.0.0.0
#配置MPLS:
[R4] mpls lsr-id 4.4.4.4  #配置MPLS LSR ID
[R4] mpls #全局激活MPLS
[R4-mpls] quit
[R4] mpls ldp  #全局激活LDP
[R4-mpls-ldp] quit
[R4] Interface GigabitEthernet 0/0/0
[R4-GigabitEthernet0/0/0] mpls #在接口上激活MPLS
[R4-GigabitEthernet0/0/0] mpls ldp #在接口上激活LDP

完成上述配置后,我们来做一些查看和验证:

代码语言:javascript
复制
[R1] display mpls ldp peer
LDP Peer Information in Public network
A '*' before a peer means the peer is being deleted.
------------------------------------------------------------------------------
PeerID TransportAddress  DiscoverySource
------------------------------------------------------------------------------
2.2.2.2:0 2.2.2.2 GigabitEthernet0/0/0
------------------------------------------------------------------------------
TOTAL: 1 Peer(s) Found.

以上输出的是R1的LDP邻居表,从表中可以看出R1已经发现了一个LDP邻居,那就是R2。

代码语言:javascript
复制
[R1] display mpls ldp session
LDP Session(s) in Public Network
------------------------------------------------------------------------------
Peer LDP ID : 2.2.2.2:0 Local LDP ID : 1.1.1.1:0
TCP Connection : 1.1.1.1 <- 2.2.2.2
Session State : Operational Session Role : Passive
Session FT Flag : Off MD5 Flag : Off
Reconnect Timer : --- Recovery Timer : ---
Keychain Name : ---
Negotiated Keepalive Hold Timer : 45 Sec
Configured Keepalive Send Timer : ---
Keepalive Message Sent/Rcvd : 20/20 (Message Count)
Label Advertisement Mode : Downstream Unsolicited
Label Resource Status(Peer/Local) : Available/Available
Session Age : 0000:00:04 (DDDD:HH:MM)
Session Deletion Status : No
Capability:
Capability-Announcement : Off
P2MP Capability : Off
Outbound&Inbound Policies applied : NULL
Addresses received from peer: (Count: 3)
2.2.2.2 12.1.1.2 23.1.1.2
------------------------------------------------------------------------------

以上输出的是LDP会话的详细信息,邻居的状态必须为Operational才是最终的稳态,另外从TCP连接1.1.1.1< 2.2.2.2可以验证一点,LDP的会话建立是由传输地址大的一方发起的。

代码语言:javascript
复制
<R1> display mpls lsp
-------------------------------------------------------------------------------
LSP Information: LDP LSP
-------------------------------------------------------------------------------
FEC In/Out Label In/Out IF Vrf Name
1.1.1.1/32 3/NULL -/-
2.2.2.2/32 NULL/3 -/GE0/0/0
2.2.2.2/32 1024/3 -/GE0/0/0
3.3.3.3/32 NULL/1025 -/GE0/0/0
3.3.3.3/32 1025/1025 -/GE0/0/0
4.4.4.4/32 NULL/1026 -/GE0/0/0
4.4.4.4/32 1026/1026 -/GE0/0/0

以上输出的是R1的标签转发库,可以看到已经建立好的LSP。

实际上,当我们再R1、R2、R3、R4上运行OSPF后,全网的路由已经被打通,也就是每台路由器都拥有全网的路由,其中包括互联网段的路由,以及各设备的Loopback路由。随后我们激活各设备的MPLS和LDP,每台设备会基于自己的路由表中的路由前缀进行标签捆绑,并且将为路由前缀(FEC)所捆绑的标签分发给自己的LDP邻居。默认情况下在我司的设备上,仅为/32的主机路由分发标签。

现在,来测试一下,从R1去tracert 4.4.4.4:

代码语言:javascript
复制
<R1>tracert lsp ip 4.4.4.4 32
LSP Trace Route FEC: IPV4 PREFIX 4.4.4.4/32 , press CTRL_C to break.
TTL Replier Time Type Downstream
0 ngress 12.1.1.2 / [1026]
1 12.1.1.2 200 ms Transit 23.1.1.3 / [1028]
2 23.1.1.3 170 ms Transit 34.1.1.4 / [3]
3 4.4.4.4 100 ms Egress

从tracert的结果我们可以看到数据包行走的路径,以及被压入的标签。

报文的转发过程实际上类似下面这样(读者在实验过程中,可能会发现实际的标签值与本文档的不相同,这是正常的):

四、MPLS VPN

本文档描述的MPLS VPN是三层的BGP/MPLS IP VPN。

BGP/MPLS IP VPN是一种L3VPNLayer 3 Virtual Private Network)。它使用BGP在服务提供商骨干网上发布VPN路由,使用MPLS在服务提供商骨干网上转发VPN报文。这里的IP是指VPN承载的是IP报文。

BGP/MPLS IP VPN基于对等体模型,这种模型使得服务提供商和用户可以交换路由,服务提供商转发用户站点间的数据而不需要用户的参与。相比较传统的VPN,BGP/MPLS IP VPN更容易扩展和管理。新增一个站点时,只需要修改提供该站点业务的边缘节点的配置。

BGP/MPLS IP VPN支持地址空间重叠、支持重叠VPN、组网方式灵活、可扩展性好,并能够方便地支持MPLS QoS和MPLS TE,成为在IP网络运营商提供增值业务的重要手段,因此得到越来越多的应用。

4.1 MPLS VPN 的架构

  • CE(Customer Edge):客户网络边缘设备,该设备属于客户,它除了连接着客户网络,还有接口直接与MPLS VPN网络相连。CE设备可以是路由器或交换机,也可以是一台主机。通常情况下,CE“感知”不到VPN的存在,也不需要支持MPLS。
  • PE(Provider Edge):是服务提供商网络的边缘设备,与CE直接相连。在MPLS网络中,对VPN的所有处理都发生在PE上,对PE性能要求较高。
  • P(Provider):服务提供商网络中的骨干设备,不与CE直接相连。P设备只需要具备基本MPLS转发能力,不维护VPN信息,也不维护客户VPN路由。

4.2 MPLS VPN 初体验

在上图所示的网络中,中间是运营商搭建的“MPLS VPN Backbone”也就是MPLS VPN骨干网络,这个网络面向客户提供VPN业务,使得不同的客户的路由、数据都能够通过这个公共的网络进行传输,而且互相不干扰。客户之间的路由及数据是完全隔离的,即使他们通过同一张运营商的网络进行承载。现在我们来看看MPLS VPN究竟是怎么一回事。

上图中,我们拿了两个客户做示例:客户A及客户B,他们各自有两个站点。现在要求客户A的两个站点之间能够互通,客户B的两个站点之间能够互通,而客户A、B之间是完全隔离的。再者,同一个客户的两站点之间,要能够动态的交互路由信息,也就是说客户A的站点1的CE路由器要能够动态的学习到站点2内的路由。

首先客户A站点1的CE路由器及客户B站点1的CE路由器与PE路由器均运行路由协议(也就是PE-CE之间的路由协议),例如BGP或者OSPF,或者干脆静态路由都行,这么做的目的是把本地站点的路由交给PE1,然后让PE1帮忙传递给PE2,再由PE2交给客户A站点2的CE路由器,从而将路由打通。现在第一个问题来了。PE路由器如何区分不同客户的路由呢?而且从图中我们可以看出,客户A的站点1及客户B的站点1地址空间是重叠的,都是10.1.1.0/24,PE是如何区分的?

这就要提到MPLS VPN的一个组件:VRF(VPN Routing & Forwarding Instance),虚拟路由及转发实例,在华为平台上是VPN-Instance。所谓的VPN实例,我们可以简单的理解为是“一台虚拟路由器”,通过在PE1上创建两个VPN实例,用于分别面向客户1及客户2提供服务。在PE1创建的这两个VPN实例相当于两台虚拟路由器,它们各自有完全独立的路由表、转发表、路由协议进程、接口、等等,由于是完全独立的两台“虚拟路由器”,因此即使从两个不同的客户学习到同一个网段的路由也不用担心冲突的问题。

现在PE1上创建了两个VPN实例,用于分别和客户1及客户2交互VPN路由(客户的路由),那么为了将路由传递到PE2我们要考虑几个问题:

1、 用什么路由协议来“搬运”这些客户的VPN路由(将它们从PE1搬运到PE2)?PE肯定是面向大量客户的,因此路由前缀的数量肯定非常庞大。

2、 MPLS VPN Backbone的P路由器主要的功能是高速地转发数据,如果要它们也一起维护客户的路由肯定会增加负担,如何规避这个问题?

你可能已经想到,有一个协议能够胜任这个工作,那就是BGP,BGP能够承载大量的路由前缀,是一个在骨干网络中被广泛使用的路由协议,而且它具有丰富的路径属性和路由策略工具,使得网络的部署变得非常灵活和弹性。另外,BGP还有一个非常突出的优势,那就是它是基于TCP工作的,它不用像OSPF那样要求邻居必须直连,因此我们可以在PE1及PE2之间来建立iBGP的邻居关系,这样客户的路由就可以直接通过BGP传递,而P路由器则无需运行BGP,也无需维护客户的路由。

当然为了让PE1及PE2能够建立起iBGP邻居关系,我们要打通MPLS Backbone内的路由(注意,只是骨干网内部,不包含任何客户的路由),因此我们需要在Backbone内的PE及P路由器上运行一个IGP,例如OSPF或者ISIS,使得骨干网络内部的路由能够打通,为后面的工作做铺垫。

现在PE1及PE2之间有了BGP连接,PE1通过PE-CE间的路由协议所学习到的客户A及客户B的路由就能够通过BGP传递给PE2(反之亦然),但是问题又来了,客户A的站点1及客户B的站点1使用重叠的地址空间,都是10.1.1.0/24,PE1上虽然有VPN实例用于区分,但是现在要把这些路由通通传递给PE2,那么如何保证这些路由在MPLS VPN Backbone中传递时的唯一性呢?如何规避他们的重叠问题?很简单,我们为路由10.1.1.0/24增加一个“前缀”,这个前缀称为RD(Route Distinguisher),RD值的长度为64bit,表现形式通常为类似123:11这样,也就是AS:NN的形式。

我们给PE上的每一个VPN实例均设置一个唯一的RD值,例如为客户1设置一个6812:1,为客户2设置一个6812:2,然后当要把客户1的路由放进BGP搬运给PE2时,将IPv4的路由前缀10.1.1.0/24前面增加该VPN的RD值,得到6812:1:10.1.1.0/24,这样就构成了一个64+32bit也就是96bit的新前缀,这个前缀我们称之为VPNv4前缀,客户B的站点1路由在BGP中传递时就变成了6812:2:10.1.1.0/24,如此则可解决地址重叠的问题,保证所有客户路由的唯一性。

传统的BGP只能够运载10.1.1.0/24这样的IPv4路由前缀,现在我们要让BGP运载6812:1:10.1.1.0/24这样的VPNv4前缀,就需要对BGP进行扩展了,扩展以后的BGP我们称之为MP-BGP,也就是Multi-Protocol BGP,翻译为多协议BGP,如下图所示:

现在客户A及客户B的路由终于传递到了PE2上,接下去PE2就要把客户A站点1的路由传递给客户A站点2的CE路由器、把客户B站点1的路由传递给客户B站点2的CE路由器。问题又来了,PE2如何知道该把哪条VPN路由交给哪个客户的CE呢?显然在PE2上为了区分它自己所直连的不同客户,也需要创建VPN实例,但是从PE1收到的这么一大坨的路由前缀,哪些是要放进哪一个VPN实例的现在还是无从得知,因此我们需要一个新的标记来帮助PE,这就是RT(Route Target)值,如下图所示:

如上图所示,PE1在将客户A站点1的路由通过MP-BGP传递给PE2之前为路由打上“标记”,也就是RT值6812:1,而为客户B站点1的路由打上标记6812:2,这些RT的标记实际上是“粘贴”着VPNv4前缀一块儿传给PE2的,其实它们是以BGP的扩展Community的形式来存储的。如此一来路由到了PE2后,PE2就能够根据RT值来将不同的路由导入到对应的本地VPN实例中。

终于,路由千辛万苦被传递到了远端站点的CE路由器上。但是,事情还没有结束。设想一下,虽然客户A的站点2的CE路由器已经学习到站点1的10.1.1.0/24路由,现在它发送数据到站点1,这个IP数据包先是送到PE2,PE2通过VPN路由表的查找找到匹配的条目来自BGP那么接下去呢?直接把IP数据包送出去么?肯定是有问题的,因为IP数据包如果直接送出去,P路由器接收了铁定就丢包了,因为它并没有运行BGP也没有VPN客户的路由,它只有MPLS Backbone内的路由,这就出现了路由黑洞。怎么办,得为这个IP数据包穿上一件马甲,这个马甲整个MPLS Backbone都能认识,而且能帮助我们把这穿了马甲的数据包从PE2送到PE1去,这就是MPLS标签。当PE2把来自VPN客户的IP数据包送到MPLS VPN Backbone之前,要为数据包压入一层标签:

这层标签显然是P路由器给分发的,为谁分发的? 为PE1路由器的Loopback路由分发的标签,而这个Loopback地址,就是PE2上去往目标网段路由(客户A的站点1)的下一跳地址。PE2为数据包压入标签后,送到P路由器,P路由器沿着建立好的LSP将标签包送到PE1路由器。当然,为了保证整个MPLS VPN Backbone能够建立LSP,要在设备上都激活MPLS和LDP,这就是为什么我们称之为MPLS VPN。

但是,标签包是到了PE1,PE1该如何处理里头的数据呢?这个包是去往10.1.1.0/24网络的,而自己有两个10.1.1.0/24网络直连啊,为了解决这个问题,我们就需要为数据包再压入一层标签:

PE2将IP数据包送上MPLS VPN Backbone之前,为数据包压入两层标签,其中外层标签,也就是标签1011我们称之为IGP标签,它是由P路由器通过LDP协议分发的。而1233标签是内层标签,我们称之为VPN标签,它是由PE1路由器通过MP-BGP分发给PE2的。

外层标签是为了将数据沿着LSP送到PE1,而内层标签是为了在数据到达PE1后,让PE1判断该数据包究竟是应该送到哪一个VPN,因为VPN标签是PE1分配的所以它肯定不会搞错。完美的解决方案。

数据包终于穿越了整个MPLS VPN网络,到达了站点1。这就是MPLS VPN。

4.3 VPN 实例

MPLS VPN一个非常吸引人的地方,就是可以让不同客户的路由及数据穿越运营商的MPLS VPN Backbone,而且这些路由和数据又是相互隔离和独立的,即使不同的客户拥有相同的IPv4地址空间也不要紧。与客户的CE路由器交互“VPN客户路由”的PE路由器,就显得非常重要了。

在PE上有个非常重要的概念—VRF(严格的说,VRF的作用现在已经扩展了,我们这里重点讨论在MPLSVPN中的运用)。

VRF:Virtual Routing and Forwarding,翻译成虚拟路由及转发(在华为的设备上也被称为VPN-Instance),它是一种VPN路由和转发实例。一台PE路由器,由于可能同时连接了多个VPN用户,这些用户(的路由和数据)彼此之间需要相互隔离,这时候就用到了VRF。PE路由器上每一个VPN都有一个VRF。PE路由器除了维护全局IP路由表之外,还为每个VRF维护一张独立的IP路由表,这张路由表称为VRF路由表。要注意的是全局IP路由表以及每个VRF的路由表都是相互独立或者说相互隔离的。

因为每一个VPN都有一张独立的VRF路由表,所以PE路由器上每一个VPN也会有一张独立的FIB表来转发这些报文,这就是VRF FIB表。一旦在PE路由器上创建了一个VPN的实例,我们就可以将特定的接口(物理或逻辑的)绑定到这个VPN实例,那么这个接口将不再属于全局IP路由表或其他任何VPN实例,只为该VPN服务。

4.4 RD

传统BGP无法正确处理地址空间重叠的VPN的路由。假设客户A和客户B都使用了1.1.1.0/24网段的地址,并各自发布了一条去往此网段的路由。虽然本端PE通过不同的VRF可以区分地址空间重叠的VPN的路由,但是这些路由发往对端PE后,对端PE将根据BGP选路规则只选择其中一条VPN路由,从而导致去往另一个VPN的路由丢失。

PE之间使用MP-BGPMultiprotocol Extensions for BGP-4,BGP-4的多协议扩展)来发布VPN路由,并使用VPN-IPv4地址来解决上述问题。VPN-IPv4地址共有96bit,包括64bit的RD(Route Distinguisher,路由标识符)和32bit的IPv4地址前缀。RD用于区分使用相同地址空间的IPv4前缀,增加了RD的IPv4地址称为VPN-IPv4地址(即VPNv4地址)。PE从CE接收到IPv4路由后,转换为全局唯一的VPNv4路由,然后将其通告给远端PE。RD值在VPN实例中进行配置。

RD用于在MP-BGP运载VPN前缀时,确保这些前缀的唯一性。但是RD并不会说明该前缀属于哪一个VRF(需要搭配RT),RD的功能并不是VPN标示符,因为在一些复杂的VPN环境中,可能一个VPN存在多个RD。

RD的最重要的两个功能:

  1. 与32bit的IPv4前缀一起构成96bit的VPNv4前缀;
  2. 如果不同的VPN客户存在相同的IPv4地址空间,那么可以通过设置不同的RD值从而保证前缀的唯一性。

RD可以有两种表现形式:AS:nn或者IP-address:nn。其中nn代表编号。最常用的格式是AS:nn,其中AS代表AS号。通常AS是IANA分配给服务提供商的AS号,nn是服务提供商分配给VRF的唯一号码。产生的VPNv4前缀通过MP-BGP在PE路由器之间被传递。

4.5 RT

Route Targets,RT值用于区分VPN实例、控制VPN路由的收发,它定义了一条VPNv4路由可以为哪些站点所接收,以及PE可以接收哪些站点发送来的路由。RT值其实是一种类似“路由标记”的东西,相当于我们给VPNv4路由打上标记了,然后再基于这些标记来决定哪些路由是要放入哪一个VPN实例的。每个VRF关联一个或多个RT。有两类RT:

  • Export RT:PE从本地直连的站点学到IPv4客户路由后,将其转换为VPNv4路由,并为这些路由设置RT值,该RT值等于VRF中指定的Export RT。RT值作为BGP的扩展Community属性随路由发布给远端PE。
  • Import RT:PE收到其它PE通告过来的VPNv4路由时,将检查路由的RT,当路由的RT与该PE上某个VRF的Import RT匹配时,PE就把路由注入到该VRF中。

Export RT和Import RT的设置相互独立,并且都可以设置多个值,能够实现灵活的VPN访问控制,从而实现多种VPN组网方案。例如:某VRF的Import RT包含100:1,200:1和300:1,当收到的路由的RT为100:1、200:1、300:1中的任意值时,都可以被注入到该VRF中。

前面已经说了,VPN客户的路由在MPLS VPN Backbone内传输时,是通过MP-BGP来运载的,并且在运载的过程中是以VPNv4路由前缀的形式被运载,RD值用于和32bit的IPv4前缀构成96bit的VPNv4前缀。而与路由前缀共同被运载的还有其他的BGP路径属性,例如AS_PATH、LP、OriginCode等,除此之外还有非常重要的RT值,RT被存储在扩展Community属性中,与VPNv4路由一同被运载到对端PE路由器。对端PE也部署了VPN实例,RT值(包括Import RT和Export RT两个值)是关联在VPN实例中的。当PE接收到一大坨VPNv4路由时,它只将那些匹配VPN实例中的Import RT的路由放入该VPN实例。

4.6 基础实验

拓扑说明
  • CE1模拟客户A的站点1设备,CE2模拟客户A的站点2设备,CE1及CE2上各有一个Loopback接口用来模拟站点内的客户路由。CE1与PE1之间,CE2与PE2之间运行的PE-CE路由协议是OSPF,使用进程号1。
  • Backbone内使用OSPF打通骨干内的路由,OSPF使用进程号100。
  • PE1及PE2建立基于Loopback的MP-iBGP邻居关系。
  • 完成相关配置,使得客户A的两个站点能够互通。
配置步骤
1.Backbone内运行OSPF,统一使用进程号100

在PE1、P1、P2、PE2上运行OSPF。运行该OSPF进程的目的是为了打通Backbone内的路由,四台路由器都要通告自己的Loopback0网段路由。这个IGP打通的路由一方面是为了LDP能够建立起邻接关系,并且能够正常的分发标签,另一方面也是为了PE1及PE2之间能够建立起基于Loopback的MP-iBGP邻居关系。

2.Backbone内运行LDP

在PE1、P1、P2、PE2上运行MPLS及LDP。LDP开始工作后,缺省情况下即会为/32的主机路由捆绑并分发标签。骨干网内四台路由器的Loopback路由都会建立LSP。这为后续的客户数据转发做了铺垫。

3.PE1及PE2创建VPN实例,并运行PE-CE路由协议

在PE1及PE2上创建一个VPN实例,命令为ABC,将连接到CE的接口添加到这个VPN实例中。同时PE1、PE2均与自己直连的CE路由器运行一个基于VPN实例的OSPF进程,统一使用进程号1。务必要注意的是这个OSPF进程是基于VPN实例ABC(也就是基于虚拟路由器)的,而不是基于全局路由器的。

4.PE1及PE2创建MP-BGP进程,并且建立MP-iBGP邻居关系

PE1及PE2基于Loopback建立MP-iBGP邻居关系,激活二者的VPNv4连接。

5.PE1及PE2上配置VPN路由与BGP路由的互重发布

由于PE-CE之间选用的路由协议是OSPF,因此为了将路由拉通,需要在两台PE上配置OSPF进程1,以及MP-BGP的路由双向重发布。

6.查看及验证
设备配置

各设备接口IP地址的配置这里不再赘述了。

1.Backbone内运行OSPF

Backbone内的设备:PE1、PE2、P1、P2运行OSPF,统一使用进程号100。运行该OSPF进程的 目的是为了打通骨干网内的路由,四台设备在互联接口上激活OSPF,并且通告自己的Loopback0 接口路由。

PE1的配置如下:

代码语言:javascript
复制
[PE1] ospf 100 router-id 2.2.2.2
[PE1-ospf-100] area 0
[PE1-ospf-100-area-0.0.0.0] network 2.2.2.2 0.0.0.0
[PE1-ospf-100-area-0.0.0.0] network 10.1.23.2 0.0.0.0

P1的配置如下:

代码语言:javascript
复制
[P1] ospf 100 router-id 3.3.3.3
[P1-ospf-100] area 0
[P1-ospf-100-area-0.0.0.0] network 3.3.3.3 0.0.0.0
[P1-ospf-100-area-0.0.0.0] network 10.1.23.3 0.0.0.0
[P1-ospf-100-area-0.0.0.0] network 10.1.34.3 0.0.0.0

P2的配置如下:

代码语言:javascript
复制
[P2] ospf 100 router-id 4.4.4.4
[P2-ospf-100] area 0
[P2-ospf-100-area-0.0.0.0] network 4.4.4.4 0.0.0.0
[P2-ospf-100-area-0.0.0.0] network 10.1.34.3 0.0.0.0
[P2-ospf-100-area-0.0.0.0] network 10.1.45.4 0.0.0.0

PE2的配置如下:

代码语言:javascript
复制
[PE2] ospf 100 router-id 5.5.5.5
[PE2-ospf-100] area 0
[PE2-ospf-100-area-0.0.0.0] network 5.5.5.5 0.0.0.0
[PE2-ospf-100-area-0.0.0.0] network 10.1.45.5 0.0.0.0

完成配置后,在各设备上查看路由,确保路由表是正确的。

2.Backbone内运行MPLS及LDP

PE1的配置如下:

代码语言:javascript
复制
[PE1] mpls lsr-id 2.2.2.2 #配置设备的LSR ID
[PE1] mpls  #全局激活MPLS
[PE1] mpls ldp #全局激活LDP
[PE1] interface GigabitEthernet 0/0/1
[PE1-GigabitEthernet0/0/1] mpls  #接口激活MPLS
[PE1-GigabitEthernet0/0/1] mpls ldp #接口激活LDP

P1的配置如下:

代码语言:javascript
复制
[P1] mpls lsr-id 3.3.3.3
[P1] mpls
[P1] mpls ldp
[P1] interface GigabitEthernet 0/0/0
[P1-GigabitEthernet0/0/0] mpls
[P1-GigabitEthernet0/0/0] mpls ldp
[P1] interface GigabitEthernet 0/0/1
[P1-GigabitEthernet0/0/1] mpls
[P1-GigabitEthernet0/0/1] mpls ldp

P2的配置如下:

代码语言:javascript
复制
[P2] mpls lsr-id 4.4.4.4
[P2] mpls
[P2] mpls ldp
[P2] interface GigabitEthernet 0/0/0
[P2-GigabitEthernet0/0/0] mpls
[P2-GigabitEthernet0/0/0] mpls ldp
[P2] interface GigabitEthernet 0/0/1
[P2-GigabitEthernet0/0/1] mpls
[P2-GigabitEthernet0/0/1] mpls ldp

PE2的配置如下:

代码语言:javascript
复制
[PE2] mpls lsr-id 5.5.5.5
[PE2] mpls
[PE2] mpls ldp
[PE2] interface GigabitEthernet 0/0/0
[PE2-GigabitEthernet0/0/0] mpls
[PE2-GigabitEthernet0/0/0] mpls ldp

完成配置后,确保所有的LDP邻居关系都正确的建立:

代码语言:javascript
复制
<PE1>display mpls ldp session
LDP Session(s) in Public Network
Codes: LAM(Label Advertisement Mode), SsnAge Unit(DDDD:HH:MM)
A '*' before a session means the session is being deleted.
------------------------------------------------------------------------------
PeerID Status LAM SsnRole SsnAge KASent/Rcv
------------------------------------------------------------------------------
3.3.3.3:0 Operational DU Passive 0000:00:04 20/20
------------------------------------------------------------------------------
TOTAL: 1 session(s) Found.

其他设备的查看不再赘述。

代码语言:javascript
复制
<PE1>display mpls lsp
-------------------------------------------------------------------------------
LSP Information: LDP LSP
-------------------------------------------------------------------------------
FEC In/Out Label In/Out IF Vrf Name
2.2.2.2/32 3/NULL -/-
3.3.3.3/32 NULL/3 -/GE0/0/1
3.3.3.3/32 1024/3 -/GE0/0/1
4.4.4.4/32 NULL/1025 -/GE0/0/1
4.4.4.4/32 1025/1025 -/GE0/0/1
5.5.5.5/32 NULL/1026 -/GE0/0/1
5.5.5.5/32 1026/1026 -/GE0/0/1

上面输出的是PE1的标签转发表。我们看到关于网络中的/32主机路由都已经收到了标签。

3.PE1及PE2创建VPN实例,并运行PE-CE路由协议

PE1的配置如下:

代码语言:javascript
复制
[PE1] ip vpn-instance ABC  #创建VPN实例
[PE1-vpn-instance-ABC] route-distinguisher 2345:1 #配置RD值
[PE1-vpn-instance-ABC-af-ipv4] vpn-target 2345:11 #配置RT值(导入及导出值均为2345:11)
[PE1] interface GigabitEthernet 0/0/0
[PE1-GigabitEthernet0/0/0] ip binding vpn-instance ABC #将该接口绑定到VPN实例ABC
[PE1-GigabitEthernet0/0/0] ip address 10.1.12.2 24
#
[PE1] ospf 1 vpn-instance ABC #运行基于VPN实例ABC的OSPF进程
[PE1-ospf-1] area 0
[PE1-ospf-1-area-0.0.0.0] network 10.1.12.2 0.0.0.0

CE1的配置如下:

代码语言:javascript
复制
[CE1] interface GigabitEthernet 0/0/0
[CE1-GigabitEthernet0/0/0] ip address 10.1.12.1 24
[CE1] interface LoopBack 0
[CE1-LoopBack0] ip address 1.1.1.1 32
[CE1] ospf 1 router-id 1.1.1.1
[CE1-ospf-1] area 0
[CE1-ospf-1-area-0.0.0.0] network 10.1.12.1 0.0.0.0
[CE1-ospf-1-area-0.0.0.0] network 1.1.1.1 0.0.0.0

PE2的配置如下:

代码语言:javascript
复制
[PE2] ip vpn-instance ABC
[PE2-vpn-instance-ABC] route-distinguisher 2345:1
[PE2-vpn-instance-ABC-af-ipv4] vpn-target 2345:11
[PE2] interface GigabitEthernet 0/0/1
[PE2-GigabitEthernet0/0/1] ip binding vpn-instance ABC
[PE2-GigabitEthernet0/0/1] ip address 10.1.56.5 24
#
[PE2] ospf 1 vpn-instance ABC
[PE2-ospf-1] area 0
[PE2-ospf-1-area-0.0.0.0] network 10.1.56.5 0.0.0.0

CE2的配置如下:

代码语言:javascript
复制
[CE2] interface GigabitEthernet 0/0/0
[CE2-GigabitEthernet0/0/0] ip address 10.1.56.6 24
[CE2] interface LoopBack 0
[CE2-LoopBack0] ip address 6.6.6.6 32
[CE2] ospf 1 router-id 6.6.6.6
[CE2-ospf-1] area 0
[CE2-ospf-1-area-0.0.0.0] network 10.1.56.6 0.0.0.0
[CE2-ospf-1-area-0.0.0.0] network 6.6.6.6 0.0.0.0

完成配置后,确保PE能够学习到直连CE的客户路由:

代码语言:javascript
复制
<PE1>display ip routing-table vpn-instance ABC
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: ABC

Destinations : 5 Routes : 5
Destination/Mask  Proto Pre Cost Flags NextHop Interface
1.1.1.1/32 OSPF  10 1 D 10.1.12.1 GigabitEthernet0/0/0
10.1.12.0/24 Direct 0 0 D 10.1.12.2 GigabitEthernet0/0/0
10.1.12.2/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/0
10.1.12.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/0
255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0

PE1上VPN实例ABC的路由表中已经通过OSPF学习到CE1的客户路由1.1.1.1/32。

4.PE1及PE2创建MP-BGP进程,并且建立MP-iBGP邻居关系

PE1的配置如下:

代码语言:javascript
复制
[PE1] bgp 2345
[PE1-bgp] router-id 2.2.2.2
[PE1-bgp] undo default ipv4-unicast #因为本实验中PE1-PE2之间无需交互IPv4路由,因此取消IPv4单播协议的邻居关系自动建立
[PE1-bgp] peer 5.5.5.5 as-number 2345
[PE1-bgp] peer 5.5.5.5 connect-interface LoopBack 0
[PE1-bgp] ipv4-family vpnv4 unicast #进入IPv4的VPNv4地址族
[PE1-bgp-af-vpnv4] peer 5.5.5.5 enable  #激活邻居5.5.5.5

PE2的配置如下:

代码语言:javascript
复制
[PE2] bgp 2345
[PE2-bgp] router-id 5.5.5.5
[PE2-bgp] undo default ipv4-unicast
[PE2-bgp] peer 2.2.2.2 as-number 2345
[PE2-bgp] peer 2.2.2.2 connect-interface LoopBack 0
[PE2-bgp] ipv4-family vpnv4 unicast
[PE2-bgp-af-vpnv4] peer 2.2.2.2 enable
5.PE1及PE2上配置PE-CE协议与BGP的互重发布

PE1的配置如下:

代码语言:javascript
复制
[PE1] bgp 2345
[PE1-bgp] ipv4-family vpn-instance ABC #将OSPF进程1的路由导入到BGP的VPN实例ABC对应的IPv4地址族中
[PE1-bgp-ABC] import-route ospf 1
#
[PE1] ospf 1 vpn-instance ABC #将BGP路由导入到OSPF进程1
[PE1-ospf-1] import-route bgp permit-ibgp

PE2的配置如下:

代码语言:javascript
复制
[PE2] bgp 2345
[PE2-bgp] ipv4-family vpn-instance ABC
[PE2-bgp-ABC] import-route ospf 1
#
[PE2] ospf 1 vpn-instance ABC
[PE2-ospf-1] import-route bgp permit-ibgp

确认下CE1是否已经收到去往CE2的路由:

代码语言:javascript
复制
<CE1>display ip routing-table protocol ospf
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Public routing table : OSPF
Destinations : 2 Routes : 2
OSPF routing table status : <Active>
Destinations : 2 Routes : 2
Destination/Mask  Proto Pre Cost Flags NextHop Interface
6.6.6.6/32 OSPF 10 3 D 10.1.12.2 GigabitEthernet0/0/0
10.1.56.0/24 O_ASE 150 1 D 10.1.12.2 GigabitEthernet0/0/0

CE1已经学习到了CE2所在站点的路由。反之同理,不再赘述。 6.查看及验证

代码语言:javascript
复制
[PE1]display bgp vpnv4 all routing-table 6.6.6.6
BGP local router ID : 2.2.2.2
Local AS number : 2345
Total routes of Route Distinguisher(2345:1): 1
BGP routing table entry information of 6.6.6.6/32:
Label information (Received/Applied): 1027/NULL
From: 5.5.5.5 (5.5.5.5)
Route Duration: 00h11m23s
Relay IP Nexthop: 10.1.23.3
Relay IP Out-Interface: GigabitEthernet0/0/1
Relay Tunnel Out-Interface: GigabitEthernet0/0/1
Relay token: 0x5
Original nexthop: 5.5.5.5
Qos information : 0x0
Ext-Community:RT <2345 : 11>, OSPF DOMAIN ID <0.0.0.0 : 0>,
OSPF RT <0.0.0.0 : 1 : 0>, OSPF ROUTER ID <10.1.56.5 : 0>
AS-path Nil, origin incomplete, MED 2, localpref 100, pref-val 0, valid, interna
l, best, select, pre 255, IGP cost 3
Not advertised to any peer yet
VPN-Instance ABC, Router ID 2.2.2.2:
Total Number of Routes: 1
BGP routing table entry information of 6.6.6.6/32:
Label information (Received/Applied): 1027/NULL
From: 5.5.5.5 (5.5.5.5)
Route Duration: 00h11m23s
Relay Tunnel Out-Interface: GigabitEthernet0/0/1
Relay token: 0x5
Original nexthop: 5.5.5.5
Qos information : 0x0
Ext-Community:RT <2345 : 11>, OSPF DOMAIN ID <0.0.0.0 : 0>,
OSPF RT <0.0.0.0 : 1 : 0>, OSPF ROUTER ID <10.1.56.5 : 0>
AS-path Nil, origin incomplete, MED 2, localpref 100, pref-val 0, valid, interna
l, best, select, active, pre 255, IGP cost 3
Not advertised to any peer yet

在PE1上查看路由6.6.6.6/32的详细信息。该条路由是通过MP-iBGP从PE2传递过来的。从详细信息的输出我们可以看到路由的下一跳是5.5.5.5。并且该路由捆绑的VPN标签是1027。因此当PE1收到IP数据包要去往6.6.6.6时,会为数据包压入VPN标签1027,同时为了让这个标签包能够正常的穿越骨干网并到达PE2上,还需为该标签包再增加一层标签。由于去往6.6.6.6的下一跳是5.5.5.5,因此在外层压入5.5.5.5路由对应的标签:

代码语言:javascript
复制
[PE1] display mpls lsp
-------------------------------------------------------------------------------
LSP Information: BGP LSP
-------------------------------------------------------------------------------
FEC In/Out Label In/Out IF Vrf Name
1.1.1.1/32 1027/NULL -/- ABC
10.1.12.0/24 1028/NULL -/- ABC
-------------------------------------------------------------------------------
LSP Information: LDP LSP
-------------------------------------------------------------------------------
FEC In/Out Label In/Out IF Vrf Name
2.2.2.2/32 3/NULL -/-
3.3.3.3/32 NULL/3 -/GE0/0/1
3.3.3.3/32 1024/3 -/GE0/0/1
4.4.4.4/32 NULL/1025 -/GE0/0/1
4.4.4.4/32 1025/1025 -/GE0/0/1
5.5.5.5/32 NULL/1026 -/GE0/0/1
5.5.5.5/32 1026/1026 -/GE0/0/1

从上面的输出我们可以看到PE1的标签转发表中,5.5.5.5的出站标签是1026。所以最终去往6.6.6.6的IP包被压入两层标签。内层VPN标签值是1027,外层LDP标签是1026。报文被处理后转发给了P1。P1在收到这个标签包后查看自己的标签转发表,注意,它只会查看外层标签。

代码语言:javascript
复制
[P1]display mpls lsp
-------------------------------------------------------------------------------
LSP Information: LDP LSP
-------------------------------------------------------------------------------
FEC In/Out Label In/Out IF Vrf Name
3.3.3.3/32 3/NULL -/-
2.2.2.2/32 NULL/3 -/GE0/0/0
2.2.2.2/32 1024/3 -/GE0/0/0
4.4.4.4/32 NULL/3 -/GE0/0/1
4.4.4.4/32 1025/3 -/GE0/0/1
5.5.5.5/32 NULL/1026 -/GE0/0/1
5.5.5.5/32 1026/1026 -/GE0/0/1

从P1的转发表我们可以看出,1026的入站标签,对应的出站标签是1026,并且出站接口是GE0/0/1。

因此它将收到的标签包的外层标签从1026置换成1026(碰巧置换前后标签值是一样的),然后从GE0/0/1口发出去。P2将收到这个标签包,也是查标签转发表:

代码语言:javascript
复制
<P2>display mpls lsp
-------------------------------------------------------------------------------
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
4.4.4.4/32 3/NULL -/-
3.3.3.3/32 NULL/3 -/GE0/0/0
3.3.3.3/32 1025/3 -/GE0/0/0
5.5.5.5/32 NULL/3 -/GE0/0/1
5.5.5.5/32 1026/3 -/GE0/0/1

P2发现,1026的入站标签,对应的出站标签是3,而3是一个保留标签,意味着要将该顶层标签出。

于是它将收到的标签数据的顶层标签弹出,然后剩余的数据从GE0/0/1口送出去。PE2将最终收到仍然

携带者VPN标签的数据。由于这个VPN标签是它自己发给PE1的,因此它知道这个标签值意味着什么、 与哪一个VPN实例对应。因此最终它将VPN标签剥去,然后将IP数据包转发给CE2。

在PE1上Tracert 6.6.6.6,可以查看到整个数据层面的过程:

代码语言:javascript
复制
<PE1>tracert -vpn-instance ABC -v -a 10.1.12.2 6.6.6.6
traceroute to ABC 6.6.6.6(6.6.6.6), max hops: 30 ,packet length: 40,press CTRL_C to break
1 10.1.23.3[MPLS Label=1026/1027 Exp=0/0 S=0/1 TTL=1/1] 110 ms 60 ms 70 ms
2 10.1.34.4[MPLS Label=1026/1027 Exp=0/0 S=0/1 TTL=1/2] 110 ms 50 ms 80 ms
3 10.1.56.5 80 ms 80 ms 60 ms
4 10.1.56.6 110 ms 80 ms 70 ms

实际上是这样的:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MPLS 与 MPLS VPN
    • 一、MPLS 基础
      • 1.1 MPLS 概述
      • 1.2 MPLS 术语
      • 1.3 MPLS 标签
      • 1.4 MPLS 标签操作
      • 1.5 MPLS 转发过程详解
    • 二、LDP
      • 2.1 LDP 概述
      • 2.2 LDP ID
      • 2.3 标签空间
      • 2.4 传输地址
      • 2.5 LDP 的基本工作过程
      • 2.6 PHP
    • 三、MPLS 的基础配置
      • 3.1 基础命令
      • 3.2 基础实验
    • 四、MPLS VPN
      • 4.1 MPLS VPN 的架构
      • 4.2 MPLS VPN 初体验
      • 4.3 VPN 实例
      • 4.4 RD
      • 4.5 RT
      • 4.6 基础实验
相关产品与服务
私有网络
私有网络(Virtual Private Cloud,VPC)是基于腾讯云构建的专属云上网络空间,为您在腾讯云上的资源提供网络服务,不同私有网络间完全逻辑隔离。作为您在云上的专属网络空间,您可以通过软件定义网络的方式管理您的私有网络 VPC,实现 IP 地址、子网、路由表、网络 ACL 、流日志等功能的配置管理。私有网络还支持多种方式连接 Internet,如弹性 IP 、NAT 网关等。同时,您也可以通过 VPN 连接或专线接入连通腾讯云与您本地的数据中心,灵活构建混合云。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档