一、背景说明
在bgp网络中为了防止路由环路,采取了ibgp水平分割法则,这要求一个as内部的bgp speaker需要两两建立对等体或使用路由反射器(后续介绍),否则就会出现路由黑洞。本文介通过mpls标签转发路径的方式进行传递BGP路由。
二、实验拓扑
本次实验拓扑如下图所示:
- ip地址如图所示,路由器底层运行ospf协议
- 路由器的lo0接口地址为x.x.x.x/32(x为路由器编号),该地址也是route-id、lsr-id,作为ospf邻居,bgp对等体,ldp邻居之间的通信地址
- R1和R4上的lo1接口模拟客户端路由,不宣告进as1234,R1与R4之间通过lo0接口建立ibgp连接,R2、R3上不运行bgp,11.11.11.11/24与44.44.44.44/24在R1和R4的bgp中起源
- 各接口ip地址配置步骤省略三、实验步骤
1.建立ospf与bgp邻居关系 - R1上的配置
#建立ospf邻居
[R1]ospf 1 router-id 1.1.1.1
[R1-ospf-1]area 0
[R1-ospf-1-area-0.0.0.0]network 12.0.0.1 0.0.0.0
[R1-ospf-1-area-0.0.0.0]network 1.1.1.1 0.0.0.0
#建立bgp对等体
[R1]bgp 1234
[R1-bgp]router-id 1.1.1.1
[R1-bgp]peer 4.4.4.4 as 1234
[R1-bgp]peer 4.4.4.4 connect-interface lo0
- R2上的配置
#建立ospf邻居
[R2]ospf 1 router-id 2.2.2.2
[R2-ospf-1]area 0
[R2-ospf-1-area-0.0.0.0]network 12.0.0.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0]network 23.0.0.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0]network 2.2.2.2 0.0.0.0
- R3上的配置
#建立ospf邻居
[R3]ospf 1 router-id 3.3.3.3
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]network 23.0.0.3 0.0.0.0
[R3-ospf-1-area-0.0.0.0]network 34.0.0.3 0.0.0.0
[R3-ospf-1-area-0.0.0.0]network 3.3.3.3 0.0.0.0
- R4上的配置
#建立ospf邻居
[R4]ospf 1 router-id 4.4.4.4
[R4-ospf-1]area 0
[R4-ospf-1-area-0.0.0.0]network 34.0.0.4 0.0.0.0
[R4-ospf-1-area-0.0.0.0]network 4.4.4.4 0.0.0.0
#建立bgp对等体
[R4]bgp 1234
[R4-bgp]router-id 4.4.4.4
[R4-bgp]peer 1.1.1.1 as 1234
[R4-bgp]peer 1.1.1.1 connect-interface lo0
2.bgp路由黑洞的产生
- 在R1和R4上起源lo1接口地址
[R1]bgp 1234
[R1-bgp]network 11.11.11.0 24
[R4]bgp 1234
[R4-bgp]network 44.44.44.0 24
- 确认R4已收到R1发来的lo1接口路由,并将该路由已加载到路由表中
- 此时bgp路由已相互学习到,但无法通信
[R1]ping
-a 11.11.11.11 44.44.44.44
PING 44.44.44.44: 56 data
bytes, press
CTRL_C
to
break
Request
time
out
Request
time
out
Request
time
out
Request
time
out
Request
time
out
--- 44.44.44.44
ping
statistics
---
5 packet(s) transmitted
0 packet(s) received
100.00% packet
loss
3.路由黑洞根因定位 - 路由传输层面
首先,从路由传输层面进行分析。R1通过ibgp将11.11.11.11/24路由传给R4
尽管R2、R3没有运行bgp,但R1与R4底层用于建立bgp对等体的lo0接口之间路由层能够正常通信,所以bgp路由表会通过update报文将11.11.11.11/24路由传递给对方
- 数据传输层面
看完了路由层面,现在来看数据传输层面,R4要将数据包发到对等体R1,但R4不能直接把数据包扔给R1,必须是一跳一跳的到达R1,这一点在R4的路由表中可以看到,尽管下一跳是1.1.1.1,但是需要经过递归下一跳(RelayNextHop: 34.0.0.3 )R3
此时R3上并没有目的地址是11.11.11.11/24的路由,所以直接丢弃,造成通信失败
4.使用mlps解决bgp路由黑洞
- R1上启用mpls,构建ldp邻居(其余路由器做同样动作此处省略)
至此,mpls配置完成,但此时发现,仍然无法通信,检查R4去往11.11.11.11/24信息发现“TunnelID: 0x0”,说明并没有进入lsp路径转发,仍然是ip报文转发,原因是华为设备默认不去隧内做递归
- 开启隧道内递归,发现它走0x1隧道
查看0x1隧道,可以到看数据包被压上R3给他分的值为1024的label,而此时的目的ip地址也由ip报文转发时的11.11.11.11/24变成了1.1.1.1
因为R1~R4都运行了ldp所以每个路由器都为1.1.1.1/32这个fec分配了label,通过tracert可以查看变迁转发路径
所以此时数据传输如下图所示,其中R2、R3给1.1.1.1/32分配的label都为1024
end