MPLS&MPLS-VPN基础架构(万字文版)

目录

一、MPLS多协议标签交换概述

1、MPLS是什么

2、MPLS-VPN

3、MPLS起源

(1)、MPLS解决的问题

MPLS解决了三层转发短板问题。

(2)、交换机转发流程

(3)、路由器转发流程

(4)、交换机和路由器转发区别

(5)、MPLS对路由器转发的优化

(6)、现阶段MPLS用途

二、深入了解MPLS

1、三种交换机制

(1)、进程交换(路由器时期短板)

(2)、快速交换

(3)、CEF

2、MPLS的术语

(1)、FEC全forwarding equivalence class 等价转发类

3、MPLS的限制

4、根据MPLS域路由器种类划分

5、LDP和TDP区别

6、LFIB标签转发信息库

(1)、标签对于路由器分类

(2)、标签工作流程

(3)、TDP/LDP两个功能

(4)、LDP/TDP物理属性

7、MPLS小细节

8、LDP作用

三、基于华为讲MPLS

1、MPLS的环路检测

 2、LDP环路检测

3、LDP协议原理

LDP建邻居分为两种

LDP报文:4大类

LDP封装

LDP消息作用

LDP发现机制(邻居建立)两种

华为启用MPLS命令:

LDP状态机(邻接关系集):

LDP的标签空间:

LDP标签分发:

标签分发分析

LDP标签保持

PHP导出第二眺弹出

四、LDP实验

五、MPLS VPN(核心)


一、MPLS多协议标签交换概述

IPv4中带有多协议基本就是GRE(GRE特点:不管你三层使用的什么被路由协议,不论IPv4或IPv6)

1、MPLS是什么

  • MPLS数据层面的交换技术,也可以说是转发技术。
  • MPLS本身就是一个数据层面的交换技术,MPLS VPN是他的后一级。
  • MPLS协议核心是第三个单词L,L叫lable标签。
  • MPLS整个技术就是围绕lable来进行。
  • MPSL经过不断升级后,最后经常使用的产物就是MPLS VPN。

2、MPLS-VPN

VPN分类:覆盖型VPN、对等体到对等体VPN,解决的问题是一样的都是让内网使用私有地址的主机能够不经过PAT直接用私有地址跨域访问。

  • MPLS是一种业务,得向当地运营商申请,特点是适合小白企业。
  • MPLS不用担心网络质量问题,可以要求流量Qos。
  • IPsec因为不花钱,所以无法保证流量业务质量。
  • 理解MPLS的控制层面和数据层面,再去理解MPBGP结合MPLS所形成的VPN架构。

3、MPLS起源

(1)、MPLS解决的问题

MPLS解决了三层转发短板问题。

(2)、交换机转发流程

交换机查表转发是查CAM表,CAM表集成在ASIC芯片(应用专用集成电路,在背板里,基于硬件转发就是基于限速(没有任何延迟)

(3)、路由器转发流程

路由器查表转发基于三层报头查ip routing-table IP路由表,IP路由器基于CPU调用(转发基于软件)

(4)、交换机和路由器转发区别

基于软件查表转发对CPU消耗大,基于硬件对CPU基本没消耗,基于软件调用CPU比较复杂转发有延迟增加转发时间,减少转发效率。

交换机根据DMAC查表转发是精确匹配(最简单逻辑进行匹配)

路由器根据DIP查表,因为去往一个又一个广播域,主机位是置零的,置零匹配不置零的,是模糊匹配,牵扯一个X,路由器叫TCAM三重CAM(三重CAM:有0匹配,有1不匹配,有X可以匹配可不匹配)

(5)、MPLS对路由器转发的优化

MPLS的优化:给路由器换一个转发高效的方式,类似交换机一样的转发,这个时候提出MPLS。

MPLS转发过程:发之前加一个4Byte的封装,封装中包含一个标签,是阿拉伯数字,有了标签不查路由表,查LFIB标签转发信息库,标签领域中的路由表,拿LFIB表路由器能做到精确匹配,甚至比交换机的CAM表还要效率高。路由表基于CPU驱动,LFIB基于芯片驱动,查LFIB不消耗CPU资源可以做到限速。

(6)、现阶段MPLS用途

MPLS在现如今优势越来越小了,但是用的越来越广了,因为研发人员基于MPLS研发了两种技术:

1、MPLS VPN(运行商专属业务,几乎不花成本提供多元化业务)IPv4地址不够用,所以出现这个技术。

2、MPLS TE:能实现运营商内网部署多个路径,MPLS TE能做到最大限度的路径负载均衡。(像部署PBR一样,路由器收到路由不是这样走的,但我能强行要求你路由按我的来。)

二、深入了解MPLS

1、三种交换机制

(1)、进程交换(路由器时期短板)

进程交换(路由器时期短板):基本没人用了,指路由器运行路由协议获悉路由条目,通过ARP等等获悉二层的封装信息,收到数据是不分流的,基于收到的每一个数据包做路由表查询,通过路由表查询找转发出接口,路由器收到数据进行三层和二层查询,三层确定出接口和下一跳,二层进行重新封装…..

(2)、快速交换

快速交换:和进程交换相比是一个里程碑式的升级。也叫网流式转发,基于流量的七元组:(源目IP地址、源目端口号、协议号、Tos字段、相同的入接口形成的就是一股数据流),第一个数据包查三层表确定出接口,查二层表确定封装协议,形成一个缓冲Cache,把Cache 缓存在ASIC芯片中,对于这个流的后续数据包查Cache就能转发。第一个包进行CPU软路由,第二个包以后都能类似交换机一样给你们做基于硬件的交换转发,也叫一次路由多次交换,一次查表多次转发。

(3)、CEF

CEF:不同厂商不一样,cisco叫思科急速转发CEF,华为和华三都有各自的叫法。

CEF思科急速转发:思科私有的交换机制,基于快速交换做升级,报文触发,启用CEF路由器就会生成两张表:

  • 第一张:FIB全forwarding information base路由信息库:经过优化的路由条目,条目靠下载得到,会把路由表所有路由条目做一个整合放到FIB中,主要优化路由条目下一跳。递归表查询(查两次获三次)
  • 第二张:adiacency table邻接关系表(二层表):供数据封装的优化后的二层信息。

都能被ASIC调用。

FIB好处:当使用FIB调用数据时,没有递归表查询,基于ASIC芯片调用,对于一股流的任何数据包不用路由,能完完全全经过交换的方式来做一个查表转发,确认出接口后,FIB还有一个功能联动邻接关系表表项,能清晰告诉封装二层封装什么值。

CEF可以理解为零次路由,全部转发。

2、MPLS的术语

当前使用MPLS就是为了做MPLS VPN和MPLS TE,BGP担心数据层面黑洞,当使用IBGP路由转发数据时,途经没有运行BGP的路由器就会丢包(解决丢包方法:1、都启用BGP 2、直连 3、重分发 4、BGP之间做tunnel 5、最靠谱启用MPLS,基于MPLS支持解决BGP黑洞)

关于MPLS的两个术语:

(1)、FEC全forwarding equivalence class 等价转发类

FEC全forwarding equivalence class 等价转发类:是标签存在的一个基石,同一个FEC打同一个标签,FEC做一个流量整合,每一个FEC打一个标签,一个FEC就是一个数据包的集合,相同的FEC具有相同属性。

FEC归类如下:

FEC归类如下:

  • 相同的VPN目的地
  • 相同的二层电路转发
  • 路由器同一个接口发走
  • 具有相同QoS标记
  • 具有相同的源地址

MPLS是数据层面的,但是产生标签需要控制层面TDP/LDP、MP-BGP、RSVP资源预留协议。

路由器能给每一条路由条目进行标签分发,我收到一条路由条目,我看能用哪条路由条目转发,打这条路由条目所对的标签。

一组去往相同目的地的数据包属于同一个FEC,这组同一目的地数据包要打上同一个标签,去往相同目的地可以使用同一路由转发,路由器能针对路由条目中的每一条路由条目做标签转发。

3、MPLS的限制

  • 做了MPLS域内不能做汇总路由。
  • ospf的loopback接口默认以32位路由通告。

在cisco中启用MPLS的条件是:必须使用CEF的交换机制。

标签压入、标签交换机制:(研究完MPLS表项)

一般在运营商内网会启用MPLS, 内部的都启用MPLS。

Edge LSR边界标签交换路由器。

4、根据MPLS域路由器种类划分

(1)、纯LSR

(2)、边界LSR(华为中叫LER):当收到从外到内的报文时,执行的是PUSH标签压入。

去掉标签有两个操作:

  • 标签弹出POP:把最外层的标签去掉。(内网执行)
  • 标签移除:把整个标签站里的所有标签去掉。(连外网执行这个)

5、LDP和TDP区别

接口启用MPLS就是数据层面和控制层面都启用了,通过这个接口允许收发带标签的报文,控制层面其实默认也启用了一个协议。TDP(标记分发协议)/LDP(标签分发协议)

早期MPLS叫Tag switching是Cisco开发,标准化就成了MPLS,标准化之前用TDP,标准化之后就用LDP。当前Cisco都支持TDP和LDP。

cisco在接口敲了Mpls ip就能启用MPLS,数据层面默认开启了MPLS的工作模式,控制层面如果操作系统高于12.3就是LDP,低于就是TDP。

cisco针对MPLS有两套命令一套是针对私有,一套针对公有协议。15.X能用的只是新命令LDP。

第一步运行动态或静态获得路由

第二部通过TDP/LDP进行标签分发(控制层面协议,根据路由条目中已有的路由条目生成标签)

第三步把标签告知邻居,默认标签只有本地拥有,所以得信息共享,TDP和LDP干两件事:

(1)、针对路由表中以有路由进行标签产生,标签分发。

(2)、把我分发的标签给我的邻居做一个通告。(当运行完LDP就和运行完OSPF一样,TDP和LDP也都会在直连路由器之间建立邻居,非直连之间也能建立邻居,也会有邻居表,邻居之前会互发标签)本地保存的标签并非LFIB,而是LIB,启用CEF形成FIB,路由器收到带标签的路由会查LFIB,收到邻居发来的标签值会绑定在LIB。

6、LFIB标签转发信息库

LFIB标签转发信息库:基于标签的路由表,收到一个带标签的报文,只要是MPLS必须查这个表做转发(会告诉你收到带什么标签的报文后该把标签换成什么一个其它的值,并把报文通过哪个接口发走,发给哪个下一跳)

LIB标签信息库:一个拓扑表,装着关于一条路由条目,关于一个FEC本地所产生的标签是什么,邻居所产生的标签是什么,每一个标签大家都是什么值,确定LFIB标签是什么。

FIB转发信息库:启用CEF后能被硬件调用的路由表(IPv4路由表)

一台路由器收到报文标签不是本地分发就会丢弃这个报文。(这个标签必须是本地关于某条路由条目所产生的)

 

(1)、标签对于路由器分类

入标签:接收到的报文所携带的标签,为了让我本地识别,必须是我本地产生的。

出标签:发给邻居时携带的,必须是下一跳邻居所产生的。

入标签和出标签没有关联。

(2)、标签工作流程

默认我不知道邻居标签,有了FIB就能知道关于一条路由本地的标签是多少,邻居的标签是多少(邻居给我发更新会告诉我邻居他的某个FEC对应的标签是什么),都能获得,把本地的标签和下一跳邻居的标签做一个绑定就能形成LIB,LIB里边放置的就是一对一对的标签映射,这个标签映射告诉路由器收到带这个标签的报文通过哪个路由器接口发走发给哪个下一跳并且要把标签换成哪个下一跳的值。

路由器启用CEF生成FIB(关于一个FEC是我对应的下一跳地址)

(3)、TDP/LDP两个功能

1、给本地路由表的每一条路由条目产生标签,这个叫标签分发。

2、把你本地产生的标签给邻居发走。

收到邻居发来的标签会放到LIB中。

基于FIB和LIB生成LFIB中的转发条目。

运行TDP/LDP路由器ID会手工指定。

两步:

1、运行IGP获取路由

2、启用TDP/LDP来针对路由表中路由进行标签分发,并且给邻居通告。

LDP不是万能,只能给路由表中部分路由进行标签分发:(重要)

1、直连路由

2、静态路由

3、通过IGP获悉路由

BGP(BGP路由自己分发标签)不会位address-family中所有路由分发标签只会为:

1、VPNv4路由

2、VPNv6路由

RSVP是在部署RSTE时使用,分发基于Qos的标签,能完成基于Qos功能的路径调整。

(4)、LDP/TDP物理属性

  • TDP即使用TCP/又使用UDP 端口号711(基本没人用了)
  • LDP即使用TCP/又使用UDP端口号646
  • TCP优点可靠,缺陷是只支持单播。
  • UDP优点灵活可以自动建邻居,缺陷不可靠。
  • TCP用广播发送hello,LDP使用组播发送hello。
  • 通过UDP发hello,通过TCP进行邻居的建立。

LDP最可靠的方式就是把路由器之间直连全部开启LDP,并且把它们的路由器ID宣告进IGP,能两两建邻居,只要能两两建立邻居就能通过标签,就是在接下来一段时间内有LFIB,不做路由汇总聚合、不通告ospf32位路由,关于FEC标签就是连续的。

内部LSR图例:

边界LSR图例:

路由器收到带标签的报文一定只能查LFIB,边界查LFIB查不到就会尝试把标签去掉,根据三层源目地址查LFIB,就能转发。

Cisco针对边界路由器做了PHP(倒数第二跳标签弹出/次末跳标签弹出)的优化,最后一跳路由器告诉你是倒数第二跳时,你把路由发给最后一跳时就能够直接把标签去掉,最后一跳收到没有标签的路由纯IPv4报文会查FIB,查一次FIB就能做一个精确转发。(华为也支持)

7、MPLS小细节

  • 启用不分环境,物理层使用什么样的介质无所谓局域网链路、广域网链路都行。
  • 二层启用什么样的协议也无所谓,以太网、帧中继、ppp都行。
  • MPLS在封装时会给数据帧添加一个32位的标记,标记插入在二层和三层报头之间(这就是为什么叫MPLS,插完三层报头就不用看了),因为封装位置MPLS也叫2.5层1协议。

MPLS对应的单播帧类型值是:0x8847,组播帧对应:0x8848。

帧模式PMLS:数据帧中添加MPLS。

信源模式MPLS:在ATM信源上也能添加。(没人用)

帧模式标签封装图:

标签字段(重要):前20位是标签取值0到2的20次方减一。(0-15都是特殊标签规定好了用途,能DIV的就是16-2的20次方-1)

3位EXP位叫实验位,类型802.1q中qos字段,用来做qos标记,二层qos标记。

S站点标记位,用来描述是不是最后一层标签。单纯的MPLS环境打一层标签,MPLS VPN环境通常是两层标签。MPLS-TE环境中是三层标签。置0为外层标签,置1为最内层。路由器收到带有标签只会对最外层做处理。

TTL防止环路。

三层标签图:

底层是靠近三层报头,外层是靠近二层报头。只有第一个添加的S位置1,其余的S位置0。

8、LDP作用

LDP主要干两件事:

  • 标签分发
  • 标签通告

每条路由在FIB中都会对应一个下一跳地址,这个下一跳地址要拿在LDP邻居表里找哪个邻居有这个IP地址,FIB对应LDP中某一个邻居。

在LIB中找到邻居通告的标签,出标签为下一跳标签,入标签为我本地标签,本地标签和远程邻居标签做一个绑定,放在LFIB中去。

今后在收到带有标签的路由的时候都会从LFIB中找到对应标签进行转发。

LSP全Label Switch Path标签路径:在MPLS域内带标签的帧所传递经过的路径。

在MPLS环境内非常重视两个词:

  • 上游:离发送者近的就是上游。
  • 下游:连接网络的路由器离源近就是下游。

上下游是根据数据层面来定义。

下游路由器把数据一步一步发给上游,与此同时下游路由器把标签一跳一跳传递给上游,标签每传一跳上游都会形成对应的FIB。

三、基于华为讲MPLS

1、MPLS的环路检测

(1)、TTL环路检测:

  • 帧模式的MPLS中使用TTL
  • 信元模式的MPLS中无TTL

(2)、LDP环路检测机制:

  • 距离向量法
  • 最大跳数法

没有TTL报文会在环路中永无止境的发送下去。

数据帧送外界进入MPLS域TTL有两种处理模式:

  • 正常:会把IP报头中TTL值复制到标签报头中去。(特点:不对外隐藏MPLS域内的结构,出环可以丢弃)
  • 无视你原本三层报头的TTL值,我一律设置为255。(特点:对外隐藏内网结构,外界不会感知MPLS域,不利消环路)

华为命令:

【sw】mpls

【sw-mpls】undo ttl propagate public(对外隐藏内网结构)

 2、LDP环路检测

默认启用LDP不会防环,有两种方法可以:

(1)、LDP路径校量法:会在LDP标签请求和标签通告报文中携带两种TLV,一个叫路径矢量TLV,一个叫路径限制TLV,都是用来检测环路。

设置两个东西:

  • 一个LDP有多少跳:限制最大传输跳数。
  • 记录每一台路由器的ID:收到包含自己的路由ID通告就会丢弃。

(2)、最大跳数法:单纯设置最大跳数。

都涉及到TLV长度类型值,环路产生的根因是IGP出环。

华为启用LDP命令:

进入LDP配置模式敲loop-detect敲完可以通告hops-count设置跳数,通过path-voctors来设置路径向量。

华为得先启用LDP再去接口激活。

3、LDP协议原理

LDP为TDP的升级版

LDP三个动做:

  • LDP根据路由条目形成标签叫标签分发(产生标签关联路由条目)
  • 产生的标签通告给邻居路由器叫标签通告
  • 通告邻居接收到标签得放到LIB中去,这个叫标签保持。

这三个动作每个都有两种模式

cisco使用LDP会针对路由表里BGP路由以外的任何路由进行标签分发。

华为 使用LDP会针对路由表里BGP路由以外的任何路由进行标签分发,分发标签时默认只会针对主机路由(主机路由:32位掩码),需要激活功能,在华为中PE之间路由必须32位(PE之间环回口建邻居32位)

Cisco接口启用LDP,周期性通过接口发hello,transport address传输地址,默认传输地址都是路由器ID地址。

建邻居先是通告UDP发组播报文,再通告TCP建立三次握手(谁的传输地址大,谁主动发起TCP三次握手),最终完成建立。目的端口为731或646,传输地址大的是就是随机端口。

LDP建邻居分为两种
  • 直连建邻居
  • 非直连建邻居

LDP报文:4大类
  • Discovery message发现消息:宣告和维护网络中的一个LSR的存在。
  • Session message:建立、维护和终止LDP peers之间的LDP Session。
  • Advertisement message通告和请求标签:生成、改变和删除FEC的标签映射。
  • Notification message:宣告告警和错误信息。

        

LDP封装

前面IP报头|tcp和udp|ldp具体封装

具体封装分为两个部分:

一是报头10字节LDP Header,3个子字段:

  • version版本
  • PDU length,PDU的长度
  • LDP Identifier,LDP的路由器ID(6个字节,前4个字节是路由器ID,后两个字用来描述你的标签空间,标签空间有两种默认使用第一种(1)、路由器空间:关于一条路由你只会形成一条标签(2)、接口空间:同一条路由关于每一个接口所形成的标签是不一样的。)

一个是长度可变的载荷

LDP版本1

载荷:

  • U未知报文识别位:通常置零。
  • Type类型:描述是哪种报文,hello。。。。。。
  • Message Length消息长度:描述多少字节。
  • Message ID报文ID:类似LSA的link statckID,用来唯一标识一个报文。
  • Mandatory Parameters:强制添加的属性。
  • Optional Parameters:可选属性。
LDP消息作用

1、Discovery Message包含:

  • hello报文:目的地应该是组播224.0.0.2,源地址是传输地址可以改,默认使用的是路由器ID的地址。

2、Session Message包含:

  • Initialization初始化报文:当双方了解对方地址建立TCP三次握手,当TCP三次握手建立完毕之后就是给对端发送初始化的报文,来协商参数,类似于BGP中的Optin。这种报文发一次就够,我给你发这个包含了我LDP中的很多参数。你给我发也包含很多参数,你和我的参数做一个匹配,成功就给你发KeepAlive。
  • KeepAlive:用来做Initialization的缺认。这个是周期性发送的,检测连接是否完好。

3、Advertisement Message包含:

  • Address:地址信息。
  • Address Withdraw:地址撤销,取消之前我通告的某些地址。
  • Label Mapping:LDP发送。
  • Label Request:请求标签映射发这个。

LDP的防环添加TLV就是在(3)和(4)之间添加TLV。

  • Label Abort Request撤销请求:给你发了一个请求,对方迟迟不给更新,不想请求就发这个。
  • Label Withdraw标签撤销:之前通告的标签映射不可用了,就通告这个告诉你标签不可用了请你删除。
  • Label Release标签释放:通告邻居收到的标签不想要了,就要发这个给邻居,告诉邻居你之前给我发的标签我已经删了。

3、Notification Message:

  • Notification:用来报错。
LDP发现机制(邻居建立)两种
  • 基本发现机制:发现直连连接在同一链路上的LSR邻居。(两两直连建立邻居,双方交互完TCP的hello后直接建立邻居,路由器ID小的就是端口646)图例:

  • 扩展发现机制:发现非直连的LSR邻居。(指neighbor单播建立)

建立好邻居后发Initialization报文路由器ID大的发这个(ID大的叫主动方,ID小的叫被动方),图例:

路由器ID大的发Initialization,然后路由ID小的回应Initialization加一个KeepAlive,路由器ID大的一方收到没问题再给你回应KeepAlive。完成4个报文交互,邻居就建立好了。

参数不匹配就发生Notification,断开邻居建立。

华为启用MPLS命令:

建立远端邻居,建议使用路由器ID建立:

LDP状态机(邻接关系集):

5种邻接关系:

  • NON EXISTENT邻接关系不存在:交互完hello,建立完了TCP三次握手就到达了INITIALIZED。
  • INITIALIZED:双方不是对等的,谁的传输地址大,谁就是主动端,主动发送Initialization,发完后进入OPENSENT。被动端因为什么也不能发依旧会停留在这个阶段。
  • OPENSENT:主动端发完进入这个模式。
  • OPENREC:被动端和主动端参数协商没问题就会发Initialization和KeepAlive然后进入OPENREC这个模式。等待主动端回应KeepAlive,收到主动端回应的KeepAlive最终进入到OPERATIONAL。
  • OPERATIONAL:最终阶段。
LDP的标签空间:

两种:

  • 基于平台的空间(或叫基于路由器)

  • 基于接口的

一台路由器关于FEC我是否会产生一个标签,如果是产生一个标签那就是基于路由器的(或叫基于平台的,不浪费标签)。如果基于每一个接口都形成一个独立的关于FEC的标签这个就是基于接口的(标签数量多,维护麻烦,但是提升了安全性)。默认使用基于平台的。

LDP标签分发:

标签通告分为两种:

  • DU全按需通告:

cisco华为默认都是这个,DU是不管邻居有没有给我发标签请求我只要形成了标签映射对就给你通告。

  • DUD自由通告:

DUD指我本地形成了关于路由的标签之后,我不给你发,等待邻居给我发标签通告请求,收到请求后根据你们标签请求的映射给你发送。

标签分发分析

Lsp-lrigger none 这个none是不分发任何标签。

Lsp-lrigger host只针对路由表中的主机路由进行标签分发。

标签3是特殊标签叫隐式空标签:告诉邻居你们使用该路由转发数据给我的时候直接做一个标签弹出就可以,(最后一跳路由器和倒数一跳路由器不是指路由器,是指路由最后一跳,直连路由是,边界路由器外网路由)

0叫显式空标签:让标签变为0,一台路由器收到位0的空标签不用查找LIB也可以立即把标签去除然后查找FIB可以形成PHP次末跳标签弹出。3用的多效率高。

LDP标签控制Independent:标签分发,当一台路由器拥有了IGP之后,产生标签的一个过程,分为两种:

  • Independent独立:指一台路由器拥有了IGP路由之后,我不管邻居有没有把关于这条路由的标签给我通告,我都会立即本地去形成关于这个路由条目的标签。
  • Orderd有序的:指我收到一条路由,我想要形成关于这条路由的标签是有前提的,前提是我必须通过给我通告路由的下游邻居收到这个标签。(关于这条路由有了出标签才会形成入标签)

cisco是基于独立的,华为是基于有序的。

LDP标签保持

分为两种:

  • Conservative保守:很多LDP邻居大家都有相同路由,只有是我这个邻居是关于这个路由条目下游的下一跳的时候你给我发的标签我还会保持,与我不相干的邻居发给我的标签我是不接受的。(LDP很简洁,除了本地标签就是真实下一跳的邻居给我通告的标签,节约LDP的资源,缺点是收敛慢)
  • Libral自由的:别人给发我就记录,用哪个还是要根据我的FIB路由的下一跳找到正确的邻居,下游邻居通告的标签我才会放到LFIB作为出标签使用。

Cisco和华为都默认是libral自由的模式。

PHP导出第二眺弹出

跟路由器没关系,跟路由有关系,对于一台路由器你的路由是最后一跳(最后一跳路由:直连路由、域外的路由),你的邻居就是倒数第二跳。

可以要求使用0或者3。

0是显式空标签:

隐式空标签:label advertise inplicit-null

关闭PHP功能:

 

做了PHP的话Qos到了倒数第二跳就失效了,最后一跳没有报头了,没办法缺人哪一类。

四、LDP实验

R2和R4是EBGP,R2和R3是IBGP,R3和R5是EBGP,R1没有运行BGP,R4到R5必须要经过1所以会丢包,R1和R2和R3运行MPLS解决丢包(BGP和MPLS配合有一个原则: R2收到R4访问R5的流量他发现要通告BGP路由来转发,但是要转发这个报文出接口的一个MPLS域内接口,BGP本身是没有标签的,要解决黑洞问题他就会查看BGP路由对应的IGP路由下一跳路由的标签(BGP路由一般是通过IGP获悉,运行OSPF获悉BGP路由下一跳地址)这个路由因为有LDP存在所以有标签映射,MPLS结合BGP解决的方式就是:一台路由器使用一条BGP路由来转发从外到内的报文时会针对这条BGP的下一跳地址去查询相对应的IGP路由使用IGP所对应的出标签去封装数据,R2发数据给R1的时候也携带一个标签是关于3.3.3.3这条IGP标签的路由,R1收到会认为要去往R3环回口有路由,查LFIB后会给你完成一个标签的弹出,去掉标签发送给R3,R3也运行BGP他有路由,一看目的地是R5就给他转发走了。

R1配置:

  • Loopback0 :1.1.1.1 255.255.255.0 ip ospf network point-to-point
  • Ethernet 0/1:13.1.1.1 255.255.255.0
  • Ethernet 0/0:12.1.1.1 255.255.255.0
  • R1(config)#router ospf 110
  • R1(config-router)#router-id 1.1.1.1
  • R1(config-router)#network 1.1.1.1 0.0.0.0 area 0
  • R1(config-router)#network 13.1.1.1 0.0.0.0 area 0
  • R1(config-router)#network 12.1.1.1 0.0.0.0 area 0

R2配置:

  • Loopback 0:2.2.2.2 255.255.255.0 ip ospf network point-to-point
  • Ethernet 0/1 :12.1.1.2 255.255.255.0
  • Ethernet 0/0:24.1.1.2 255.255.255.0
  • R2(config)#router ospf 110
  • R2(config-router)#router-id 2.2.2.2
  • R2(config-router)#network 2.2.2.2 0.0.0.0 area 0
  • R2(config-router)#network 12.1.1.2 0.0.0.0 area 0

R3配置:

  • Loopback 0:3.3.3.3 255.255.255.0 ip ospf network point-to-point
  • Ethernet 0/0:13.1.1.3 255.255.255.0
  • Ethernet 0/1:35.1.1.3 255.255.255.0
  • R3(config)#router ospf 110
  • R3(config-router)#router-id 3.3.3.3
  • R3(config-router)#network 3.3.3.3 0.0.0.0 area 0
  • R3(config-router)#network 13.1.1.3 0.0.0.0 area 0

R4和R5创建环回口

R4配置:

  • Loopback 0:4.4.4.4 255.255.255.0
  • Ethernet 0/1:24.1.1.4 255.255.255.0

R5配置:

  • Loopback 0:5.5.5.5 255.255.255.0
  • Ethernet 0/0:35.1.1.5 255.255.255.0

启用LDP:

R1:前提是启用CEF,全局模式命令:

  • R1(config)#ip cef (启用CEF)
  • R1(config)#mpls ip (开启MPLS的功能)
  • R1(config)#mpls label protocol ldp(使用LDP作为标签分发协议给IGP、静态、直连分发标签)
  • R1(config)#mpls ldp router-id loopback 0 force(force是强行指定loopback 0口为路由器ID)

接下里就是接口模式命令:

进入Ethernet0/0-1

  • R1(config-if-range)#mpls ip(一语双关,即在接口启用MPLS的数据功能,又在接口宣告LDP进程)

R2:

  • R2(config)#ip cef
  • R2(config)#mpls label protocol ldp
  • R2(config)#mpls ldp router-id loopback 0 force
  • 进入ethernet0/1,不要在连接外网接口启用
  • R2(config-if)#mpls ip

R3:

  • R3(config)#ip cef
  • R3(config)#mpls ip
  • R3(config)#mpls label protocol ldp
  • R3(config)#mpls ldp router-id loopback 0 force
  • 进入ethernet0/0
  • R3(config-if)#mpls ip

ldp也会建立邻居,show mpls ldp neighbor可以看到邻居

看LIB:show mpls ldp bindings

看LFIB:show mpls forwarding-table

看CEF形成的FIB:show ip cef,看每条路由的标签用:show ip cef detail

操控TTL模式:

R3(config)#mpls ip propagate-ttl(收到从内到外报文的时候,我的标签头TTL值和你三层报头之间有关联,如果是no mpls ip propagate-ttl 那就是不管你原始报文TTL是几都会给你添加一个255的TTL)

MPLS中不能存在no mpls ldp advertise-labels这条命令,不会为任何路由分发标签。

运行BGP

R4配置:

  • R4(config)#router bgp 4
  • R4(config-router)#no auto-summary
  • R4(config-router)#no synchronization
  • R4(config-router)#bgp router-id 4.4.4.4
  • R4(config-router)#neighbor 24.1.1.2 remote-as 10
  • R4(config-router)#network 4.4.4.0 mask 255.255.255.0

R5配置:

  • R5(config)#router bgp 5
  • R4(config-router)#no auto-summary
  • R4(config-router)#no synchronization
  • R4(config-router)#bgp router-id 5.5.5.5
  • R4(config-router)#neighbor 35.1.1.3 remote-as 10
  • R4(config-router)#network 5.5.5.0 mask 255.255.255.0

R2配置:

  • R2(config)#router bgp 10
  • R2(config-router)#no auto-summary
  • R2(config-router)#no synchronization
  • R2(config-router)#bgp router-id 2.2.2.2
  • R2(config-router)#neighbor 24.1.1.4 remote-as 4
  • R2(config-router)#neighbor 3.3.3.3 remote-as 10
  • R2(config-router)#neighbor 3.3.3.3 update-source loopback 0(修改更新源地址)
  • R2(config-router)#neighbor 3.3.3.3 next-hop-self

R3配置:

  • R3(config)#router bgp 10
  • R3(config-router)#no auto-summary
  • R3(config-router)#no synchronization
  • R3(config-router)#bgp router-id 3.3.3.3
  • R3(config-router)#neighbor 2.2.2.2 remote-as 10
  • R3(config-router)#neighbor 2.2.2.2 update-source loopback 0
  • R3(config-router)#neighbor 2.2.2.2 next-hop-self
  • R3(config-router)#neighbor 35.1.1.5 remote-as 5

show:R5,show bgp ipv4 unicast看bgp路由:

这个时候R4ping 5.5.5.5 source 4.4.4.4 可以通

R4:traceroute 5.5.5.5 source 4.4.4.4

通的原理:并不是因为BGP会给路由分发标签,就算分发了标签R1没有运行BGP也没标签没意义,IPv4环境中MPLS针对BGP提供服务:路由器收到从内到外报文,只要你需要使用BGP路由转发,我就会根据BGP路由下一跳地址所对应的IGP路由标签来做一个出标签的封装。

五、MPLS VPN(核心)

对等体到对等体的VPN,大量配置在PE路由。

特点:PE要为CE维护路由,PE和CE建立某种连接关系,可以是IGP也可以是BGP。

问题:一台PE可能要为多个客户提供服务,客户内网是私有路由,PE收到了在哪里保存路由?

为了实现对等体到对等体VPN必须要解决PE存放CE路由的问题:针对每一个客户单独创建一张独立的路由表,使用独立的路由表存放你的所有路由。(优点:1、公网和私网路由不用混在一起 2、做客户间的路由区分)

解决步骤:

1、在PE路由器创建VRF全Virtual Routing Forwarding 虚拟路由转发,一个VRF可以理解为是一个MPLS VPN中的一个实例,创建一个VRF相当于路由器产生一张相对独立的VRF路由表(VEF路由表),针对每一个客户创建一个VRF(VRF根据客户名称命名)VRF名称只具有本地意义。

2、CE路由存放:VRF的使用,之间在PE上把连接CE的接口和VRF关联,通过这个接口在控制层面接收路由的时候会直接把路由加载入VRF路由表,并且只会把VRF的路由通过这个接口发送给客户。数据层面通过这个接口收到流量转发的时候也是使用这个VRF路由表进行查询然后进行精确转发。

3、如何把路由发给另外一个PE:VRF路由没办法通过运行商的IGP发送,这时在X和Y之间建立一个BGP的邻居,并且是MP-BGP邻居是VPNv4邻居专门帮PE路由器来发送VRF路由的工具。

过程:

PE把VRF私网路由先加入BGP的VPNv4的BGP表中,再给邻居发走,这个时候就出现了问题,一张VPNv4BGP表就一张,VRF表有多张,这个时候通过对私网路由进行加工,让它们产生区别,加工时每个VRF必须设置一个RD全Route Distinguishhers路由区分服务,不同VRF的RD是绝对不能一样的,RD有64bit当你这台路由器和其它PE建立好VPNv4邻居之后,你要把你VRF路由表中的路由转化成BGP的VPNv4(VPNv4路由就是添加了RD的路由)路由加入BGP表中去,没有RT的RD只具有本地意义,除了RD以外VPNv4还需要携带一个参数RT全Route Targets路由目标,RT就是BGP中的扩展团体属性,RT的存在只有一个目的就是让你PE路由器收到公网传递过来的VPNv4路由你能知道这个路由加入哪张VRF路由表。

RT在实现的时候有两种操作:(这个操作是在VRF中定义的)

(1)、导入:当你收到VPNv4路由之后将带有什么RT的路由加入本VRF路由表。

(2)、导出:当你把VRF路由加入VPNv4BGP表中你要携带哪些RT值。

导出RT可以设置多个,导入RT也可以设置多个。

VPNv4路由:就是携带了RD和RT的这种私网路由,通过BGP携带。

VPNv4路由传递流程:客户的路由器收集了私网路由之后,通过某种协议传递给PE(协议可以是IGP也可以是BGP),传递好之后由于PE连接CE接口是和VRF关联着,收到的所有路由都是加入VRF路由表,PE之间要建立VPNv4BGP邻居(或者在运营商内网找一台RR,让RR进行路由反射,这样做的时候不要让RR参与数据层面的转发因为控制层面消耗过大数据层再转发就会出现问题。),PE收到路由之后,路由加入VRF路由表,接下来PE把这些路由转化为VPNv4路由加入VPNv4的BGP表中去这个过程中我会给路由器打上RD,根据导出的相关设置我会给路由器打上相关的RT属性,路由发送给对端PE之后。对端PE收到会根据对端的导出和本地的导入来决定什么样的RT路由加入哪张VRF路由表。

客户给发的就是纯粹的IPv4报文,PE路由器通过这个接口收到之后由于通过VRF接口收到就会查找VRF对应的路由进行转发,需要添加标签进行封装,内网路由器会认为是发给另外一个边界的,另外一个边界有一个难题,收到这个报文是通过公网接口收到的,收到之间会丢弃,需要解决一台PE收到另外一台PE发来的由我公网接口收到的,必须提示你查私网路由进行转发,这个时候光一重标签还不够,还得再添加一重标签,提醒你查找VRF表中路由的这么一个标签这个标签不再靠LDP而是靠BGP,普通BGP不会分发标签,只有BGPVPNv4进程才能分发标。

那么两重标签:

(1)、内层是BGP VPNv4路由标签

(2)、外层是下一跳地址IGP路由标签|VPNv4、

MPLS VPN实验:

MPLS控制层面就是路由传递,数据层面就是双重标签转发(内层标签是VPNv4路由VPNv4邻居给你发BGP路由的时候给你携带这个标签。外层标签)

之前的实验改造一下:

R2和R3把连接外网的接口干掉:

R2:

R2(config)#default interface ethernet 0/0

R2(config)#no router bgp 10

R3:

R3(config)#default interface ethernet 0/1

R3(config)#no router bgp 10

R4和R5作为客户也不运行BGP:

R4:

R4(config)#  no router bgp 4

R5:

R5(config)#no router bgp 5

PE和CE很多协议可以用,R2和R4之间运行BGP,R3和R5运行IGP。

R2和R3创建VRF:

R2:高级命令

R2(config)#vrf definition A

R2(config-vrf)#rd 10:10(指定RD,RD只具有本地意义)

R2(config-vrf)#address-family ipv4

R2(config-vrf-af)#route-target both 10:10,以VPNv4发走时携带10:10的RT(R2关于R4的导出必须是R3的导入,R3关于R5的导出必须是R2的导入)

连接CE的接口关联VRF:

R2进入Ethernet 0/0:

R2(config-if)#vrf forwarding A(敲这个命令这个接口的地址会自动消失,因为关联不同的路由表,直连接口就干掉了,先关联VRF再敲IP地址)

R2(config-if)#ip address 24.1.1.2 255.255.255.0

Show ip route connected,直连路由表没有24路由,因为变成VRF A中路由了show ip route vrf A

查子路由表pingR4得:R2#ping vrf A 24.1.1.4

R3:low的命令

R3(config)#ip vrf A

R3(config-vrf)#rd 10:10

R3(config-vrf)#route-target both 10:10

R3进入Ethernet 0/1

R3(config-if)#ip vrf forwarding A

R3(config-if)#ip address 35.1.1.3 255.255.255.0

R3#ping vrf A 35.1.1.3

R2:

R2(config)#router bgp 10

R2(config-router)#no auto-summary

R2(config-router)#no synchronization

R2(config-router)#bgp router-id 2.2.2.2

R2(config-router)#no bgp default ipv4-unicast

R2(config-router)#neighbor 3.3.3.3 remote-as 10

R2(config-router)#neighbor 3.3.3.3 update-source loopback 0

R2(config-router)#address-family vpnv4 unicast

R2(config-router-af)#neighbor 3.3.3.3 activate

R2(config-router-af)#neighbor 3.3.3.3 send-community extended(激活发送阔转团体属性功能)

发VPNv4路由给邻居下一跳会自动变更为我对邻居的跟新源。

Show run | section bgp 图:

没有IPv4邻居只有VPNv4邻居

R3:

R3(config)#router bgp 10

R3(config-router)#no auto-summary

R3(config-router)#no synchronization

R3(config-router)#bgp router-id 3.3.3.3

R3(config-router)#no bgp default ipv4-unicast

R3(config-router)#neighbor 2.2.2.2 remote-as 10

R3(config-router)#neighbor 2.2.2.2 update-source loopback 0

R3(config-router)#address-family vpnv4 unicast

R3(config-router-af)#neighbor 2.2.2.2 activate

R3(config-router-af)#neighbor 2.2.2.2 send-community extended(华为中不用敲,华为默认是这个,Cisco需要敲)

Show bgp vpnv4 unicast all summary(看邻居)

R4:(CE端,没有MPLS概念,没有VRF概念)

R4(config)#router bgp 4

R4(config-router)#no auto-summary

R4(config-router)#no synchronization

R4(config-router)#bgp router-id 4.4.4.4

R4(config-router)#neighbor 24.1.1.2 remote-as 10(建立普通邻居)

R4(config-router)#network 4.4.4.0 mask 255.255.255.0

R2:

R2(config)#router bgp 10

R2(config-router)#address-family ipv4 vrf A

R2(config-router-af)#neighbor 24.1.1.4 remote-as 4(建立VRF邻居)

R2(config-router-af)#neighbor 24.1.1.4 activate

Show bgp vpnv4 unicast vrf A summary(看邻居)

Show bgp vpnv4 unicast all

看路由明细:

Show bgp vpnv4 unicast all 4.4.4.0/24:

看标签明细:show bgp vpnv4 unicast all labels

R3上看这条19标签:为出标签:

R3:show bgp vpnv4 unicast all labels:

R3和R5建立一个OSPF:

R5:

R5(config)#router ospf 110

R5(config-router)#router-id 5.5.5.5

R5(config-router)#network 35.1.1.5 0.0.0.0 area 0

R5(config-router)#network 5.5.5.5 0.0.0.0 area 0

R3:运行VRF感知的OSPF

R3(config)#router ospf 35 vrf A

R3(config-router)#router-id 33.33.33.33

R3(config-router)#network 35.1.1.3 0.0.0.0 area 0

R3看路由:show ip route vrf A

进入loopback 0

R5(config-if)#ip ospf network point-to-point

R3这时收到路由是24位:

R3#show ip route vrf A

R3:

R3(config)#router bgp 10

R3(config-router)#address-family ipv4 vrf A

R3(config-router-af)#redistribute ospf 35 VRF A (把ospf重分发进别的协议想要重分发ospf外部路由加match)

Show bgp vpnv4 unicast all

R2可以收到:

Show bgp vpnv4 unicast all:

R3上重分发让R5收到路由:

R3:

R3(config)#router ospf 35 vrf A

R3(config-router)#redistrbute bgp 10 subnets(回向重分发)

R5:

Show ip route:

R4

Ping

5.5.5.5

Source

4.4.4.4

可以通

R4(config)#no ip domain lookup

R4#traceroute 5.5.5.5 source 4.4.4.4:

R2看标签:

Show bgp vpnv4 unicast all labels:

看外层标签,3.3.3.3的标签:

Show mpls forwarding-table:

R1只看外层认为是发给R3,做了PHP之后就剩一层标签,R3一看查vrf路由由于外部接口并没有启用MPLS,所以做了一个标签移除把包以ipv4形式发送给R5

R5:

R5(config)#no ip domain lookup

R5#traceroute 4.4.4.4 source 5.5.5.5:

说明R2关于4.4.4.4的标签也是19

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数通工程师小明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值