BGP-MPLS 是运营商最常用的一种手段,用于解决BGP的路由黑洞问题
MPLS类似一种专线,解决了大型企业在公司各站点间通过运营商进行通信的问题
本文主要通过分享一个案例来给大家详细的介绍BGP-MPLS
首先我们要知道MPLS是如何工作的->
MPLS最初研发出来时不是用于解决BGP的路由黑洞问题的,而是用来解决TCP/IP路由器转发速率慢的问题
我们都知道路由表是通过多次匹配、递归查找,最长匹配原则来匹配相应的路由条目,这种查找是通过路由器CPU来进行计算查找,比较耗费时间,且CPU处理的不仅仅是查找路由条目这一个工作,而要达到快速的目的必须依靠其他硬件芯片,之后以CISCO代表的厂商研究出来一种芯片,但时间晚于MPLS
MPLS定义的一种标签转发规则,随着分配标签协议发展,现在出现一种共用的协议LDP
LDP: 主要工作就是分配标签,MPLS决定转发,MPLS协议本身比较简单,没有对路由路径进行多少判断,它的判断是根据其他协议的结果来做的,选路不是MPLS的强项,MPLS的强项在于转发机制,来弥补路由表的缺点
当MPLS发展正兴时:
以CISCO代表的厂商发明了一种东西叫做:
CEF=ARP表+路由表最长匹配结果+路由表递归结果
多次->一次 三元匹配原则,由TCAM芯片完成
当CEF表研发出来后,英雄无用武之地,CEF替代了MPLS实现了快速转发机制
但是MPLS提供的一种新形式的转发路径,基于标签转发,每一条路由条目都有一条独特的标签路径->符合隧道的一切特征(封装+洞口与洞尾),用标签来形成一条隧道,此时人们发现BGP和MPLS是绝配,MPLS依据标签隧道很好的解决了BGP的黑洞问题,且MPLS没有算法,它只是一套转发机制,相对于路由协议来说,MPLS只是占用一定比例的带宽资源,对路由器几乎没有计算上的压力
之后又出现一种技术,又将MPLS推上顶峰,这种技术叫做VRF(Virtual Routing Forwarding,虚拟路由转发)
我们都知道在交换网络中,有一种技术叫做VLAN(Virtual Local Area Network,虚拟局域网),它的作用是划分广播域,可以说用来分割CAM表,而VRF产生出来是为了划分路由表,也可以说是划分路由器,一个路由器中可以存在多个VRF,每个VRF中都有自己独立的VRF路由表,这样就将路由器的路由表分割开来,而彼此之间不互相影响
VLAN间通信使用Trunk干道,那么VRF间通信使用什么呢?
MPLS只负责标签交换的过程,而LDP协议是为MPLS服务的,它为路由条目分发标签,供MPLS进行交换,接下来我们介绍一下LDP-标签分发协议
因为MPLS是建立在LDP之上的,所有我们首先先了解LDP,路由器要分配标签,那么路由器之间必然存在关系,LDP与大多数路由协议类似,需要建立邻居关系,建邻必然存在状态机(规定每个阶段完成什么样的任务)
识别对端Router-id,通过TCP 646端口建立TCP连接,启用LDP协议,底层必须有着路由协议的支撑,且Router-id必须为回环口
之后通过Update报文,将为路由条目所分配的标签发送给各邻居
LDP分配标签时参考的为CEF表,CEF表中所有的路由都分配一个标签,形成一个binding表(Cisco通过show mpls ldp binding查看)
该binding可以理解为LDP的数据库,类似于EIGRP/OSPF路由协议的拓扑表
在此处路由前缀一定是严格匹配一致性的
10.1.1.0/24
10.1.1.1/24
10.1.1.0/24 包含了10.1.1.1/24,但是在LDP中,完全不一样,在此处,会分配不同的标签
比如在OSPF,当我们将回环口起为/24位时,会出现问题,因为在OSPF中,其他路由器学到的路由条目是打O /32位的,此时如果启用LDP协议,本地为/24为分配标签,邻居为/32为分配标签,此时在邻居binding表中,会存在两条掩码不同的路由前缀的binding表,不会产生标签交换的过程,进而不能进行通信,所以在启用LDP时,我们底层如果使用回环口建邻,回环口必须定义成/32位
也就是说MPLS中路由在传递过程中不能汇总,不能该表其位数(掩码),如果底层为OSPF的回环地址最好写成32位主机地址
如下图所示,这是我们来简单的介绍一下MPLS是如何打破BGP黑洞的一个案例,这个案例只为了说明怎样去解决黑洞问题,在之后的博文中,会为大家介绍更为复杂、更趋于真实环境的案例
R1路由器
**loopback 0口**
R1(config)#interface loopback 0
R1(config-if)#ip address 1.1.1.1 255.255.255.255
R1(config-if)#exit
**loopback 1口**
R1(config)#interface loopback 1
R1(config-if)#ip address 10.1.1.1 255.255.255.255
R1(config-if)#exit
**R1-R2直连**
R1(config)#interface s3/0
R1(config-if)#ip address 10.1.12.1 255.255.255.0
R1(config-if)#no shutdown
R1(config-if)#exit
**底层OSPF**
R1(config)#router ospf 1
R1(config-router)#router-id 1.1.1.1
R1(config-router)#exit
R1(config)#interface loopback 0
R1(config-if)#ip ospf 1 area 0
R1(config-if)#exit
R1(config)#interface s3/0
R1(config-if)#ip ospf 1 area 0
R1(config-if)#exit
**BGP**
R1(config)#router bgp 100
R1(config-router)#bgp router-id 1.1.1.1
R1(config-router)#neighbor 4.4.4.4 remote-as 100
R1(config-router)#neighbor 4.4.4.4 update-source loopback 0
R1(config-router)#neighbor 4.4.4.4 next-hop-self
R1(config-router)#network 10.1.1.1 mask 255.255.255.255
R1(config-router)#exit
**定义标签分发范围**
R1(config)#mpls label range 100 199
**定义LDP建邻Router-id**
R1(config)#mpls ldp router-id loopback 0 force
**启用MPLS**
R1(config)#interface s3/0
R1(config-if)#mpls ip
R1(config-if)#exit
R1(config)#
R2路由器
**loopback 0口**
R2(config)#interface loopback 0
R2(config-if)#ip address 2.2.2.2 255.255.255.255
R2(config-if)#exit
**R1-R2直连**
R2(config)#interface s3/1
R2(config-if)#ip address 10.1.12.2 255.255.255.0
R2(config-if)#no shutdown
R2(config-if)#exit
**R2-R3直连**
R2(config)#interface s3/0
R2(config-if)#ip address 10.1.23.1 255.255.255.0
R2(config-if)#no shutdown
R2(config-if)#exit
**OSPF**
R2(config)#router ospf 1
R2(config-router)#router-id 2.2.2.2
R2(config-router)#exit
R2(config)#interface loopback 0
R2(config-if)#ip ospf 1 area 0
R2(config-if)#exit
R2(config)#interface s3/1
R2(config-if)#ip ospf 1 area 0
R2(config-if)#exit
R2(config)#interface s3/0
R2(config-if)#ip ospf 1 area 0
R2(config-if)#exit
**定义标签分发范围**
R2(config)#mpls label range 200 299
**定义LDP建邻Router-id**
R2(config)#mpls ldp router-id loopback 0 force
R2(config)#exit
**启用MPLS**
R2(config)#interface s3/1
R2(config-if)#mpls ip
R2(config-if)#exit
R2(config)#interface s3/0
R2(config-if)#mpls ip
R2(config-if)#exit
R2(config)#
R3路由器
**loopback 0口**
R3(config)#interface loopback 0
R3(config-if)#ip address 3.3.3.3 255.255.255.255
R3(config-if)#exit
**R2-R3直连**
R3(config)#interface s3/1
R3(config-if)#ip address 10.1.23.2 255.255.255.0
R3(config-if)#no shutdown
R3(config-if)#exit
**R3-R4直连**
R3(config)#interface s3/0
R3(config-if)#ip address 10.1.34.1 255.255.255.0
R3(config-if)#no shutdown
R3(config-if)#exit
**OSPF**
R3(config)#router ospf 1
R3(config-router)#router-id 3.3.3.3
R3(config-router)#exit
R3(config)#interface loopback 0
R3(config-if)#ip ospf 1 area 0
R3(config-if)#exit
R3(config)#interface s3/1
R3(config-if)#ip ospf 1 area 0
R3(config-if)#exit
R3(config)#interface s3/0
R3(config-if)#ip ospf 1 area 0
R3(config-if)#exit
**定义标签分发范围**
R3(config)#mpls label range 300 399
**定义LDP建邻Router-id**
R3(config)#mpls ldp router-id loopback 0 force
R3(config)#exit
**启用MPLS**
R3(config)#interface s3/1
R3(config-if)#mpls ip
R3(config-if)#exit
R3(config)#interface s3/0
R3(config-if)#mpls ip
R3(config-if)#exit
R3(config)#
R4路由器
**loopback 0口**
R4(config)#interface loopback 0
R4(config-if)#ip address 4.4.4.4 255.255.255.255
R4(config-if)#exit
**loopback 1口**
R4(config)#interface loopback 1
R4(config-if)#ip address 10.4.4.4 255.255.255.255
R4(config-if)#exit
**R3-R4直连**
R4(config)#interface s3/1
R4(config-if)#ip address 10.1.34.2 255.255.255.0
R4(config-if)#no shutdown
R4(config-if)#exit
**底层OSPF**
R4(config)#router ospf 1
R4(config-router)#router-id 4.4.4.4
R4(config-router)#exit
R4(config)#interface loopback 0
R4(config-if)#ip ospf 1 area 0
R4(config-if)#exit
R4(config)#interface s3/1
R4(config-if)#ip ospf 1 area 0
R4(config-if)#exit
**BGP**
R4(config)#router bgp 100
R4(config-router)#bgp router-id 4.4.4.4
R4(config-router)#neighbor 1.1.1.1 remote-as 100
R4(config-router)#neighbor 1.1.1.1 update-source loopback 0
R4(config-router)#neighbor 1.1.1.1 next-hop-self
R4(config-router)#network 10.4.4.4 mask 255.255.255.255
R4(config-router)#exit
**定义标签分发范围**
R4(config)#mpls label range 400 499
**定义LDP建邻Router-id**
R4(config)#mpls ldp router-id loopback 0 force
**启用MPLS**
R4(config)#interface s3/1
R4(config-if)#mpls ip
R4(config-if)#exit
R4(config)#
以上配置完成之后,BGP的路由黑洞打通,10.1.1.1 和 10.4.4.4 之间可以互相通信
在R1上我们可以看到,4.4.4.4与10.4.4.4的CEF表中,下一跳出接口和标签都一致,意味着,此时R1与10.4.4.4进行通信使用的为4.4.4.4的标签路径,也就是说4.4.4.4和10.4.4.4共用一条标签路径,而在启用MPLS之后,R2与R3值通过标签交换进行数据转发,不去看路由表,当数据到达R4之后,脱去标签查本地路由表从而到达10.4.4.4
同理R4与10.1.1.1通信原理一致,那么此时就用MPLS解决了BGP的路由黑洞问题