HCIP- ICT实战进阶ex1-MPLS
0 前言
在早年设备性能低下的时期, 路由表查询速度不高导致转发性能低下, 旨在提高路由器转发速度的MPLS(Multi-Protocol Label Switching, 多协议标签交换)被提出, 与传统IP路由方式相比, MPLS在数据转发时, 只在网络边缘分析IP报头, 在网络内部采用更为高效的标签(Label)转发, 节约了处理时间。
VPN(Virtual Private Network, 虚拟私有网络)、流量工程、QoS(Quality of Service, 服务质量)等新兴应用中得到青睐. 同样, MPLS也是医治BGP黑洞的一剂良药。
1 MPLS概述
MPLS(Multi-Protocol Label Switching, 多协议标签交换)是一种IP骨干网技术, MPLS在无连接的IP网络上引入面向连接的标签交换概念, 将第三层路由技术和第二层交换技术相结合, 充分发挥了IP路由路径选择的灵活性和二层交换mac转发的简洁性。
MPLS并非一种业务或者应用, 它实际上可以看做一种隧道技术, 这种技术不仅支持多种高层协议与业务, 而且在移动程度上可以保证信息传输的安全性。
1.1 MPLS报文
MPLS封装
一或多个MPLS头部, 然后再封装一个二层报头, 可以将它称为"2.5层协议"
MPLS数据报文结构
报文内容 | 长度 | 说明 |
---|---|---|
Label(标签头部) | 20bit | 唯一标识去往同一目的地址的报文分组, 只有本地意义 |
Exp | 3bit | 扩展位, 现通常为CoS(Class of Service), 在设备阻塞时发送优先级高的报文 |
S | 1bit | 栈底标识, MPLS为多层标签, S=1表示为最底层标签, 即最靠近IP报头的那个MPLS头部 |
TTL | 8bit | 同IP报文中的TTL |
标签类型 | 取值范围 | 说明 |
---|---|---|
特殊标签 | 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网络中转发, 那么二层报头的上层协议类型应该为MPLS协议
- 如果二层为以太网协议, 则MPLS协议的标签为type=0x8847
- 如果二层为PPP协议, 则MPLS协议的标签为type=0x8281
- 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)。
当IP报文进入MPLS网络时, MPLS入口的LER分析IP报文内容并且为这些IP报文添加上合适的标签, 以供核心LSR根据标签进行转发; 当IP报文离开MPLS网络时, 出口LER会弹出标签。
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
转发等价类FEC(Forwarding Equivalence Class). 属于相同FEC的报文在转发过程中被LSR相同方式处理。
举个例子, 在传统IP转发中, 到同一条路由的所有报文就是一个转发等价类, 这就是基于目的地址的一个分类。
2 LSP建立
- 静态LSP: 同手工配置的方式为各个FEC分配标签, 并建立转发隧道
- 动态LSP: 通过标签发布协议动态建立转发隧道
- 如果是动态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发送。
总结: 标签Label自下游向上游发送, 数据自上游向下游转发
2.1 静态LSP
特点:
- 静态LSP是用户通过手工为各个FEC转发等价类分配标签Label而建立的, 由于静态LSP各节点上不能互相感知到整个LSP 的情况, 因此静态LSP是一个本地概念.
- 静态LSP不使用标签发布协议LDP, 不需要交互控制报文, 因此资源开销小, 适合简单网络环境, 但是不能根据网络拓扑变化动态调整, 需要管理员干预.
配置命令
-
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
-
static lsp egress test incoming-interface g0/0/0 in-label 200
创建名为test的静态lsp, 与上游设备连接的接口是g0/0/0, 入标签为200
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.2 标签分发协议LDP
LDP(Label Distribution Protocol, 标签分发协议)是多协议标签交换MPLS的一种控制协议, 相当于传统网络中的信令协议, 负责转发等价类FEC的分类、标签分配以及标签交换路径LSP的建立和维护, LDP规定了标签分发过程中的各种情况以及相关处理。
目前, LDP作为一种应用层协议(TCP/UDP port = 646), 广泛应用在VPN服务上, 具有组网、配置简单、支持基于路由动态建立LSP、支持大容量LSP等特点。
2.3 LDP的基本概念
LDP对等体
相互之间存在LDP会话且用LDP交换标签信息的两台LSR, LDP对等体通告它们之间的LDP会话获得对方的标签。
LDP邻接体
LDP的邻接体存在两种类型:
-
本地对等体(Local Adjacency): 以组播形式(224.0.0.2)发送Hello消息发现的邻接体为本地邻接体, 这是默认模式, 这里Hello报文的发送周期为5s, 老化时长为15s.
- 远端邻接体(Remote Adjacency): 以单播形式发送Hello消息发现的邻接体称为远端邻接体, 这里Hello报文的发送周期为15s, 老化时长为45s.
LDP会话
LDP会话用于LSR之间交换标签映射、释放等信息, 只有存在对等体才能建立LDP会话, LDP会话同样分分为两种类型:
-
本地LDP会话(Local LDP Session): 建立会话的两个LSR之间是直连的, 使用keepalive消息维持;
- 远端LDP会话(Remote LDP Session): 建立会话的两个LSR之间可以是直连的, 也可以是非直连的, 使用keepalive消息维持.
LDP消息类型
LDP协议主要使用四类消息
消息类型 | 作用 | 举例 | 协议 |
---|---|---|---|
发现(Discovery) | 通告和维护网络中LSR的存在 | Hello消息 | UDP |
会话(Session) | 建立、终止和维护LDP对等体之间的会话 | Initialization消息、keepalive消息 | TCP |
通告(Advertisement) | 创建、改变和删除FEF的标签映射 | Label Mapping Message消息 | TCP |
通知(Notification) | 提供建议性消息和差错通知 | TCP |
LDP邻居发现
-
LSR-ID大的一方发起TCP三次握手建立TCP连接;
-
如果协商失败或者会话期间出现错误则会直接回复一个notification消息, 并终端LDP会话。
标签发布方式
-
下游按需方式DoD(Downstream on Demand):
如下图所示, 对于目的地址为192.168.1.1/32的FEC, 上游(Ingress)向下游发送标签请求消息, 下游(Egress)收到标签请求消息后, 才会向上游发送标签映射消息。
下游自主方式DU(Downstream Unsolicited):
(默认模式)。
标签分配控制方式
-
独立+自主:
-
独立+按需:
-
有序标签分配控制方式(Ordered):
(默认模式)
有序+自主(默认模式):
-
有序+按需:
独立标签分配控制方式(Independent):
结合标签发布方式:
同样配一份图解:
标签保持方式
LSR收到的标签映射可能来自下一跳邻居, 也可能来自非下一跳邻居。
-
保守标签保持方式(Conservative)
自由标签保持方式(Liberal)(默认模式)
目前支持的标签发布方式+标签控制方式+标签保持方式:
-
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, 网络拓扑发生变化时, 能及时反映网络状况.
配置命令
-
mpls mpls ldp
-
在物理接口上开启MPLS功能和LDP协议
int g0/0/0 mpls mpls ldp
没了, MPLS的基本配置就123这么简单
-
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 #表示当前设备使用正常标签弹出机制, 标签为正常数值
在设备上设置MPLS LSR-ID信息
mpls lsr-id 1.1.1.1
该LSR-ID默认情况下会被作为传输地址使用, 请确保这个地址能被MPLS内的设备ping通。
3 MPLS转发
3.1 MPLS转发的基本概念
MPLS标签基本操作
标签转发的基本操作类型分为三种: 压入(Push)、交换(Swap)和弹出(Pop)
-
Push: 当IP报文进入MPLS域时, MPLS边界设备在报文二层首部和IP首部之间插入一个新的MPLS报头, 其中包含有新的标签; 或者核心LSR根据需要在标签栈顶增加一个新的标签(即标签的嵌套封装);
- Swap: 当报文在MPLS域内转发时, 根据标签转发表, 用下一跳分配的标签, 替换MPLS报文的栈顶标签;
- Pop: 当报文离开MPLS域时, 将MPLS报文的标签剥离.
MPLS数据转发过程
先是标签分发:
- 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在收到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, 倒数第二跳弹出)
默认情况下设备支持PHP特性, 支持PHP的Egress节点的标签值为3(即特殊标签值)
此时RTD的out label可能是特殊标签, 也可能是动态标签。
MPLS的TTL处理模式
Uniform模式
- 在入节点, IP TTL减1映射到MPLS TTL字段, 此后报文在MPLS网络中按照标准的TTL处理方式.
- 在出节点, 将MPLS TTL减1后映射到IP TTL字段.
Pipe模式
Pipe模式(管道模式)被提出了
- 在入节点, IP TTL值减1, MPLS TTL字段为固定值, 此后报文在MPLS网络中按照标准的TTL方式处理. 在出节点会将IP TTL字段减1, 即IP分组经过MPLS网络时, 无论MPLS内部经过多少跳, IP TTL只会在入节点和出节点分别减少1
- 在MPLS VPN应用中, 处于对网络安全的考虑, 需要隐藏MPLS骨干网络结构, 这种情况下, 对于私网报文, Ingress上使用Pipe模式.
配置命令
修改TTL模式
undo ttl propagate #pipe模式
ttl propagate #uniform模式
4 MPLS解决BGP路由黑洞
BGP路由黑洞问题我在之前的博客有介绍过: HCIP-ICT实战进阶06-BGP基础, 想要回顾可以去瞄一眼
BGP路由黑洞: BGP能跨设备传递路由, 但数据转发需要逐台设备, 一旦网络路径上有设备未开启BGP, 就会导致需要该设备转发的数据被丢弃
MPLS解决方案: 在AS200中启用MPLS
5 最后
这段时间被期末考和课设轮流轰炸, 所以这篇博客各个部分时间跨度还挺大的, 其实MPLS准确来说应当是HCIE的内容, 所以就当是提前准备HCIE了, 另外就是24届的实习岗已经陆续放出了, 一边是要去准备面试相关的东西, 一边又要经常去海拉鲁出差, 希望我能平衡好时间吧。