HCIP- ICT实战进阶ex1-MPLS

发布时间 2023-05-21 11:51:14作者: Qurare

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封装

image-20230507102922795

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

MPLS数据报文结构

image-20230507103218434

报文内容 长度 说明
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报头

image-20230507104935307

靠近二层头部的称为顶层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的方向划分为上下游节点.

image-20230507105733422

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

1.3 MPLS基本体系结构

image-20230507163309853

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

    • 路由信息表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的两种方式:

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

image-20230507164911685

以上图为例, 首先在网络中运行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, 不需要交互控制报文, 因此资源开销小, 适合简单网络环境, 但是不能根据网络拓扑变化动态调整, 需要管理员干预.

image-20230507184552918

配置命令

  1. 对于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

  2. 对于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

  3. 对于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邻居发现

image-20230507213002482

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

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

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

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

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

标签发布方式

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

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

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

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

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

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

image-20230507214406289

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

image-20230507214717728

标签分配控制方式

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

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

    结合标签发布方式:

    • 独立+自主:

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

    • 独立+按需:

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

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

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

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

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

    • 有序+按需:

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

同样配一份图解:

image-20230507220419998

标签保持方式

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

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

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

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

  • 保守标签保持方式(Conservative)

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

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

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

2.4 LDP建立LSP的过程

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

image-20230507221540571

2.5 动态LSP

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

动态LSP的特点:

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

image-20230507205948445

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

配置命令

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

    mpls lsr-id 1.1.1.1
    

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

  2. 开启MPLS功能和LDP协议

    mpls
    mpls ldp
    
  3. 在物理接口上开启MPLS功能和LDP协议

    int g0/0/0
    	mpls
    	mpls ldp
    

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

  4. 验证MPLS

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

    int loop3
    	mpls ldp transport-address
    
  6. 建立远端邻接体

    mpls ldp peer-remote test	#邻接体命名
    peer-remote 172.16.1.2		#邻接体地址
    
  7. 弹出的标签信息

    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网络中, 数据包在每台路由器上根据已分配的标签进行标签封装和转发;

image-20230508084213945

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

先是标签分发:

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

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

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

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

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

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

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

image-20230508084243744

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字段.

image-20230508090512043

缺省情况下, 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模式.

image-20230508091609171

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

配置命令

修改TTL模式

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

4 MPLS解决BGP路由黑洞

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

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

image-20230521103223389

在上述拓扑中, 可以看到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届的实习岗已经陆续放出了, 一边是要去准备面试相关的东西, 一边又要经常去海拉鲁出差, 希望我能平衡好时间吧.