MPLS 下的BGP
前文也提到过一句,在MPLS的环境中,LDP是无法为BGP路由进行捆绑标签的,那怎么办呢?
虽然LDP 不会为BGP路由分配标签,但是LDP会为BGP路由的NEXTHOP分配标签,
咱们来具体的看一下
事先声明,在前面的BGP部份中,我们提到过,当AS1234的BGP区域想要进行路由传递,就必须要进行全互联或者是 RR,再或者是confedration联邦。如果不进行这样的操作的话,很明显,出现了路由黑洞,
也就是说在R4上可以看到R5上面的路由,但是无效,存在路由黑洞......,因为回程会有问题,
但是有了MPLS的话,可以解决这一现象,(因为运行BGP的路由器实在是太贵了)
一定意义上,MPLS也是为了解决BGP的路由黑洞所存在的。
实验1
R1和R4 宣告IGP时,将和R5-R6的直连接口同时宣告到IGP中
R2-R3不运行BGP协议
R1--R4为IBGP关系
R1--R5, R4--R6为EBGP关系
具体的配置不再多讲
提示一下,为了方便观查,我们将mpls 的label 在每台设备上定义了一个范围
R1,100-199
R2,200-299
依次类推
在R5上我们需要配置一个默认路由指出来,因为并没有到达R6的条目。
我们先来R6上进行测试,
R6访问 R5发来的5.5.5.5条目,去traceroute,
可以发现,先到达下一跳 46.0.0.4
然后转为MPLS的标签名,给到34.0.0.3 ,且label=304,很显然这个304是R3给的
再到23.0.0.3,label=203,这个是由R2给的,
从R2到达R1时,12.0.0.1,改成了IP包
我们先来分析一下倒底是怎么回事儿,
1 控制层面
路由从R5发往R1,此时的条目为BGP条目,我们前文提到过,LDP是无法为BGP条目捆绑标签的,那么怎么办呢?怎么样才可以进行MPLS的标签转发呢?
那就是为BGP条目的next-hop地址捆绑标签,因为下一跳地址是可达的(在IGP看来)
那么R1 会为这个15.0.0.5的下一跳地址捆绑一个什么标签呢?思考一下,是imp-null,因为R1看来,这个地址是我的直连接口,所以把这个地址设置为隐含空的标签,并通告给R2
R2上的标记是怎么样的呢?
R2会在本地捆绑203,并且标记来自1.1.1.1的为imp-null
R3上的bindings
R3上看也是同样的,本地标记是多少,然后来自于邻居的分别是多少,
(这里再次强调,为什么最后会选择走2.2.2.2这边,是取决于IGP协议的,)
R4上看bindings
R6是没有运行MPLS的,所以不用看了
2 数据层面
此时当R6去访问5.5.5.5时,就出现了这样的现象
数据先是从R6到达R4,此时为IP包
R4查看自己的FIB表准备转发,
5.5.5.5的条目是什么?
一看是BGP的,如果此时直接转发的话,肯定是不通的,因为R2-R3根本就没有运行BGP,黑洞就此产生,
而此时R4还查看了一下BGP表,(又由于LDP协议是无法为BGP条目进行捆绑标签的,只能为它的下一跳地址加标签)
那5.5.5.5的BGP条目下一跳地址是多少?
15.0.0.5(我们并没有配置neighbor x.x.x.x next-hop-self)
随之查看自己的15.0.0.0 FIB表。
有了 304的label,
这一看就知道是R3发过来的,(因为咱们之前定义了各设备上的label range)
MPLS的标签数据顺利到达R3,R3会查看自己的LFIB表
本地入站标签为304,出站为203,是为15.0.0.0/24这个前缀打的标签,出接口为e0/0,且下一跳地址为23.0.0.2(很明显这里是R2)
到R2上看一下
本地入站标签为203,也站标签为POP,弹出,下一跳地址为12.0.0.1(也就是R1)
这里执行的是PHP次末跳弹出机制,
R1查看以后,对应自己的FIB表, 直接就转出去了,
而做为R5,肯定是没有能够到达46.0.0.0/24网段的条目,为了能通,所以我们需要在R5上配置一条默认路由
至此,BGP黑洞问题解决
总结 :
在BGP的环境中,如果中间设备不想运行BGP,或者不准备做RR,以及联邦的话,可以考虑MPLS,并且它还可以一定程度上的去隐藏网络架构环境。
实验2
再次将我们的实验进行升级
将R1-R5,R4-R6的直连接口不宣告到IGP网络中,看看会发生什么
当R6发送数据到5.5.5.5时,查询自己的FIB表,然后发给自己的下一跳 46.0.0.4
当R4收到之的,先递归查询,发现是个BGP条目,下一跳是谁?是12.0.0.1,再一看需要压入标签,303,一看就知道是R3给的,好办,压入标签转给R3
数据到达R3之后,一看是标签包,直接查看自己的LFIB表
入站标签为303.出间标签是?咦?怎么会是POP呢?
弹出,为什么会弹出,
这要从上游设备(也就是控制层面来分析,R2上是怎么来压入标签的)
来看一下
在R2上可以明显的看出,针对于12.0.0.0/24的条目,本地压入的标签就是imp-null,
为什么?
因为在R2看来 12.0.0.0/24的前缀是我本地直连,我肯定是为这些直连接口压入imp-null的。这是因为MPLS的PHP机制。
那你弹出就弹也吧,转成IP包,发给R2,
在R2上看一下呗
R2上一看,一句大大的我擦嘞~啥情况,没有路由?
很简单啊,因为R2上根本就没有运行BGP协议,而且在我这里并没有进行标签的继续转发,没有别的路可选了,没法办,丢弃吧。
这也就是为什么不通的原因了。
分析一下,倒底是什么原因,(机智的你是否发现,在R1和R4的IBGP关系中,使用的物理接口建立的peer,所以导致MPLS的PHP机制在R2上生效)
解决办法也是很简单,之前我们在学习BGP的时候,提到过,在对于BGP建立 邻居时,最好是使用loopback接口来建立,对于BGP而言,好处自然不用多说,稳定嘛。那么对于MPLS而言呢?在R2上看来,我R1的loopback接口不再是直连的了,也就不正在PHP机制了。
R4上的Next-hop 是不是由原来的12.0.0.1,变成了现在的1.1.1.1了。
之前的next-hop和现在的进行对比,一目也然
我们再来看一下它的走向问题
控制层面
由于是R1的直连,它在通告标签时肯定 是imp-null的 ,发给R2, R2将自己的标签发给R3.R3再将自己的标签发给R4,就这样完成了标签的交互通告
数据层面
数据从R6出来是IP包,到达R4,R4查看FIB表,查看有无动作,一看,发现需要压入一个标签,这个标签是R3给的,压入并转给R3,到了R3一看来的是标签包,直接查看LFIB表,看outgoing动作是到R2的,R2收到之 后也是一看,标签包,看LFIB表,动作为POP,弹出,则将标签弹出,高为IP包,转发给R1,R1收到以后一看,
是一个IP包,查看自己的路由表,去往5.5.5.5的,本地有B开头的条目,可以直接去,
但是回去路由会有问题
因为R1上并没有46.0.0.0这个网段的路由,
解决办法有两种 ,
1 可以将46.0.0.0的网段路由引入到BGP、或者 是IGP中,但显然这种做法是不明智的,也违背了要求
2 在R6上也宣告 一个网段,进BGP,
并且最终使用
R6 # ping 5.5.5.5 so 6.6.6.6 来进行Ping
因为无论R1,R4,R5,R6,上都能看到这此路由以及下一跳地址,并且中间的MPLS 域 也可以为路由下一跳 打上标签进行交换。
------------------------------------
CCIE成长之路 --- 梅利
原文:https://www.cnblogs.com/meili333/p/13722930.html