• HCIP- ICT实战进阶ex1-MPLS


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

  • 相关阅读:
    springboot结合@Validated全局异常捕捉
    【k8s】1、基础概念和架构及组件
    LeetCode 0144. 二叉树的前序遍历:二叉树必会题
    为什么客户端和服务器不支持SSL协议
    java毕业设计图书个性化推荐系统mybatis+源码+调试部署+系统+数据库+lw
    狂砸40亿美元,亚马逊向OpenAI竞争对手Anthropic投资
    vulnhub靶场之CORROSION: 2
    高项论文整体结构(补充)
    CentOS安装Docker
    SpringBoot关闭Tomcat容器,SpringBoot使用Jetty容器
  • 原文地址:https://www.cnblogs.com/konjac-wjh/p/17418357.html