【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP

实验环境:

操作系统:Windows 10(1607,14393.351,当时最新测试版),模拟器:GNS3 IOU for Windows 1.5.2(当时最新正式版)
注:当然,只要有思科模拟器都可以做这个实验

【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP
【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP

实验需求:

  • IOU1、IOU2和IOU3是一个互联网服务提供商(ISP),IOU4、IOU5和IOU6是另一个互联网服务提供商(ISP);
  • IOU7和IOU8分别通过802.1Q封装连接各自的互联网服务提供商(ISP),IOU7和IOU8之间要实现MPLS L2VPN通信;
  • IOU9通过PPP封装连接自己的互联网服务提供商(ISP),IOU10通过Ethernet封装连接自己的互联网服务提供商(ISP),IOU9和IOU10之间要实现MPLS L2VPN通信;
  • IOU3和IOU4之间(两个互联网服务提供商的边界)通过option B/option 2(End to End)的方式进行MPLS L2VPN的互连;
  • IOU3和IOU4上的BGP路由不允许泄露到IGP。

实验步骤:

1、先配置两个互联网服务提供商(ISP)上的IP地址、IGP(OSPF)和MPLS:

IOU1:

conf t
int l 0
ip add 1.1.1.1 255.255.255.255

int e 0/2
ip add 12.1.1.1 255.255.255.0
no sh

router ospf 123
router-id 1.1.1.1

int r e 0/2 , l 0
ip os 123 a 0

ip cef
mpls ip
mpls label pro ldp
mpls ldp ro l 0 fo
mpls label range 1000 1999

int e 0/2
mpls ip

IOU2:

conf t
int l 0
ip add 2.2.2.2 255.255.255.255

int e 0/2
ip add 12.1.1.2 255.255.255.0
no sh

int e 0/3
ip add 23.1.1.2 255.255.255.0
no sh

router ospf 123
router-id 2.2.2.2

int r e 0/2-3 , l 0
ip os 123 a 0

ip cef
mpls ip
mpls label pro ldp
mpls ldp ro l 0 fo
mpls label range 2000 2999

int r e 0/2-3
mpls ip

IOU3:

conf t
int l 0
ip add 3.3.3.3 255.255.255.255

int e 0/3
ip add 23.1.1.3 255.255.255.0
no sh

router ospf 123
router-id 3.3.3.3

int r e 0/3 , l 0
ip os 123 a 0

ip cef
mpls ip
mpls label pro ldp
mpls ldp ro l 0 fo
mpls label range 3000 3999

int e 0/3
mpls ip

IOU4:

conf t
int l 0
ip add 4.4.4.4 255.255.255.255

int e 0/2
ip add 45.1.1.4 255.255.255.0
no sh

router ospf 456
router-id 4.4.4.4

int r e 0/2 , l 0
ip os 456 a 0

ip cef
mpls ip
mpls label pro ldp
mpls ldp ro l 0 fo
mpls label range 4000 4999

int e 0/2
mpls ip

IOU5:

conf t
int l 0
ip add 5.5.5.5 255.255.255.255

int e 0/2
ip add 45.1.1.5 255.255.255.0
no sh

int e 0/3
ip add 56.1.1.5 255.255.255.0
no sh

router ospf 456
router-id 5.5.5.5

int r e 0/2-3 , l 0
ip os 456 a 0

ip cef
mpls ip
mpls label pro ldp
mpls ldp ro l 0 fo
mpls label range 5000 5999

int r e 0/2-3
mpls ip

IOU6:

conf t
int l 0
ip add 6.6.6.6 255.255.255.255

int e 0/3
ip add 56.1.1.6 255.255.255.0
no sh

router ospf 456
router-id 6.6.6.6

int r e 0/3 , l 0
ip os 456 a 0

ip cef
mpls ip
mpls label pro ldp
mpls ldp ro l 0 fo
mpls label range 6000 6999

int e 0/3
mpls ip

2、再配置IOU7、IOU8、IOU9和IOU10上的IP地址:

IOU7:

conf t
int e 0/0
no sh
int e 0/0.7
en do 7
ip add 78.1.1.7 255.255.255.0

IOU8:

conf t
int e 0/0
no sh
int e 0/0.8
en do 8
ip add 78.1.1.8 255.255.255.0

IOU9:

conf t
int s 2/0
en ppp
ip add 10.9.1.9 255.255.255.0
no sh

IOU10:

conf t
int e 0/1
ip add 10.9.1.10 255.255.255.0
no sh

3、配置IOU3和IOU4之间的EBGP,再配置IOU1和IOU6上的IBGP,让IOU1和IOU6之间实现通信:

IOU3:

int e 0/0
ip add 34.1.1.3 255.255.255.0
no sh

router bgp 123
bgp router-id 3.3.3.3
nei 34.1.1.4 remot 456
nei 34.1.1.4 send-label
net 1.1.1.1 mask 255.255.255.255

nei 1.1.1.1 remot 123
nei 1.1.1.1 up l 0
nei 1.1.1.1 next-hop-self

IOU4:

int e 0/0
ip add 34.1.1.4 255.255.255.0
no sh

router bgp 456
bgp router-id 4.4.4.4
nei 34.1.1.3 remot 123
nei 34.1.1.3 send-label
net 6.6.6.6 mask 255.255.255.255

nei 6.6.6.6 remot 456
nei 6.6.6.6 up l 0
nei 6.6.6.6 next-hop-self

IOU1:

router bgp 123
bgp router-id 1.1.1.1
nei 3.3.3.3 remot 123
nei 3.3.3.3 up l 0
nei 3.3.3.3 next-hop-self

IOU6:

router bgp 456
bgp router-id 6.6.6.6
nei 4.4.4.4 remot 456
nei 4.4.4.4 up l 0
nei 4.4.4.4 next-hop-self

IOU1#p 6.6.6.6 so l 0
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 6.6.6.6, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms

4、在IOU1上配置IOU7和IOU9的MPLS L2VPN连接:

IOU1:

int e 0/0
no sh
int e 0/0.7
en do 7
xconnect 6.6.6.6 78 en mpls

pseudowire-class T910
 encapsulation mpls
 interworking ip

int s 2/0
en ppp
xconnect 6.6.6.6 910 pw-class T910
no sh

5、在IOU6上配置IOU8和IOU10的MPLS L2VPN连接:

IOU6:

int e 0/0
no sh
int e 0/0.8
en do 8
xconnect 1.1.1.1 78 en mpls

pseudowire-class T910
 encapsulation mpls
 interworking ip

int e 0/1
no sh
xconnect 1.1.1.1 910 pw-class T910

这个时候你会发现,IOU1和IOU6上都收到了对方为伪线分配的MPLS标签(如下图所示):

IOU1#sh mpls l2transport binding 
  Destination Address: 6.6.6.6,VC ID: 78
    Local Label:  1003
        Cbit: 1,    VC Type: Ethernet,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]
                              // 注意,IOU6为VC ID等于78的伪线分配的MPLS标签确实
    Remote Label: 6003        // 是6003,后面要用到这个数字。
        Cbit: 1,    VC Type: Ethernet,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]
  Destination Address: 6.6.6.6,VC ID: 910
    Local Label:  1004
        Cbit: 1,    VC Type: IP,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]
    Remote Label: 6004
        Cbit: 1,    VC Type: IP,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]

IOU6#sh mpls l2transport binding 
  Destination Address: 1.1.1.1,VC ID: 78
    Local Label:  6003
        Cbit: 1,    VC Type: Ethernet,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]
    Remote Label: 1003
        Cbit: 1,    VC Type: Ethernet,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]
  Destination Address: 1.1.1.1,VC ID: 910
    Local Label:  6004
        Cbit: 1,    VC Type: IP,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]
    Remote Label: 1004
        Cbit: 1,    VC Type: IP,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]

注意:如果你在IOU1上sh mpls l2transport binding,你发现Remote Label显示的是unassigned,那么你就先到IOU6上sh mpls l2transport binding,然后再回IOU1看,Remote Label就有MPLS标签了。这估计是IOU的一个bug,详情请看:《【实验】域间MPLS L2VPN实验 —— Inter-AS option A/option 1(Back to Back)》,该篇文章关于这个bug有详细的阐述,这里不再赘述。

但是LFIB中却显示出接口是drop(如下图所示):

IOU1#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
1000       Pop Label  2.2.2.2/32       0             Et0/2      12.1.1.2    
1001       Pop Label  23.1.1.0/24      0             Et0/2      12.1.1.2    
1002       2001       3.3.3.3/32       0             Et0/2      12.1.1.2    
1003       No Label   l2ckt()          0             drop       
1004       No Label   l2ckt()          0             drop 

IOU6#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
6000       Pop Label  5.5.5.5/32       0             Et0/3      56.1.1.5    
6001       5000       4.4.4.4/32       0             Et0/3      56.1.1.5    
6002       Pop Label  45.1.1.0/24      0             Et0/3      56.1.1.5    
6003       No Label   l2ckt()          0             drop       
6004       No Label   l2ckt()          0             drop

为什么出接口是drop?我们在IOU1上traceroute IOU6看一下:

IOU1#traceroute 6.6.6.6 so l 0
Type escape sequence to abort.
Tracing the route to 6.6.6.6
VRF info: (vrf in name/id, vrf out name/id)
  1 12.1.1.2 [MPLS: Label 2001 Exp 0] 1 msec 0 msec 1 msec
  2 23.1.1.3 0 msec 1 msec 1 msec
  3 34.1.1.4 [MPLS: Label 4003 Exp 0] 2 msec 2 msec 1 msec
  4  *  *  * 
  5 56.1.1.6 2 msec 2 msec 1 msec

会看到第二跳(也就是数据包在23.1.1.3这一跳的时候)是没有MPLS标签的。

现在假设IOU1的LFIB里是有MPLS L2VPN的出标签的,然后在IOU7上ping IOU8,当数据包从IOU1转发给IOU2的时候,数据包将会打两层MPLS标签。内层打的是IOU6发给IOU1的MPLS L2VPN标签,外层打的是去往3.3.3.3的MPLS标签。如下图所示:

┏━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ ICMP ┃ D : 78.1.1.8 ┃ S : 78.1.1.7 ┃ Label : 6003 ┃ Label : 2001 ┃
┗━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┛
(注:上面的图是拿字符画的,手机上一自动换行就乱了,如果出现了变形,请在电脑上观看,下同)

当数据包到了IOU2上的时候,IOU2会查LFIB:

IOU2#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
2000       Pop Label  1.1.1.1/32       29226         Et0/2      12.1.1.1    
2001       Pop Label  3.3.3.3/32       29087         Et0/3      23.1.1.3

然后根据LFIB的指示,IOU2会Pop掉一层MPLS标签,然后再将数据包转发给IOU3:

┏━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ ICMP ┃ D : 78.1.1.8 ┃ S : 78.1.1.7 ┃ Label : 6003 ┃
┗━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┛

IOU3收到这个带有MPLS标签的数据包后,同样也会先查LFIB:

IOU3#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
3000       Pop Label  2.2.2.2/32       0             Et0/3      23.1.1.2    
3001       2000       1.1.1.1/32       26344         Et0/3      23.1.1.2    
3002       Pop Label  12.1.1.0/24      0             Et0/3      23.1.1.2    
3003       Pop Label  34.1.1.4/32      0             Et0/0      34.1.1.4

但是,IOU3在它的LFIB里找不到任何关于编号为6003的MPLS标签的信息。

其实IOU3找不到也不难理解:

  • 因为6.6.6.6/32的路由在IOU3上是以BGP IPv4路由的形式存在的,MPLS默认只给BGP路由的下一跳IP地址分配MPLS标签,不会为每条BGP路由分配MPLS标签。而《【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)BGP路由重分布到IGP》中是把BGP路由重分布到了IGP中,IGP上自然是每条IGP路由分配一个MPLS标签,所以不存在这个问题。
  • 同时,IOU1和IOU6之间跨了很多台路由器(包括IOU3)去建立LDP邻居关系,然后IOU1和IOU6为伪线分配的MPLS标签也只发给对方, 不发给其他路由器,IOU3自然也收不到这些MPLS L2VPN标签。

所以,这个时候伪线是不可能通的,而IOU1和IOU6的LFIB中显示出接口是drop也是这个原因。那如何让伪线连通起来呢?

根据MPLS一直以来的特性,如果一层MPLS标签解决不了的事情,那就用两层MPLS标签;如果两层MPLS标签还解决不了,那就再加一层MPLS标签。

我们先在IOU1上看一下,IOU1去往6.6.6.6只打了一层MPLS标签:

IOU1#sh ip cef 6.6.6.6
6.6.6.6/32
  nexthop 12.1.1.2 Ethernet0/2 label 2001

6、现在我们在IOU1/3/4/6的BGP上配置,让BGP为BGP IPv4路由分配一层MPLS标签:

IOU1:

router bgp 123
nei 3.3.3.3 send-label

IOU3:

router bgp 123
nei 1.1.1.1 send-label

IOU4:

router bgp 456
nei 6.6.6.6 send-label

IOU6:

router bgp 456
nei 4.4.4.4 send-label

现在再在IOU1上看一下,IOU1去往6.6.6.6又打了一层MPLS标签:

IOU1#sh ip cef 6.6.6.6
6.6.6.6/32
  nexthop 12.1.1.2 Ethernet0/2 label 2001 3004

2001显然是IOU2分配的,3004显然是IOU3分配的,如果再加上IOU6为IOU1分配的MPLS L2VPN标签,那么在伪线中传递的数据包将会出现三层MPLS标签的情况。

现在我们在IOU1上traceroute一下IOU6:

IOU1#traceroute 6.6.6.6 so l 0
Type escape sequence to abort.
Tracing the route to 6.6.6.6
VRF info: (vrf in name/id, vrf out name/id)
  1 12.1.1.2 [MPLS: Labels 2001/3004 Exp 0] 2 msec 1 msec 2 msec
  2 23.1.1.3 [MPLS: Label 3004 Exp 0] 1 msec 2 msec 1 msec
  3 34.1.1.4 [MPLS: Label 4003 Exp 0] 2 msec 2 msec 1 msec
  4  *  *  * 
  5 56.1.1.6 1 msec 1 msec 2 msec

没错,在IOU1上去往6.6.6.6的数据包打上了两层MPLS标签。如果是伪线里的数据包,还会多一层MPLS L2VPN标签(关于数据包报头结构的分析,请看下面的 “ 数据包的报头结构追踪 ” 部分)。

测试:

【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP
【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP

在IOU1和IOU6上sh mpls forwarding-table可以看到,MPLS L2VPN的MPLS标签都已经分配好了,出接口也有了:

IOU1#sh mpls forwarding-table
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
1000       Pop Label  2.2.2.2/32       0             Et0/2      12.1.1.2    
1001       Pop Label  23.1.1.0/24      0             Et0/2      12.1.1.2    
1002       2001       3.3.3.3/32       0             Et0/2      12.1.1.2    
1003       No Label   l2ckt(78)        0             Et0/0.7    point2point 
1004       No Label   l2ckt(910)       0             Se2/0      point2point

IOU6#sh mpls forwarding-table
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
6000       Pop Label  5.5.5.5/32       0             Et0/3      56.1.1.5    
6001       5000       4.4.4.4/32       0             Et0/3      56.1.1.5    
6002       Pop Label  45.1.1.0/24      0             Et0/3      56.1.1.5    
6003       No Label   l2ckt(78)        0             Et0/0.8    point2point 
6004       No Label   l2ckt(910)       0             Et0/1      point2point

现在我们用IOU7去ping IOU8,然后traceroute一下:

IOU7#p 78.1.1.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 78.1.1.8, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 2/2/3 ms

IOU7#traceroute 78.1.1.8
Type escape sequence to abort.
Tracing the route to 78.1.1.8
VRF info: (vrf in name/id, vrf out name/id)
  1 78.1.1.8 3 msec 2 msec 2 msec

通了!通过traceroute可以看到IOU7显示它跟IOU8是直连的。

接着我们用IOU9去ping IOU10,然后traceroute一下:

IOU9#p 10.9.1.10
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.9.1.10, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)

不通……

但是没关系,我们去IOU10上ping IOU9,然后traceroute一下:

IOU10#p 10.9.1.9 
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.9.1.9, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 8/10/12 ms

IOU10#traceroute 10.9.1.9
Type escape sequence to abort.
Tracing the route to 10.9.1.9
VRF info: (vrf in name/id, vrf out name/id)
  1 10.9.1.9 13 msec 9 msec 11 msec

通了!通过traceroute可以看到IOU10显示它跟IOU9是直连的。

再去IOU9上ping IOU10,然后traceroute一下:

IOU9#p 10.9.1.10
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.9.1.10, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 11/11/13 ms

IOU9#traceroute 10.9.1.10
Type escape sequence to abort.
Tracing the route to 10.9.1.10
VRF info: (vrf in name/id, vrf out name/id)
  1 10.9.1.10 12 msec 11 msec 11 msec

也通了!通过traceroute可以看到IOU9显示它跟IOU10也是直连的。

不知道为什么IOU9先ping IOU10是通不了的,不知道是不是IOU的bug,如果有知道的朋友可以在下方留言,大家互相交流一下。

数据包的报头结构追踪:

【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP
【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP

我们先追踪IOU7和IOU8之间的数据包,Ricky会在IOU1的e 0/0口IOU1的e 0/2口IOU4的e 0/0口IOU6的e 0/3口IOU6的e 0/0口用Wireshark抓取数据包,然后在IOU7上ping 78.1.1.8。

1、在IOU7上ping 78.1.1.8时,IOU1的e 0/0口上的抓包:

在IOU7上ping 78.1.1.8时,IOU1的e 0/0口上的抓包
在IOU7上ping 78.1.1.8时,IOU1的e 0/0口上的抓包

如上图所示,这是IOU7给IOU1发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | 802.1Q | Ethernet |

2、在IOU7上ping 78.1.1.8时,IOU1的e 0/2口上的抓包:

在IOU7上ping 78.1.1.8时,IOU1的e 0/2口上的抓包
在IOU7上ping 78.1.1.8时,IOU1的e 0/2口上的抓包

如上图所示,这是IOU1给IOU2发送的数据包的报头结构。IOU1会抹去802.1Q数据帧(VLAN ID = 7),同时打上三层MPLS标签和一个伪线控制字段,再打上最外层的Ethernet二层头部(因为IOU1/2/3/4/5/6之间的链路都是Ethernet,所以在这之间传递的数据包总会有一个最外层的Ethernet二层头部,关于最外层的这一层Ethernet二层头部下面不再赘述),然后将数据包发送给IOU2。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Label | Label | Ethernet |

IOU2收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU3。如果在IOU2和IOU3之间的链路上抓取数据包,数据包的报头结构应该是这样的:

| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Label | Ethernet |

在IOU2上sh mpls forwarding-table,会发现IOU2将会为这个ping包执行Pop Label(弹出一层MPLS标签):

IOU2#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
2000       Pop Label  1.1.1.1/32       87479         Et0/2      12.1.1.1    
2001       Pop Label  3.3.3.3/32       87805         Et0/3      23.1.1.3

3、在IOU7上ping 78.1.1.8时,IOU4的e 0/0口上的抓包:

在IOU7上ping 78.1.1.8时,IOU4的e 0/0口上的抓包
在IOU7上ping 78.1.1.8时,IOU4的e 0/0口上的抓包

如上图所示,这是IOU3给IOU4发送的数据包的报头结构。因为在IOU3上敲了一句命令:nei 34.1.1.4 send-label,所以IOU3会为BGP路由(包括6.6.6.6/32)分配MPLS标签。显然,这个ping包就是要通过MPLS标签穿越到IOU6(即6.6.6.6)上的,所以数据包到了IOU3上的时候IOU3还有MPLS标签,不会像Back to Back那样No Label。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Label | Ethernet |

在IOU3上sh mpls forwarding-table,会发现IOU3将会为这个ping包打上编号为4003的MPLS标签:

IOU3#sh mpls forwarding-table
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
3000       Pop Label  2.2.2.2/32       0             Et0/3      23.1.1.2    
3001       2000       1.1.1.1/32       81490         Et0/3      23.1.1.2    
3002       Pop Label  12.1.1.0/24      0             Et0/3      23.1.1.2    
3003       Pop Label  34.1.1.4/32      0             Et0/0      34.1.1.4    
3004       4003       6.6.6.6/32       34538         Et0/0      34.1.1.4

IOU4收到这个数据包后,会查LFIB,然后根据LFIB的指示将数据包转发给IOU5。如果在IOU4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:

| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Label | Ethernet |

在IOU4上sh mpls forwarding-table,会发现IOU4将会为这个ping包打上编号为5001的MPLS标签:

IOU4#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
4000       Pop Label  5.5.5.5/32       0             Et0/2      45.1.1.5    
4001       Pop Label  56.1.1.0/24      0             Et0/2      45.1.1.5    
4002       Pop Label  34.1.1.3/32      0             Et0/0      34.1.1.3    
4003       5001       6.6.6.6/32       82740         Et0/2      45.1.1.5    
4004       3001       1.1.1.1/32       35596         Et0/0      34.1.1.3

4、在IOU7上ping 78.1.1.8时,IOU6的e 0/3口上的抓包:

在IOU7上ping 78.1.1.8时,IOU6的e 0/3口上的抓包
在IOU7上ping 78.1.1.8时,IOU6的e 0/3口上的抓包

如上图所示,IOU5收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU6。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | Ethernet | 伪线控制字段 | Label | Ethernet |

在IOU5上sh mpls forwarding-table,会发现IOU5将会为这个ping包执行Pop Label(弹出一层MPLS标签):

IOU5#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
5000       Pop Label  4.4.4.4/32       159831        Et0/2      45.1.1.4    
5001       Pop Label  6.6.6.6/32       156323        Et0/3      56.1.1.6

5、在IOU7上ping 78.1.1.8时,IOU6的e 0/0口上的抓包:

在IOU7上ping 78.1.1.8时,IOU6的e 0/0口上的抓包
在IOU7上ping 78.1.1.8时,IOU6的e 0/0口上的抓包

如上图所示,这是IOU6给IOU8发送的数据包的报头结构。因为IOU8是IOU6的客户路由器,所以IOU6收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段,然后重新打上802.1Q数据帧(VLAN ID = 8),再转发给IOU8。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | 802.1Q | Ethernet |

这样,数据包就转发到目的地了。

【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP
【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP

接下来,我们追踪IOU9和IOU10之间的数据包,Ricky会在IOU1的s 2/0口IOU1的e 0/2口IOU4的e 0/0口IOU6的e 0/3口IOU6的e 0/1口用Wireshark抓取数据包,然后在IOU9上ping 10.9.1.10。

1、在IOU9上ping 10.9.1.10时,IOU1的s 2/0口上的抓包:

在IOU9上ping 10.9.1.10时,IOU1的s 2/0口上的抓包
在IOU9上ping 10.9.1.10时,IOU1的s 2/0口上的抓包

如上图所示,这是IOU9给IOU1发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | PPP |

2、在IOU9上ping 10.9.1.10时,IOU1的e 0/2口上的抓包:

在IOU9上ping 10.9.1.10时,IOU1的e 0/2口上的抓包
在IOU9上ping 10.9.1.10时,IOU1的e 0/2口上的抓包

如上图所示,这是IOU1给IOU2发送的数据包的报头结构。IOU1会抹去PPP二层头部(因为在IOU1上,910这条伪线配置了参数:interworking ip,interworking ip的意思是除了IP三层头部以外,其他二层头部都要被抹去),同时打上三层MPLS标签和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包发送给IOU2。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | 伪线控制字段 | Label | Label | Label | Ethernet |

这里需要注意的是,Wireshark把这个数据包识别错了,最内层不是Ethernet和Data,而是IP和ICMP。至于怎么判断Wireshark的识别是否出错,请看:《【实验】域间MPLS L2VPN实验 —— Inter-AS option A/option 1(Back to Back)》,该篇文章会有详细的解答,这里不再赘述。

IOU2收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU3。如果在IOU2和IOU3之间的链路上抓取数据包,数据包的报头结构应该是这样的:

| FCS | ICMP | IP | 伪线控制字段 | Label | Label | Ethernet |

在IOU2上sh mpls forwarding-table,会发现IOU2将会为这个ping包执行Pop Label(弹出一层MPLS标签):

IOU2#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
2000       Pop Label  1.1.1.1/32       87479         Et0/2      12.1.1.1    
2001       Pop Label  3.3.3.3/32       87805         Et0/3      23.1.1.3

3、在IOU9上ping 10.9.1.10时,IOU4的e 0/0口上的抓包:

在IOU9上ping 10.9.1.10时,IOU4的e 0/0口上的抓包
在IOU9上ping 10.9.1.10时,IOU4的e 0/0口上的抓包

如上图所示,这是IOU3给IOU4发送的数据包的报头结构。因为在IOU3上敲了一句命令:nei 34.1.1.4 send-label,所以IOU3会为BGP路由(包括6.6.6.6/32)分配MPLS标签。显然,这个ping包就是要通过MPLS标签穿越到IOU6(即6.6.6.6)上的,所以数据包到了IOU3上的时候IOU3还有MPLS标签,不会像Back to Back那样No Label。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | 伪线控制字段 | Label | Label | Ethernet |

在IOU3上sh mpls forwarding-table,会发现IOU3将会为这个ping包打上编号为4003的MPLS标签:

IOU3#sh mpls forwarding-table
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
3000       Pop Label  2.2.2.2/32       0             Et0/3      23.1.1.2    
3001       2000       1.1.1.1/32       81490         Et0/3      23.1.1.2    
3002       Pop Label  12.1.1.0/24      0             Et0/3      23.1.1.2    
3003       Pop Label  34.1.1.4/32      0             Et0/0      34.1.1.4    
3004       4003       6.6.6.6/32       34538         Et0/0      34.1.1.4

IOU4收到这个数据包后,会查LFIB,然后根据LFIB的指示将数据包转发给IOU5。如果在IOU4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:

| FCS | ICMP | IP | 伪线控制字段 | Label | Label | Ethernet |

在IOU4上sh mpls forwarding-table,会发现IOU4将会为这个ping包打上编号为5001的MPLS标签:

IOU4#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
4000       Pop Label  5.5.5.5/32       0             Et0/2      45.1.1.5    
4001       Pop Label  56.1.1.0/24      0             Et0/2      45.1.1.5    
4002       Pop Label  34.1.1.3/32      0             Et0/0      34.1.1.3    
4003       5001       6.6.6.6/32       82740         Et0/2      45.1.1.5    
4004       3001       1.1.1.1/32       35596         Et0/0      34.1.1.3

4、在IOU9上ping 10.9.1.10时,IOU6的e 0/3口上的抓包:

在IOU9上ping 10.9.1.10时,IOU6的e 0/3口上的抓包
在IOU9上ping 10.9.1.10时,IOU6的e 0/3口上的抓包

如上图所示,IOU5收到这个数据包后,会Pop Label(弹出一层MPLS标签),然后将数据包转发给IOU6。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | 伪线控制字段 | Label | Ethernet |

在IOU5上sh mpls forwarding-table,会发现IOU5将会为这个ping包执行Pop Label(弹出一层MPLS标签):

IOU5#sh mpls forwarding-table 
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop    
Label      Label      or Tunnel Id     Switched      interface              
5000       Pop Label  4.4.4.4/32       159831        Et0/2      45.1.1.4    
5001       Pop Label  6.6.6.6/32       156323        Et0/3      56.1.1.6

5、在IOU9上ping 10.9.1.10时,IOU6的e 0/1口上的抓包:

在IOU9上ping 10.9.1.10时,IOU6的e 0/1口上的抓包
在IOU9上ping 10.9.1.10时,IOU6的e 0/1口上的抓包

如上图所示,这是IOU6给IOU10发送的数据包的报头结构。因为IOU10是IOU6的客户路由器,所以IOU6收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段,然后重新打上Ethernet二层头部(这里之所以打上了Ethernet二层头部,是因为在IOU6和IOU10之间的网络类型就是Ethernet),再转发给IOU10。如果要画个简图的话,是如下这个样子的:

| FCS | ICMP | IP | Ethernet |

这样,数据包就转发到目的地了。

 

本文完。如有疑问,欢迎在下方留言;如本文有什么错误,欢迎在下方留言指正,谢谢。

 

其他相关文章:

这篇文章对你有帮助吗?

相关文章

发表评论?

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据