CCNP9:MPLS 虚拟网络专线 的【原理、配置】、MPLS的【原理、优化、配置】、MPLS解决BGP路由黑洞
一、MPLS(多协议标签交换):
我们之前说过一个AS内部在运行BGP协议时,如果有AS没有运行BGP协议,那么该设备的存在就会导致路由黑洞,因为在数据层面它没有路由。
为了更好的解决路由黑洞,我们就使用这个技术:MPLS
1、早期的MPLS:
有关名词:
包交换:依赖报文中的IP地址进行数据转发(基于3层IP地址进行路由)。
标签交换:在二层与三层的中间,人为的添加一个2.5层出来。之后路由器查看不再使用3层,而是基于2.5层进行转发(基于2.5层标签号路由)
在没有CEF技术的时候,假设当要去往1.1.1.0/24这个网段,它的标签号是17,去这个网段的出接口为F0/0,源、目MAC分别是X、Y。这些都需要MPLS自己解决,需要看路由器的路由表、ARP表,
早期的MPLS最初的意义是让中间的设备仅仅在于查一张表,这样能够相对较快,随着CPU的运算能力的不断提升,包交换方式从原始到传统(一次路由多次交换)、到最后的CEF快速的数据交换方式出现,MPLS在速度方面的优势已经完全没有了,几年之后它就在这方面被淘汰了。
但至于今天MPLS不但保留而且非常流行的原因是:MPLS在有些方面是不可以被替代的,它有以下主要应用:
①解决BGP的路由黑洞,运营商首先要考虑。
②实现MPLS 虚拟网络专线,它是所有 虚拟网络专线中最接近于专线的。
③做MPLS TE 流量工程
2、相关理论:
(1)现在的MPLS使用的前提是设备基于CEF工作:
是因为CEF有以下作用:
①启动CEF后,表格(二进制数)可以被ASIC(硬件芯片)直接调用
②CEF解决了递归问题,便于MPLS生成标签转发表格。
③CEF工作后生成FIB表,只有FIB可以存储标签表。
(2)控制层面:
这个我会一会儿详细的讲,现在只有脑海中留个印象就可以了。
用于交互路由信息(路由协议收敛),进行标签号的分发,就是为相应的路由分对应的标签。
(3)数据层面:
根据路由表转发用户数据报文,基于标签号进行数据转发,压入标签、弹出标签。
3、MPLS的基本工作原理:
(1)控制层面:
R4把去往B的路由给R3时(或者我们可以理解为通过IGP/EGP交互路由条目时),R3首先生成路由表,路由表生成之后就会生成ARP表。
接着CEF基于路由表解决了递归问题生成FIB表。然后 TDP(私有)/LDP(公有)基于CEF表格中的每一个目标网络号生成标签号,进而形成一张表格LIB表,最后将FIB表和LIB表相结合生成LFIB表。
总结一下这些表:
表 | 注解 |
---|---|
路由表 | 通过交互获取路由条目时,首先生成。 |
FIB表 | 转发信息数据库,这个一般情况下就有,由CEF基于路由表并解决递归生成。 |
LIB表 | 标签信息数据库(本地和邻居关于所有学习到的路由条目生成的标签号) |
LFIB表 | 标签转发信息数据库(LFIB=FIB+LIB),包含目标网络号、标签号、出接口、[源、目]MAC。 |
但是上面的FIB表不完整,我们知道R3会把去往B网段的路由还会发给R2,同理R2也会建立一张LFIB表,R2对于该网段也会生成一个标签,这里假设为20。
(2)数据层面:
那么对于完整的LFIB表来说,去往某网段,还应该包括进来的标签号,替换的标签号,出接口,新的源、目MAC。
例:R3的LFIB里记录了去1.1.1.0网段时,进来的标签号为20,出去替换的标签号为27,出接口,以及出接口的新的源、目MAC
这张图是A访问B的时候:
这样子做,R2、R3就比较省事只用查一张表,R1、R4是查两张表。
(3)MPLS工作过程总结:
当控制层面使用路由协议传递路由条目后,路由器上使用TDP/LDP为本地FIB表中每一条存在的路由条目均分配一个标签号,装载于LIB表中,同时传递给邻居。
LIB中还记录邻居传递到本地标签号,之后路由器基于本地FIB和LIB表生成LFIB(标签转发信息数据库——记录标签号的最佳路径对应关系)
数据层面工作时,第一跳路由器负责标签的压入,中间路由器基于标签号转发流量,进行标签号的替换,最后一跳路由器负责标签的弹出。
注:入标签号为本地分配的标号,出标签为下一跳(下游)分配的标签号。基于数据层面定义,存在上下游路由器概念。
4、MPLS细化:
(1)MPLS的数据封装:
MPLS的数据封装与2层和3层之间,故称为2.5层。
(2)MPLS的数据包格式:
下面这部分就是打进去的东西,总长度为32位(4个字节)。
位数 | 名字 | 作用 |
---|---|---|
0-19 | Label 标签号 |
存在2^20个号码,其中0-15号保留,一个标签号对应一条路由。 |
20-22 | EXP 优先级 |
存在2^3=8个优先级,用于QOS |
23 | S 栈底位 |
为1标识本信息为最后一层标签信息,最多可以存在3层标签 |
24-31 | TTL 生存时间 |
当标签号被压入时,将复制3层报头的TTL值,然后每经过一个路由器减1,当标签号弹出时,将现在TTL的标签号复制回 IP 报头中。 |
一层标签为普通MPLS,主要用于解决BGP的路由黑洞。
二层标签为MPLS 虚拟网络专线使用。
三层标签为MPLS TE 使用。
使用MPLS后,二层若依然为以太网封装,那么类型号将变化:
0x8847 MPLS单播
0x8848 MPLS多播
5、有关MPLS名词注解:
名词 | 注解 |
---|---|
MPLS domain | MPLS工作的范围 |
LSR (P路由器) |
标签交换路由器,查看数据包的标签号,然后基于LFIB表进行转发 |
Edge LSR (PE路由器) |
边界标签路由器,在数据层面时:MPLS域的第一跳路由器负责标签的压入,最后一跳负责弹出。 |
CE 客户端路由器 |
不工作于MPLS域,使用FIB表转发流量。 |
二、MPLS的优化(次末跳):
MPLS的优化,又叫做PHP的次末跳(次末跳:倒数第二跳),默认执行。
最后一跳路由器,在默认情况下需要查看LFIB表后再查看FIB表(由于最后一跳路由器在LFIB表中确实找不到下一跳了,因此它需要弹标签,弹完标签后就会查FIB表)
之后再转发数据,PHP次末跳可以使倒数第二跳在已知出接口、下一跳等信息时便将标签号弹出,然后基于出接口转发流量。导致最后一跳路由器发现没有标签了,那么它就仅查看FIB表。
最后一跳路由器,将本地直连路由传递给邻居时使用标号3来告知对方为倒数第二跳。
非直连路由正常分配标签号,针对域外的非直连路由,域内的最后一跳路由器需要查询两张表。因此建议PE路由器直接连接用户,不再连接其他路由器。
标识 | 注解 |
---|---|
pop | 标识仅弹出最上层标签,仅仅只是倒数第二跳(PHP的另一种解释) |
untagged | 弹出所有标签,意味离开了MPLS domain。 |
三、MPLS的配置:
1、首先要有路由
2、Cisco默认开启CEF:
R2(config)#ip cef
3、修改MTU,链路两端需一致(可选,建议配置),凡是标签涉及到的接口建议都配置MTU:
MPLS | 建议MTU |
---|---|
普通MPLS | 1504 |
MPLS 虚拟网络专线 | 1508 |
MPLS TE | 1512 |
R2(config)#interface s0/1
R2(config-if)#mtu 1504
4、开启MPLS,在标签号所有需要经过的接口上配置
R2(config)#interface s0/1
R2(config-if)#mpls ip
5、修改MPLS的封装类型:
R2(config)#mpls label protocol ?
ldp Use LDP
tdp Use TDP (default)
MPLS协议在工作时,存在两种封装:
封装 | 属性 | 端口号 | 注解 |
---|---|---|---|
TDP | Cisco私有 | TCP/UDP 711 | Hello包基于UDP传输,标签信息基于TCP传输 |
LDP | 公有 | TCP/UDP 646 | Hello 包基于UDP传输,标签信息基于TCP传输 |
注:Cisco ios 版本12.4(3)以下设备默认使用TDP,以上使用LDP。
6、查看邻居表:
协议开启之后,邻居间使用hello包建立邻居关系,生成邻居表。
//查看MPLS的邻居表,邻居存在RID,RID的选举规则同OSPF一致
R1#show mpls ldp neighbor
注:RID同时作为了建立TCP会话的源、目IP地址,若存在环回,那么默认使用环回作为RID,此时就必须将环回宣告到路由协议中,必须可达。
//修改RID为S1/1口的地址
R2(config)#mpls ldp router-id serial 0/1 ?
force Forcibly change the LDP router id //立即生效
<cr> // 重启设备后生效
7、查看FIB、LIB、LFIB:
当邻居关系建立后,邻居间将会基于FIB表生成的标签号传递给邻居,保存于LIB表中:
//查看FIB表
R2#show ip cef detail
//查看LIB表,LIB表中包含,我到该网段的 tag 编号,和邻居到达该网段 tag 的编号。
R2#show mpls ldp bindings
之后将LIB表和FIB表进行结合,生成LFIB表,基于该表格进行标签流量转发。
//查看LFIB表
R2#show mpls forwarding-table
如何验证是否打标签?
方法一:在打标签的接口抓包
方法二:追踪:
四、MPLS解决BGP路由黑洞:
接下来,我们说MPLS解决BGP的路由黑洞,首先如上配置两两之间建立好BGP邻居关系。
配置好BGP邻居关系后,将R2-R5之间处在MPLS域中的接口配置MPLS并设置MTU如下:
R2(config)#interface s0/1
R2(config-if)#mtu 1504
R2(config-if)#mpls ip
路由黑洞直接解决:
现在我们理一下整个过程是怎样忽悠中间没有运行BGP的R3和R4的:
①R1上ping 6.6.6.6的时候,R1需要发包,发包后查路由表下一跳是R2(此时还没有标签)。
②R2收到这个包后,由于该包没有标签,因此R2需要查询FIB表,并贴入一个标签17给R3。
③R3收到的路由是有标签的,因为这条路由是有标签的,因此R3不再查路由表,而是查询LFIB表。
④然后替换17号标签为20号,并发给R4,R4也是查询LFIB表。
⑤R4然后弹出这个标签,并从S0/1口将流量转发给R5,R5由于存在路由,因此它会给R6。这样数据层面流量就过去了。
它流量能过去的原因就在于R3、R4根本没有查看三层IP,看的是标签号,然后基于标签号转走。它到R5的环回的流量和到R6环回的流量的标签号都是一样的。把所有的中间黑洞设备全部都忽悠了,R3和R4以为是到R2的下一跳R5,但却不知道真正的目标是其它设备的。
总结:MPLS将为FIB表中的路由条目分配标签号,但通过BGP学习的条目不分配,而是在访问BGP目标时,压入到达下一跳地址的标签号,来通过中间未运行BGP协议的网络到达下一跳处。
五、MPLS 虚拟网络专线(ISP技术):
MPLS 虚拟网络专线,它是最接近于专线的虚拟网络专线技术(流量隔离、带宽要有保障)。该技术一般由运行商(ISP)配置,运营商配置完成后,MPLS 虚拟网络专线不能用来上网,该虚拟网络专线只是让两个企业内网通。
1、MPLS原理:
图向上面这样,由于MPLS不能上网,因此运营商没有必要给企业公网IP,因此我们可以看到图中运营商的路由器和企业的路由器之间连得线所配的IP是私网IP。
具体原理是这样:
控制层面:
(1)R1如何将自己的私有网段 192.168.2.0 交给公有设备?(可以先跳过此处)
是因为R2上开辟了一块VRF空间,R2在VRF空间中宣告这个私有网段,就实现了公有设备拥有私有网段了。
(2)R1、R6将自己的私有网段传给R2,很有可能出现两个网段是一样的。因此R2要区分开两家公司(CE端)来的路由,它要为两流量赋值,赋的值是RD值。
RD值:路由区分器,一个64位的16进制数,表示方法为 X:X,一个源(CE端)对应一个RD值和一个接口
假设R2,为R1来的路由RD赋值为1:1,R6来的路由赋值为2:2。
(3)ISP路由器(R2)不能将CE端的路由条目装载到本地普通的路由表中,因此它需要存储于VRF空间内。
VRF:虚拟路由转发,基于每个RD和接口一个空间。
(4)由于VRF空间内的路由不是普通的路由条目(负责传递公网路由表中条目),因此必须使用MP-BGP路由协议来传递,因此我们还需要定义RT值。
VRF内的路由被称为 虚拟网络专线v4路由 (虚拟网络专线v4路由=IPv4路由+RD值+RT值)
之所以用MP-BGP是因为RT值是BGP的一种社团属性,其次该协议可非直连建邻。
RT值,用于区分不同 目标 接受者,RT值和RD值的编写格式一致。
(5)R4收到路由条目目后,也不能把这种路由装到正常的路由条目中,它也需要装到对应的VRF空间内,这个空间靠RT值和R2上的空间对上,根据RT区分不同的目标给不同的公司。
数据层面:
比如说R5 ping R1环回:
R5把流量给R4,R4到下一跳R2,R4-R2之间使用MPLS。R4为流量封装两层标签,外标签用于穿越中间的黑洞路由器,内层标签用于告知R2所查询的VRP空间。
MPLS 虚拟网络专线保证了安全与带宽:
从上面我们看到MPLS 虚拟网络专线的流量在中间传的时候,不是绝对的安全,但理论上在运营上的环境内是安全的。
而带宽的保证靠运营商做QOS策略。
2、MPLS的配置:
(1)ISP中的配置:
步骤
①单播路由表R2、R3、R4之间首先要可以通
②配置CEF
③配置MPLS,建议同时修改MTU 1508
④定义VRF空间,同时关联所连接的CE端接口,再同时定义RD、RT值。
R2和R4都要配置:
// 创建VRF空间,名为a1
R2(config)#ip vrf a1
R2(config-vrf)#rd 1:1 //配置RD值
R2(config-vrf)#route-target 1:1 //配置RT值,一般一家公司的RD和RT值是一样的。
//进入关联接口
R2(config)#int s1/0
//默认该接口IP地址所在直连路由处于普通路由表中,现需转移到VRF空间内,故先将地址清洗
R2(config-if)#no ip address
//与之前创建的VRF空间进行关联
R2(config-if)#ip vrf forwarding a1
//重新定义地址
R2(config-if)#ip add 192.168.2.2 255.255.255.0
注:此时普通路由表中将不再存在该接口的直连路由,而是装载到了绑定的VRF空间内。
可以使用以下命令查看VRF空间内的路由表:
R2# show ip route vrf a1
默认 ping 时,使用普通路由表,若需要基于VRF空间内的条目通讯:
R2#ping vrf a1 192.168.2.1
(2)配置MP-BGP在两个 PE端(R2、R4)配置:
R2(config)#router bgp 1
R2(config-router)#bgp router-id 2.2.2.2
R2(config-router)#neighbor 4.4.4.4 remote-as 1
//先建立IPv4邻居关系
R2(config-router)#neighbor 4.4.4.4 update-source loopback 0
//进入MP-BGP家族模式
R2(config-router)#address-family vpnv4
//建立MP-BGP邻居关系
R2(config-router-af)#neighbor 4.4.4.4 activate
//开启社团属性的传递性
R2(config-router-af)#neighbor 4.4.4.4 send-community
(3)将CE端(R1、R5)私网路由传递到PE端(R2、R4):
①使用静态传递:
CE端,正常配置静态路由即可
PE端配置到CE私网的静态路由,必须配置到VRF空间内
R1(config)#ip route 192.168.3.0 255.255.255.0 192.168.2.2
R1(config)#ip route 192.168.4.0 255.255.255.0 192.168.2.2
R2(config)#ip route vrf a1 192.168.1.0 255.255.255.0 192.168.2.1
R5(config)#ip route 192.168.1.0 255.255.255.0 192.168.3.1
R5(config)#ip route 192.168.2.0 255.255.255.0 192.168.3.1
R4(config)#ip route vrf a2 192.168.4.0 255.255.255.0 192.168.3.2
此时,还需要BGP带路由,因此R2、R4上都要配置:
R2(config)#router bgp 1
//将该空间的静态、直连路由重发布到BGP中
R2(config-router)#address-family ipv4 vrf a1
R2(config-router-af)#redistribute static
R2(config-router-af)#redistribute connected
最后我们查看一下VRF空间:
R2#show ip bgp vpnv4 vrf a1
最后检测一下,证明控制层面和数据层面全部可达。
②使用RIP:
CE端正常启动和宣告RIP协议即可
PE端配置:启动后进行双向重发布即可
R2(config)#router rip
R2(config-router)#version 2
R2(config-router)#no auto-summary
R2(config-router)#address-family ipv4 vrf a1
R2(config-router-af)#network 12.0.0.0
R2(config-router-af)#redistribute bgp 1 metric 1
//在BGP的VRF空间中重发布RIP:
R2(config)#router bgp 1
R2(config-router)#address-family ipv4 vrf a1
R2(config-router-af)#redistribute rip
③使用EIGRP:
CE端正常启动和宣告即可
PE端配置:启动后进行双向重发布即可
//启动时必须配置该设备所在真实的AS号
R2(config)#router eigrp 1
R2(config-router)#no auto-summary
R2(config-router)#address-family ipv4 vrf a1
// 申明邻居使用的AS号
R2(config-router-af)#autonomous-system 90
R2(config-router-af)#network 12.0.0.0
R2(config-router-af)#redistribute bgp 1 metric 1544 100 255 1 1500
R2(config)#router bgp 1
R2(config-router)#address-family ipv4 vrf a1
// 重发布时,使用私有的AS号
R2(config-router-af)#redistribute eigrp 90
④使用OSPF:
CE端正常配置即可
PE端配置:启动后双向重发布
R2(config)#router ospf 1 vrf a1
R2(config-router)#router-id 2.2.2.2
R2(config-router)#network 12.1.1.2 0.0.0.0 a 0
R2(config-router)#redistribute bgp 1 subnets
R2(config)#router bgp 1
R2(config-router)#address-family ipv4 vrf a1
R2(config-router-af)#redistribute ospf 1