【实验1】MPLS不会为BGP路由分配标签,但为BGP路由的下一跳分配标签
拓扑环境描述:
- R1、R2、R3、R4处于Transit AS 1234。在AS内运行的IGP协议是OSPF
- 所有的互联IP如图所示
- 所有设备的Loopback0口地址为x.x.x.x/32,x为设备编号
- R1与R4之间建立IBGP邻接关系,IBGP邻接关系建立在物理接口上。R1与R5、R4与R6之间建立EBGP邻接关系,也是建立在物理接口上。
- 在这个实验测试中,我们在OSPF中宣告R1-R5和R4-R6的直连网段。
- R5及R6各自在BGP进程中宣告自己的Loopback路由
实验结果:
由于R2、R3没有运行BGP协议,并且Core OSPF内也没有5.5.5.0及6.6.6.0的路由,因此最终的结果是R5及R6虽然能够学习到彼此的路由,但是却无法互访,因为在R2及R3上出现了路由黑洞。
解决的办法就是用MPLS,我们将Core变成MPLS域:
R1的配置如下:
mpls ldp router-id loopback0
mpls label rangempls label range 100 199
interface fa0/0
mpls ip
R2的配置如下:
mpls ldp router-id loopback0
mpls label rangempls label range 200 299
interface fa0/0
mpls ip
interface fa1/0
mpls ip
R3的配置如下:
mpls ldp router-id loopback0
mpls label rangempls label range 300 399
interface fa0/0
mpls ip
interface fa1/0
mpls ip
R4的配置如下:
mpls ldp router-id loopback0
mpls label rangempls label range 400 499
interface fa0/0
mpls ip
R1、R2、R3、R4运行LDP协议。
要注意,LDP默认是不会为BGP路由分配标签的,但是我们也知道,BGP路由都有next-hop,而这个下一跳是IGP路由可达的,LDP则会为这条(下一跳地址所在的)路由分配标签,这一点非常之重要。
这样一来我们5.5.5.5和6.6.6.6之间就能够互访了,在R6上
R6#traceroute 5.5.5.5 soure 6.6.6.6
Type escape sequence to abort.
Tracing the route to 5.5.5.5
1 10.1.46.4 128 msec 152 msec 120 msec
2 10.1.34.3 [MPLS: Label 303 Exp 0] 856 msec 1012 msec 1072 msec
3 10.1.23.2 [MPLS: Label 203 Exp 0] 964 msec 1124 msec 1008 msec
4 10.1.12.1 1060 msec 984 msec 1080 msec
5 10.1.15.5 1564 msec 1124 msec 1484 msec
我们发现,R6始发的报文是IP的,到了R4,R4查CEF表,发现目的地:5.5.5.5的条目,关联了一个Label:303,于是R4将IP包压上标签303,然后丢给下一跳10.1.34.3也就是R3。下面就是R4的CEF表项:
5.5.5.5/32, version 22, epoch 0, cached adjacency 10.1.34.3
0 packets, 0 bytes
tag information from 10.1.15.0/24, shared
local tag: 403
fast tag rewrite with Fa0/0, 10.1.34.3, tags imposed: {303}
via 10.1.15.5, 0 dependencies, recursive
next hop 10.1.34.3, FastEthernet0/0 via 10.1.15.0/24
valid cached adjacency
tag rewrite with Fa0/0, 10.1.34.3, tags imposed: {303}
注意这里这个303很明显,是R3分配的,然后将这个分配结果给到了R4,R4是在用R3分配的标签去压到IP包前面。那么这个303,实际上是为BGP路由5.5.5.5的下一跳10.1.15.0这条路由分配的标签。还是那句话,LDP不会为BGP路由分配标签,但是会为BGP路由的下一跳(路由)分配标签。
接下去数据到了R3,R3查自己的LFIB表后,将303标签置换成203,然后丢给下一跳R2。R2收到这个标签包后,查看自己的LFIB表,发现outgoing动作是一个PoP,于是将标签弹出,变成最原始的那个IP包,然后丢给R1,最后R1将这个IP包转发到了R5。那么这里为什么R2这里会PoP呢?答案是这条BGP路由,前面我们讲过了,其实是用的是它的下一跳10.1.15.0的标签,10.1.15.0是R1的直连网段,因此R1在为这条路由分配标签时,给了个PoP,然后将这个结果分发给R2,这就是原因。
【实验2】 不宣告R1-R5及R4-R6之间的直连网段进OSPF
在上面的实验中,我们在Core OSPF中宣告了R1-R5及R4-R6的直连网段,然而我们知道,在实际的场合中,往往不会在Core IGP中宣告这条AS外的链路,因此接下去我们来看看,如果不在OSPF中宣告这两个直连链路,会有什么现象:由于OSPF没有了这两个直连网段,那么5.5.5.5及6.6.6.6学习进来就不优了,需在R1上对R4去使用next-hop-self,R4对R1也同理。
那么这样一来,R4上去往5.5.5.5下一跳就是10.1.12.1了,那么当6.6.6.6访问5.5.5.5的时候,IP包到达R4,R4查CEF并且为IP包压上标签,关键在这个标签上,R4会使用10.1.12.0这条路由的标签(12.0是去往5.5.5.5的下一跳),而这个标签是R3分配的(我给出口数据打上的标签永远是LDP邻居给我的标签)。那么这个标签包被传递到了R3,R3会怎么处理呢?实验现象表明,R3会将标签PoP,变成IP包然后丢给R2。可是为什么?原因是R2为路由10.1.12.0分配的标签就是PoP,因为12.0是R2的直连网段,这里有次末跳弹出机制。那么这个IP包到了R2就歇菜了,因为R2根本没有6.6.6.6和5.5.5.5的路由啊。
怎么办?
解决的办法:R1及R4使用loopback接口建立IBGP邻居关系
前面的实验之所以在R1和R4上使用物理接口建立IBGP邻接,是为了帮助大家理解一下MPLS环境下BGP的路由问题,好了,现在我们在R1和R4上,使用loopback接口来建立IBGP邻接关系,问题就解决了。 这时候R4上,去往5.5.5.5的下一跳就是R1的Loopback口地址,所以R4在给去往5.5.5.5的IP包压标签的时候,用的就是1.1.1.1/32路由的标签,R3、R2也一样,那么标签包就能通过1.1.1.1/32打通的LSP一路传到R2,并在R2这弹出标签变成IP包再转给R1,R1再将IP包转发给R5,搞定。
因此,路由器不会对BGP路由直接分配标签,而是为BGP路由通过递归后的下一跳路由分配标签,这样做是很有好处的。
BGP中的路由条目是相当多的,如此一来我们通过MPLS,可大大简化路由器的性能损耗,BGP的Transit AS的路由黑洞问题也得到了很好的解决。
红茶三杯
网络工程 | 项目管理 | IT服务管理 | CCIE培训
学习 沉淀 成长 分享
微博:http://weibo.com/vinsoney
博客:http://blog.sina.com.cn/vinsoney
|