HCIP- ICT实战进阶ex1-MPLS
2023/5/21 14:22:22
本文主要是介绍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封装
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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享