梅利333

从无到有,自有至精

导航

MPLS-7 MPLS 下的BGP

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成长之路  --- 梅利

 

 

posted on 2020-09-24 10:41  梅利333  阅读(483)  评论(0编辑  收藏  举报