HCIP- ICT实战进阶ex1-MPLS

2023-07-29,,

HCIP- ICT实战进阶ex1-MPLS

0 前言

由于BGP设备之间是通过TCP协议实现的跨设备互联, 所以在两台BGP设备之间的其他设备是没有配置BGP协议的, 因此中间的其他设备很可能无法学习到BGP的路由信息(虽然可以通过静态引入或者路由协议引入, 但是会导致路由表大幅扩大), 引起数据丢失, 这种现象就称为BGP黑洞.

在早年设备性能低下的时期, 路由表查询速度不高导致转发性能低下, 旨在提高路由器转发速度的MPLS(Multi-Protocol Label Switching, 多协议标签交换)被提出, 与传统IP路由方式相比, MPLS在数据转发时, 只在网络边缘分析IP报头, 在网络内部采用更为高效的标签(Label)转发, 节约了处理时间.

随着硬件设备性能不断提升, MPLS在提高数据转发速度上的优势逐渐弱化, 但是其支持多层标签嵌套和设备内转控分离的特点, 使其在VPN(Virtual Private Network, 虚拟私有网络)、流量工程、QoS(Quality of Service, 服务质量)等新兴应用中得到青睐. 同样, MPLS也是医治BGP黑洞的一剂良药.

1 MPLS概述

MPLS(Multi-Protocol Label Switching, 多协议标签交换)是一种IP骨干网技术, MPLS在无连接的IP网络上引入面向连接的标签交换概念, 将第三层路由技术和第二层交换技术相结合, 充分发挥了IP路由路径选择的灵活性和二层交换mac转发的简洁性.

MPLS起源于IPv4, 但同样支持IPv6、IPX等多种协议.

MPLS并非一种业务或者应用, 它实际上可以看做一种隧道技术, 这种技术不仅支持多种高层协议与业务, 而且在移动程度上可以保证信息传输的安全性.

1.1 MPLS报文

MPLS封装

MPLS在数据链路层将网络层的报文进行封装, 在IP报头前增加一或多个MPLS头部, 然后再封装一个二层报头, 可以将它称为"2.5层协议"

MPLS数据报文结构

报文内容 长度 说明
Label(标签头部) 20bit 唯一标识去往同一目的地址报文分组, 只有本地意义
Exp 3bit 扩展位, 现通常为CoS(Class of Service), 在设备阻塞时发送优先级高的报文
S 1bit 栈底标识, MPLS为多层标签, S=1表示为最底层标签, 即最靠近IP报头的那个MPLS头部
TTL 8bit 同IP报文中的TTL

Label可以分为三类

标签类型 取值范围 说明
特殊标签 0 -> 15 意义特殊, 我在下边展开讲讲
静态标签 16 -> 1023 手工配置的MPLS标签
动态标签 1024 -> (10^20)-1 协议动态分配的MPLS标签

特殊标签:

0: 表示已经到了MPLS网络与IPv4网络边缘(如上图的RTD与RTE), 需要将标签剥离后转发进IPv4网络
1: 表示当前标签不做数据转发, 请采用下一层MPLS报头中的标签进行转发, 大概是处于安全性的考量
2: 标签0的IPv6版本
3: 表示我的下一台设备是MPLS网络中的边界设备

MPLS报头

靠近二层头部的称为顶层MPLS标签, 靠近IP报头的称为底层MPLS标签.

如果是在MPLS网络中转发, 那么二层报头的上层协议类型应该为MPLS协议

如果二层为以太网协议, 则MPLS协议的标签为type=0x8847
如果二层为PPP协议, 则MPLS协议的标签为type=0x8281

如果是在IP网络中进行转发, 那么二层报头的上层协议类型应该为IP协议

IPv4的标签为type=0x0800
IPv6的标签为type=0x86DD

1.2 MPLS基本网络结构

MPLS基于标签进行转发, 进行标签交换和报文转发的网络设备称为LSR(Label Switching Router,标签交换路由器), 由LSR构成的网络区域称为MPLS域(MPLS Domain), 那些位于MPLS域边缘的LSR称为LER(Label Edge Router, 边缘路由器), 区域内部的LSR称为核心LSR(Core LSR).

MPLS是一种报文封装方式而非一种协议.

当IP报文进入MPLS网络时, MPLS入口的LER分析IP报文内容并且为这些IP报文添加上合适的标签, 以供核心LSR根据标签进行转发; 当IP报文离开MPLS网络时, 出口LER会弹出标签.

IP报文在MPLS我拿过来中经过的路径称为LSP(Label Switched Path, 标签交换路径), LSP是一个单向路径, 与数据流的方向一致, 如下图LSP的入口LER被称为入节点(Ingress), 位于LSP中间的LSR被称为中间节点(Transit), LSP出口的LER称为出节点(Egress); 根据LSP的方向, MPLS报文由Ingress发往Egress, 按照LSP的方向划分为上下游节点.

注: 其实很多三层交换机也支持MPLS

1.3 MPLS基本体系结构

控制平面: 负责产生和维护路由信息/标签信息.

路由信息表RIB(Routing Information Base): 由IP路由协议生成, 用于选择路由, 不负责转发;
标签分发协议LDP(Label Distribution Protocol): 负责标签的分配, 标签转发信息表的建立、标签交换路径的建立和拆除等工作;
标签信息表LIB(Label Information Base): 由标签分发协议生成, 用于选择路由.

转发平面: 即数据平面, 负责报文的转发.

转发信息表FIB(Forwarding Information Base): 通常初学者表达的路由表其实应该是这个, 从RIB提取必要的路由信息生成, 负责普通IP报文的转发;
标签转发信息表LFIB(Label Forwarding Information Base): 简称标签转发表, 由标签分发协议LDP在LSR上建立LFIB, 负责带有MPLS标签报文的转发,

注: 如果是普通IP网络中转发信息表FIB是直接由路由信息表生成, MPLS网络中的边缘设备LER才需要结合路由信息表RIB和标签分发协议LDP来生成转发信息表FIB

1.4 转发等价类FEC

MPLS将具有相同特征的报文归为一类, 称为转发等价类FEC(Forwarding Equivalence Class). 属于相同FEC的报文在转发过程中被LSR相同方式处理.

FEC可以根据源地址、目的地址、源端口、目的端口、VPN等要素进行划分.

举个例子, 在传统IP转发中, 到同一条路由的所有报文就是一个转发等价类, 这就是基于目的地址的一个分类.

2 LSP建立

建立LSP的两种方式:

    静态LSP: 同手工配置的方式为各个FEC分配标签, 并建立转发隧道
    动态LSP: 通过标签发布协议动态建立转发隧道

以上图为例, 首先在网络中运行OSPF用于建立路由信息库, 然后建立MPLS网络, 无论是静态还是动态网络, 对于去往X网络来说, RTA为入口节点, 是上游节点, RTD为出口节点, 是下游节点, RTB和RTC为核心LSR

如果是动态LSP, RTD会为前往X网络的FEC分配一个标签为D, 并将这个标签发送给RTC使用, 使得RTC想要去往X网络时, 能够直接将数据按照Label=D向RTD发送
如果是静态LSP, 则需要在RTC上配置去往X网络的标签为D, 使得RTC想要去往X网络时, 能够直接将数据按照Label=D向RTD发送

同理, 对于RTC而言, 它会向RTB发送一个去往X网络的标签C, 使得RTB想要去往X网络时, 能够直接将数据按照Label=C向RTC发送.

由于静态LSP的Label字段只有本地意义, 所以只需要本地的多个Label标签不重复就行, 比如上图可以B=C=D=100.

总结: 标签Label自下游向上游发送, 数据自上游向下游转发

2.1 静态LSP

类比静态路由, 静态LSP适合拓扑结构简单而稳定的网络环境

特点:

静态LSP是用户通过手工为各个FEC转发等价类分配标签Label而建立的, 由于静态LSP各节点上不能互相感知到整个LSP 的情况, 因此静态LSP是一个本地概念.
静态LSP不使用标签发布协议LDP, 不需要交互控制报文, 因此资源开销小, 适合简单网络环境, 但是不能根据网络拓扑变化动态调整, 需要管理员干预.

配置命令

    对于ingress

    static lsp ingress test	destination 100.1.1.0 24 nexthop 192.168.1.2 out-label 100

    创建名为test的静态lsp, 目的网络时100.1.1.0 24, 下一跳为192.168.1.2, 标签值为100

    对于transit

    static lsp transit test incoming-interface g0/0/0 in-label 100 nexthop 192.168.2.3 out-label 200

    创建名为test的静态lsp, 与上游设备连接的接口是g0/0/0, 入标签为100, 下一跳为192.168.2.3 , 出标签为200

    对于egress

    static lsp egress test incoming-interface g0/0/0 in-label 200

    创建名为test的静态lsp, 与上游设备连接的接口是g0/0/0, 入标签为200

2.2 标签分发协议LDP

LDP(Label Distribution Protocol, 标签分发协议)是多协议标签交换MPLS的一种控制协议, 相当于传统网络中的信令协议, 负责转发等价类FEC的分类、标签分配以及标签交换路径LSP的建立和维护, LDP规定了标签分发过程中的各种情况以及相关处理.

通过LDP协议, LSR可以把网络层的路由信息直接映射到数据链路层的交换路径上, 动态建立起网络层LSP.

目前, LDP作为一种应用层协议(TCP/UDP port = 646), 广泛应用在VPN服务上, 具有组网、配置简单、支持基于路由动态建立LSP、支持大容量LSP等特点.

思科私有的TDP协议为(TCP/UDP port = 711).

2.3 LDP的基本概念

LDP对等体

相互之间存在LDP会话且用LDP交换标签信息的两台LSR, LDP对等体通告它们之间的LDP会话获得对方的标签.

LDP邻接体

当一台LSR接收到对端发送来的Hello消息后LDP邻接体建立, 是对等体的前提.

LDP的邻接体存在两种类型:

本地对等体(Local Adjacency): 以组播形式(224.0.0.2)发送Hello消息发现的邻接体为本地邻接体, 这是默认模式, 这里Hello报文的发送周期为5s, 老化时长为15s.
远端邻接体(Remote Adjacency): 以单播形式发送Hello消息发现的邻接体称为远端邻接体, 这里Hello报文的发送周期为15s, 老化时长为45s.

LDP通过邻接体来威威虎对等体的存在, 对等体的类型取决于维护它的邻接体的类型, 一个对等体可以由多个邻接体来维护, 如果本地邻接体与远端邻接体两者来维护, 则对等体类型为本远共存对等体.

LDP会话

LDP会话用于LSR之间交换标签映射、释放等信息, 只有存在对等体才能建立LDP会话, LDP会话同样分分为两种类型:

本地LDP会话(Local LDP Session): 建立会话的两个LSR之间是直连的, 使用keepalive消息维持;
远端LDP会话(Remote LDP Session): 建立会话的两个LSR之间可以是直连的, 也可以是非直连的, 使用keepalive消息维持.

本地LDP会话和远端LDP会话可以共存, 这里两个keepalive的发送周期是15s, 老化45s老化

LDP消息类型

LDP协议主要使用四类消息

消息类型 作用 举例 协议
发现(Discovery) 通告和维护网络中LSR的存在 Hello消息 UDP
会话(Session) 建立、终止和维护LDP对等体之间的会话 Initialization消息、keepalive消息 TCP
通告(Advertisement) 创建、改变和删除FEF的标签映射 Label Mapping Message消息 TCP
通知(Notification) 提供建议性消息和差错通知 TCP

LDP邻居发现

    两台设备互相发送Hello消息, 携带有本设备的MPLS LSR-ID, 这个LSR-ID通常为设备对应接口的的源IP地址, 也叫传输地址(Transport Address);

    LSR-ID大的一方发起TCP三次握手建立TCP连接;

    建立完TCP连接后, 由LSR-ID大的一方发起会话初始化消息(Initialization)进行参数协商(LDP版本、标签发布方式、时间、标签分发空间和PDU长度), 对方如果同意则回复初始化消息并发送一个keepalive消息进行确认, LSR-ID大的一方收到对方Initialization消息并同意协商之后也会回复一个keepalive消息, 此时会话建立成功.

    如果协商失败或者会话期间出现错误则会直接回复一个notification消息, 并终端LDP会话.

    会话建立成功后则进入标签分发模式

标签发布方式

    下游自主方式DU(Downstream Unsolicited):

    对于特定的FEC, LSR无需从上游获得标签请求消息即进行标签分配与分发(默认模式).

    如下图所示, 对于目的地址为192.168.1.1/32的FEC, 下游(Egress)通过标签映射主机箱上游(Transit)通告自己的主句路由192.168.1.1/32的标签.

    下游按需方式DoD(Downstream on Demand):

    对于一个特定的FEC, LSR获得标签的请求消息之后才进行标签分配与分发.

    如下图所示, 对于目的地址为192.168.1.1/32的FEC, 上游(Ingress)向下游发送标签请求消息, 下游(Egress)收到标签请求消息后, 才会向上游发送标签映射消息.

具体可以看下图, 描述的还是比较详细的:

标签分配控制方式

独立标签分配控制方式(Independent):

本地LSR可以自主地分配一个标签绑定到某个FEC, 通告给上游LSR, 无需等待下游的标签

结合标签发布方式:

独立+自主:

LSR无需等待下游的标签, 会直接向上游分发标签

独立+按需:

发送标签请求的LSR的直连下游会直接回应标签, 而不必等待来自最终下游的标签

有序标签分配控制方式(Ordered):

对于LSR上某个FEC的标签映射, 只有当该LSR已经具有次FEC下一跳的标签映射时, 或者该LSR就是此FEC的出节点时, 该LSR才可以像上游发送次FEC的标签映射(默认模式)

有序+自主(默认模式):

LSR只有收到下游的标签映射消息, 才会向上游分发标签

有序+按需:

发送标签请求的LSR至来年的下游只有收到最终下游(Egress)的标签映射消息, 才会向上游分发标签.

同样配一份图解:

标签保持方式

标签保持方式制止LSR对收到的暂不需要的标签的处理方式.

LSR收到的标签映射可能来自下一跳邻居, 也可能来自非下一跳邻居.

自由标签保持方式(Liberal)(默认模式)

对于从邻居LSR收到的标签映射, 无论邻居LSR是不是自己的下一跳都保留, 在网络拓扑发生变化导致下一跳邻居改变时, LSR可以直接路由原来非下一跳邻居发来的标签快速重建LSP, 这种方法需要更多的内存和标签空间.

保守标签保持方式(Conservative)

对于从邻居LSR收到的标签映射, 只有的那个路径LSR是自己的下一跳时才保留, 在网络拓扑发生变化导致下一跳邻居改变时, LSR只保留来自原来下一跳邻居的标签, 所以重建LSP会比较缓慢, 但是可以节省内存和标签空间

目前支持的标签发布方式+标签控制方式+标签保持方式:

    DU+Ordered+Liberal(默认方式)
    DoD+Ordered+Conservative

2.4 LDP建立LSP的过程

    缺省情况下, 网络的路由改变时, 如果有一个边缘节点(Egress)发现自己的路由表中出现了新的主机路由, 并且这与路哟不属于任何现有的FEC, 则改白能源节点需要为这一路由建立一个新的FEC;
    如果MPLS网络中的Egress有可供分配的标签, 则为FEC分配标签, 并主动向上游发出标签映射消息, 标签映射消息中包含分配的标签和绑定的FEC等信息;
    Transit收到标签映射消息后, 判断标签映射的发送者(Egress)是否为该FEC的下一跳, 如若是, 则再起标签转发表中增加相应的条目, 然后主动向上游LSR发送对于指定FEC的标签映射消息.
    Ingress收到标签映射消息之后, 判断标签映射的发送者(Transit)是否为FEC的下一跳, 如若是, 则在标签转发表增加相应的条目, 这是完成了LSP的建立, 接下来就可以对该FEC对应的数据报文进行标签转发.

2.5 动态LSP

在现实网络中, 动态LSP应用更为广泛, 动态LSP通过LDP协议实现对FEC的分类、标签的分配以及LSP建立和维护的操作.

动态LSP的特点:

组网配置简单, 易于管理和维护;
支持基于路由动态建立LSP, 网络拓扑发生变化时, 能及时反映网络状况.

在动态LSP中, 由Egress根据路由表(图中由OSPF生成)自下而上向整条LSP分配Label

配置命令

    在设备上设置MPLS LSR-ID信息

    mpls lsr-id 1.1.1.1

    该LSR-ID默认情况下会被作为传输地址使用, 请确保这个地址能被MPLS内的设备ping通.

    开启MPLS功能和LDP协议

    mpls
    mpls ldp

    在物理接口上开启MPLS功能和LDP协议

    int g0/0/0
    mpls
    mpls ldp

    没了, MPLS的基本配置就123这么简单

    验证MPLS

    display mpls ldp session	#查看会话是否建立成功(会话), op为正常状态
    display mpls ldp lsp #查看LDP是否正常分配标签信息(标签数据库)
    display mpls lsp #查看当前设备LSP建立情况(转发表)

    修改传输地址

    int loop3
    mpls ldp transport-address

    建立远端邻接体

    mpls ldp peer-remote test	#邻接体命名
    peer-remote 172.16.1.2 #邻接体地址

    弹出的标签信息

    mpls
    label advertise impicit-null #表示当前设备开启倒数第二跳弹出机制, 标签为3
    label advertise expicit-null #表示当前设备开启最后一跳弹出机制, 标签为0或2
    label advertise non-null #表示当前设备使用正常标签弹出机制, 标签为正常数值

3 MPLS转发

3.1 MPLS转发的基本概念

MPLS标签基本操作

标签转发的基本操作类型分为三种: 压入(Push)交换(Swap)弹出(Pop)

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

MPLS数据转发过程

MPLS网络中, 数据包在每台路由器上根据已分配的标签进行标签封装和转发;

示例: 分析上图中数据包到达Egress节点的RTD上处理方式

先是标签分发:

    RTD为100.1.1.1/32分配了in标签1025, 并转发给了RTC
    RTC收到RTD的标签后将其设置为out标签, 根据这个标签有序地为100.1.1.1/32分配in标签1026, 并转发给RTB
    RTB收到RTC的标签后将其设置为out标签, 根据这个标签有序地为100.1.1.1/32分配in标签1027, 并转发给RTA
    RTA收到RTB的标签后将其设置为out标签

假如此时RTA连接了一台PC设备, 该PC设备ping 100.1.1.1/32

    RTA在收到ping的时候先是查找FIB表(转发信息表), 发现这个报文标签为null, 需要压入标签1027, 于是对报文push(1027);
    RTB收到ping报文, 检测到in label = 1027, 查标签转发表知道这个报文需要标签1026, 于是对报文swap (1026, 1027);
    RTC收到ping报文, 检测到in label = 1026, 查标签转发表知道这个报文需要标签1025, 于是对报文swap (1025, 1026);
    RTD收到ping报文, 检测到in label = 1025, 查标签转发表FIB表知道这个报文标签为null, 于是对报文pop();

如果MPLS域内流量很大, RTD的处理是否有存在不合理的地方?

PHP(Penultimate Hop Popping, 倒数第二跳弹出)

在倒数第二台设备将标签弹出, 使得Egress只需要查询FIB表而不用查看标签转发表, 减轻Egress的查表压力

默认情况下设备支持PHP特性, 支持PHP的Egress节点的标签值为3(即特殊标签值)

RTC的out label为3, 需要转发给Egress, 于是直接将标签pop弹出, 只保留IP报文信息并转发给RTD.

此时RTD的out label可能是特殊标签, 也可能是动态标签.

MPLS的TTL处理模式

MPLS对TTL的处理除了为了防止环路之外, 同时也实现了traceroute功能

Uniform模式

IP报文经过MPLS网络时:

在入节点, IP TTL减1映射到MPLS TTL字段, 此后报文在MPLS网络中按照标准的TTL处理方式.
在出节点, 将MPLS TTL减1后映射到IP TTL字段.

缺省情况下, MPLS对TTL的处理模式为Uniform.

Pipe模式

Uniform模式由于采用和IP一样的TTL处理模式, 所以很容易被黑客检测出内部的LSP路径, 处于安全考虑, Pipe模式(管道模式)被提出了

在入节点, IP TTL值减1, MPLS TTL字段为固定值, 此后报文在MPLS网络中按照标准的TTL方式处理. 在出节点会将IP TTL字段减1, 即IP分组经过MPLS网络时, 无论MPLS内部经过多少跳, IP TTL只会在入节点和出节点分别减少1
在MPLS VPN应用中, 处于对网络安全的考虑, 需要隐藏MPLS骨干网络结构, 这种情况下, 对于私网报文, Ingress上使用Pipe模式.

可以理解为: Uniform模式将两个TTL合并处理, Pipe模式将两个TTL分开处理.

配置命令

修改TTL模式

undo ttl propagate	#pipe模式
ttl propagate #uniform模式

4 MPLS解决BGP路由黑洞

BGP路由黑洞问题我在之前的博客有介绍过: HCIP-ICT实战进阶06-BGP基础, 想要回顾可以去瞄一眼

BGP路由黑洞: BGP能跨设备传递路由, 但数据转发需要逐台设备, 一旦网络路径上有设备未开启BGP, 就会导致需要该设备转发的数据被丢弃

在上述拓扑中, 可以看到BGP设备的连接情况: R1-EBGP-R2-IBGP-R5-EBGP-R6, 这四台设备上都有通过BGP学习到相互之间的路由, 但是在数据传输的过程中, 由于R3/R4并未开启BGP, 可能只有OSPF这样的IGP协议, 所以自然无法自动学习到R1和R6的地址, 会丢弃目的地址为R1和R6的数据包, 形成路由黑洞.

MPLS解决方案: 在AS200中启用MPLS

以AS100->AS300举例讲解: R2的BGP下一跳为R5, IGP下一跳为R3, 所以为R5分配一个标签值(假设3)给R3, 为R3分配标签值(假设为1024)给R2, 所以当R2需要向R5转发数据时, 查找LFIB表后push标签值为1024并转发给R3, R3push标签值3Bing转发给R5, 从而避免了R3丢弃数据包而造成的BGP路由黑洞.

5 最后

这段时间被期末考和课设轮流轰炸, 所以这篇博客各个部分时间跨度还挺大的, 其实MPLS准确来说应当是HCIE的内容, 所以就当是提前准备HCIE了, 另外就是24届的实习岗已经陆续放出了, 一边是要去准备面试相关的东西, 一边又要经常去海拉鲁出差, 希望我能平衡好时间吧.

HCIP- ICT实战进阶ex1-MPLS的相关教程结束。

《HCIP- ICT实战进阶ex1-MPLS.doc》

下载本文的Word格式文档,以方便收藏与打印。