Lab 利用MPLS解决BGP路由黑洞
MPLS Topology Lab
(1)底层配置
(2)AS 100运行IGP OSPF 100
(3)AS 100运行LDP
(4)按拓扑表建立BGP关系
(5)R1/R6分别通告BGP路由
(6)R2和R5互相指next-hop-self
r5#show mpls forwarding-table 10.1.1.1 detail
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
5002 17 10.1.1.0/24 0 Fa0/0.45 45.1.1.4
MAC/Encaps=18/22, MRU=1500, Tag Stack{17}
CA030A740000CA040A7400008100002D8847 00011000
No output feature configured
Per-packet load-sharing
r5#show mpls forwarding-table 10.1.2.1 detail
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
5002 17 10.1.2.0/24 0 Fa0/0.45 45.1.1.4
MAC/Encaps=18/22, MRU=1500, Tag Stack{17}
CA030A740000CA040A7400008100002D8847 00011000
No output feature configured
Per-packet load-sharing
r5#show mpls forwarding-table 10.1.3.1 detail
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
5002 17 10.1.3.0/24 0 Fa0/0.45 45.1.1.4
MAC/Encaps=18/22, MRU=1500, Tag Stack{17}
CA030A740000CA040A7400008100002D8847 00011000
No output feature configured
Per-packet load-sharing
r5#show mpls forwarding-table 2.2.2.2 detail
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
5002 17 2.2.2.2/32 0 Fa0/0.45 45.1.1.4
MAC/Encaps=18/22, MRU=1500, Tag Stack{17}
CA030A740000CA040A7400008100002D8847 00011000
No output feature configured
Per-packet load-sharing
数据包的目的地址在本地路由表中从BGP学习过来的,它的FEC的分类方式是BGP条目的下一跳地址,所以三个网段10.1.0.0/16的下一跳都是2.2.2.2,即是R4都为该FEC分配一个17的标签值,从而解决了数据黑洞问题
MPLS-domain路由器转发以BGP条目为目的地的数据包,该路由器会借用bgp条目的下一跳标签来发送该数据包
BGP的分类原则是找下一跳
以上的数据从R6(ISP2)发往ISP1在R4中的包结构如下:
R5:压制标签,查找FIB表
R4:Swap标签,查找LFIB
R3:Swap标签,查找LFIB,并为10.1.1.1 分配imp-null标签
R2:POP标签,查找FIB表
(7)如图使用R2和R5的物理接口代替loopback口来建立iBGP邻居关系就会发现,此时ISP2和ISP1无法通信
因为23.1.1.0/24是R3的直连网段,R3则会为其会压imp-null标签,并通告给R4,所以当数据流从ISP2发往ISP1的过程中,R4会提早pop标签,使得在R3路由器上露出包结构中的目的地址10.1.1.1(对于R3来说不可达)
所以此时R3则查找FIB表,然而R3却没有关于10.1.1.0/24的目的前缀,从而丢弃数据包,造成数据黑洞
(8)如上图建立IGP关系,并在R4上汇总路由5.0.0.0/8路由条目
r4(config-router)#area 1 range 5.0.0.0 255.0.0.0
r3#show mpls forwarding-table 5.5.5.5 detail
Local Outgoing Prefix Bytes tag Outgoing Next Hop
tag tag or VC or Tunnel Id switched interface
3006 Pop tag 5.0.0.0/8 135 Fa0/0.34 34.1.1.4
MAC/Encaps=18/18, MRU=1504, Tag Stack{}
CA030A740000CA020A740000810000228847
No output feature configured
Per-packet load-sharing
由上述结果可以知道,汇总之后5.0.0.0汇总条目相当于本地发起,所以R4为其分配imp-null标签,根据倒数第二跳规则,在数据回包过程中,R3将会提前pop标签,使得数据流到达R4时要查找FIB造成172.16.6.6条目不可达而丢弃数据包,形成数据黑洞
(9)按照第5步完成实验可以使用一下命令发现:
r6#traceroute
Protocol [ip]:
Target IP address: 10.1.1.1
Source address: 172.16.6.6
Numeric display [n]:
Timeout in seconds [3]:
Probe count [3]:
Minimum Time to Live [1]:
Maximum Time to Live [30]:
Port Number [33434]:
Loose, Strict, Record, Timestamp, Verbose[none]:
Type escape sequence to abort.
Tracing the route to 10.1.1.1
1 56.1.1.5 80 msec 32 msec 44 msec
2 45.1.1.4 [MPLS: Label 17 Exp 0] 188 msec 92 msec 140 msec
3 34.1.1.3 [MPLS: Label 3000 Exp 0] 140 msec 152 msec 200 msec
4 23.1.1.2 172 msec 124 msec 172 msec
5 12.1.1.1 188 msec * 188 msec
可以返回中间路径的原因是因为,当数据到达R4的时候TTL = TTL - 1 = 0无效,而此时R4无法认知源网络号172.16.6.6,但是R4根据标签信息知道上游设备知道如何对该网段回包,所以其将此时的数据包TTL值设为255,发往R3,直至R2方可对172.16.6.6回包,然而此时的TTL = 252,在R4上打开debug mpls packets命令:
*Jul 30 22:35:01.363: MPLS: Fa0/0.45: recvd: CoS=0, TTL=1, Label(s)=17
*Jul 30 22:35:01.363: MPLS: Fa0/0.34: xmit: CoS=6, TTL=255, Label(s)=3000
*Jul 30 22:35:01.439: MPLS: Fa0/0.34: recvd: CoS=6, TTL=252, Label(s)=22
*Jul 30 22:35:01.439: MPLS: Fa0/0.45: xmit: (no label)
*Jul 30 22:35:01.519: MPLS: Fa0/0.45: recvd: CoS=0, TTL=1, Label(s)=17
*Jul 30 22:35:01.519: MPLS: Fa0/0.34: xmit: CoS=6, TTL=255, Label(s)=3000
*Jul 30 22:35:01.563: MPLS: Fa0/0.34: recvd: CoS=6, TTL=252, Label(s)=22
*Jul 30 22:35:01.563: MPLS: Fa0/0.45: xmit: (no label)
*Jul 30 22:35:01.659: MPLS: Fa0/0.45: recvd: CoS=0, TTL=1, Label(s)=17
*Jul 30 22:35:01.659: MPLS: Fa0/0.34: xmit: CoS=6, TTL=255, Label(s)=3000
*Jul 30 22:35:01.735: MPLS: Fa0/0.34: recvd: CoS=6, TTL=252, Label(s)=22
*Jul 30 22:35:01.735: MPLS: Fa0/0.45: xmit: (no label)
*Jul 30 22:35:01.799: MPLS: Fa0/0.45: recvd: CoS=0, TTL=2, Label(s)=17
*Jul 30 22:35:01.799: MPLS: Fa0/0.34: xmit: CoS=0, TTL=1, Label(s)=3000
默认情况下traceroute是每次发送3个相同的探测包的