【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)

实验环境:

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

【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)
【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)

实验需求:

  • IOU1、IOU2和R3是一个互联网服务提供商(ISP),R4、IOU5和IOU6是另一个互联网服务提供商(ISP);
  • IOU7和IOU8分别通过802.1Q封装连接各自的互联网服务提供商(ISP),IOU7和IOU8之间要实现MPLS L2VPN通信;
  • IOU9通过PPP封装连接自己的互联网服务提供商(ISP),IOU10通过Ethernet封装连接自己的互联网服务提供商(ISP),IOU9和IOU10之间要实现MPLS L2VPN通信;
  • R3和R4之间(两个互联网服务提供商的边界)通过option 3(PseudoWire Stitching at ASBRs,伪线缝补)的方式进行MPLS L2VPN的互连;
  • 注意!IOU没法做伪线缝补,所以R3和R4 Ricky选择的是GNS3下的Router,版本号为15.2(4)M2的7200系列思科路由器
    R3#sh version 
    Cisco IOS Software, 7200 Software (C7200-ADVENTERPRISEK9-M), Version 15.2(4)
    M2, RELEASE SOFTWARE (fc2)
    ......

实验步骤:

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

R3:

conf t
int l 0
ip add 3.3.3.3 255.255.255.255

int e 5/0
ip add 23.1.1.3 255.255.255.0
no sh

router ospf 123
router-id 3.3.3.3

int r e 5/0 , 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 5/0
mpls ip

R4:

conf t
int l 0
ip add 4.4.4.4 255.255.255.255

int e 5/0
ip add 45.1.1.4 255.255.255.0
no sh

router ospf 456
router-id 4.4.4.4

int r e 5/0 , 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 5/0
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、配置R3和R4之间的EBGP:

R3:

int f 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 3.3.3.3 mask 255.255.255.255

R4:

int f 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 4.4.4.4 mask 255.255.255.255

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

IOU1:

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

pseudowire-class T910
 encapsulation mpls
 interworking ip

int s 2/0
en ppp
xconnect 3.3.3.3 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 4.4.4.4 78 en mpls

pseudowire-class T910
 encapsulation mpls
 interworking ip

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

6、在R3和R4上配置PseudoWire Stitching at ASBRs(伪线缝补):

伪线缝补的意思其实很好理解:因为R3和R4是两个互联网服务提供商(ISP)的边界,所以到了R3和R4这里MPLS标签就断开了,伪线自然也就断开了,然后现在有一种技术可以把伪线缝补起来,这种技术就叫做伪线缝补。

R3:

l2 vfi 78 point-to-point
nei 1.1.1.1 78 en mpls
nei 4.4.4.4 78 en mpls

pseudowire-class T910
encapsulation mpls

l2 vfi 910 point-to-point
nei 1.1.1.1 910 pw-class T910
nei 4.4.4.4 910 pw-class T910

R4:

l2 vfi 78 point-to-point
nei 6.6.6.6 78 en mpls
nei 3.3.3.3 78 en mpls

pseudowire-class T910
encapsulation mpls

l2 vfi 910 point-to-point
nei 6.6.6.6 910 pw-class T910
nei 3.3.3.3 910 pw-class T910

注意:R3和R4的伪线类不能设置成为:

pseudowire-class T910
encapsulation mpls
interworking ip

否则R3和R4上会报错:

R3(config-pw-class)#l2 vfi 910 point-to-point
R3(config-vfi)#nei 1.1.1.1 910 pw-class T910
Interworking must not be set in pw-class T910
R3(config-vfi)#nei 4.4.4.4 910 pw-class T910
Interworking must not be set in pw-class T910

R4(config-pw-class)#l2 vfi 910 point-to-point
R4(config-vfi)#nei 6.6.6.6 910 pw-class T910
Interworking must not be set in pw-class T910
R4(config-vfi)#nei 3.3.3.3 910 pw-class T910
Interworking must not be set in pw-class T910

测试:

【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)
【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)

在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

在R3和R4上sh mpls forwarding-table可以看到,R3和R4上也有相关伪线的MPLS标签:

R3#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             Et5/0      23.1.1.2    
3001       2000       1.1.1.1/32       0             Et5/0      23.1.1.2    
3002       Pop Label  12.1.1.0/24      0             Et5/0      23.1.1.2    
3003       Pop Label  34.1.1.4/32      0             Fa0/0      34.1.1.4    
3004       No Label   l2ckt(78)        0             Et5/0      23.1.1.2    
3005       No Label   l2ckt(910)       0             Et5/0      23.1.1.2    
3006       No Label   l2ckt(78)        0             Fa0/0      34.1.1.4    
3007       No Label   l2ckt(910)       0             Fa0/0      34.1.1.4

R4#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             Et5/0      45.1.1.5    
4001       Pop Label  56.1.1.0/24      0             Et5/0      45.1.1.5    
4002       Pop Label  34.1.1.3/32      0             Fa0/0      34.1.1.3    
4003       5001       6.6.6.6/32       0             Et5/0      45.1.1.5    
4004       No Label   l2ckt(78)        0             Et5/0      45.1.1.5    
4005       No Label   l2ckt(78)        0             Fa0/0      34.1.1.3    
4006       No Label   l2ckt(910)       0             Fa0/0      34.1.1.3    
4007       No Label   l2ckt(910)       0             Et5/0      45.1.1.5

现在我们用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 = 33/38/40 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 37 msec 39 msec 40 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 = 41/46/51 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 44 msec 49 msec 50 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 = 45/49/51 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 44 msec 40 msec 50 msec

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

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

数据包的报头结构追踪:

【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)
【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)

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

注意:我在R4的f 0/0口上抓包,但是Wireshark起不来,所以就抓不到了,这很尴尬…… 但是依旧也可以通过sh mpls forwarding-table等命令来查看数据包的MPLS标签是如何变化的。

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 | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | Eth |

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

| FCS | ICMP | IP | Ethernet | 伪线控制字段 | 内层MPLS标签 | 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       21709         Et0/2      12.1.1.1    
2001       Pop Label  3.3.3.3/32       22642         Et0/3      23.1.1.3

R3收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段:

| FCS | ICMP | IP | Ethernet |

在R3上sh mpls forwarding-table,会发现R3将会为这个ping包执行No Label(弹出所有MPLS标签):

R3#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             Et5/0      23.1.1.2    
3001       2000       1.1.1.1/32       0             Et5/0      23.1.1.2    
3002       Pop Label  12.1.1.0/24      0             Et5/0      23.1.1.2    
3003       Pop Label  34.1.1.4/32      0             Fa0/0      34.1.1.4    
3004       No Label   l2ckt(78)        1634          Et5/0      23.1.1.2    
3005       No Label   l2ckt(910)       1596          Et5/0      23.1.1.2    
3006       No Label   l2ckt(78)        1552          Fa0/0      34.1.1.4    
3007       No Label   l2ckt(910)       2092          Fa0/0      34.1.1.4

数据包现在就会转发给R4了吗?显然还没有完,不要忘了我们在R3和R4之间做了伪线缝补。如下图所示,数据包在R3上从第一段伪线出来以后,紧接着就进入到了第二段伪线:

VC ID = 78的三段伪线
VC ID = 78的三段伪线

在R3上sh mpls l2transport binding 78,可以看到R4为编号为78的这条伪线分配的MPLS标签是4004:

R3#sh mpls l2transport binding 78 
  Destination Address: 1.1.1.1,  VC ID: 78
    Local Label:  3006
        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: 4.4.4.4,  VC ID: 78
    Local Label:  3004
        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: 4004
        Cbit: 1,    VC Type: Ethernet,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]

如果去往伪线的另一端(这里伪线的另一端是R4)还有MPLS标签的话,还会像IOU1一样再打上一层最外层的MPLS标签,由下图可知,在R3上去往R4是不打MPLS标签的:

R3#sh ip cef 4.4.4.4
4.4.4.4/32
  nexthop 34.1.1.4 FastEthernet0/0

所以,最终数据包会在R3上打上一层编号为4004的MPLS标签和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包转发给R4。如果在R3和R4之间的链路上抓取数据包,数据包的报头结构应该是这样的:

| FCS | ICMP | IP | Ethernet | 伪线控制字段 | 内层MPLS标签(4004) | Ethernet |

R4收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段:

| FCS | ICMP | IP | Ethernet |

在R4上sh mpls forwarding-table,会发现R4将会为这个ping包执行No Label(弹出所有MPLS标签):

R4#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             Et5/0      45.1.1.5    
4001       Pop Label  56.1.1.0/24      0             Et5/0      45.1.1.5    
4002       5001       6.6.6.6/32       0             Et5/0      45.1.1.5    
4003       Pop Label  34.1.1.3/32      0             Fa0/0      34.1.1.3    
4004       No Label   l2ckt(78)        646           Et5/0      45.1.1.5    
4005       No Label   l2ckt(78)        626           Fa0/0      34.1.1.3    
4006       No Label   l2ckt(910)       1332          Fa0/0      34.1.1.3    
4007       No Label   l2ckt(910)       1926          Et5/0      45.1.1.5

这个时候也还没有完,R4上也是做了伪线缝补的,所以数据包在R4上从第二段伪线出来以后,紧接着就进入到了第三段伪线。

在R4上sh mpls l2transport binding 78,可以看到R6为编号为78的这条伪线分配的MPLS标签是6003:

R4#sh mpls l2transport binding 78
  Destination Address: 3.3.3.3,  VC ID: 78
    Local Label:  4004
        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: 3004
        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: 78
    Local Label:  4005
        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: 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]

在R4上去往伪线的另一端(这里伪线的另一端是R6)还有MPLS标签,所以还会再打上一层最外层的MPLS标签,由下图可知,在R4上去往R6打的MPLS标签是5001:

R4#sh ip cef 6.6.6.6
6.6.6.6/32
  nexthop 45.1.1.5 Ethernet5/0 label 5001

所以,最终数据包会在R4上打上两层MPLS标签(内层6003,外层5001)和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包发送给IOU5。如果在R4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:

| FCS | ICMP | IP | Eth | 伪线控制字段 | 内层标签(6003) | 外层标签(5001) | Eth |

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

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

如上图所示,这是R4给IOU5发送的数据包的报头结构,该数据包外层MPLS标签是5001,内层MPLS标签是6003。虽然没法在R4的f 0/0口上抓包,但是这个截图足以证明我上面的描述。

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 | 伪线控制字段 | 内层MPLS标签 | 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       46338         Et0/2      45.1.1.4    
5001       Pop Label  6.6.6.6/32       46549         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 3(PseudoWire Stitching at ASBRs,伪线缝补)
【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)

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

注意:我在R4的f 0/0口上抓包,但是Wireshark起不来,所以就抓不到了,这很尴尬…… 但是依旧也可以通过sh mpls forwarding-table等命令来查看数据包的MPLS标签是如何变化的。

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 | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | Ethernet |

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

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

| FCS | ICMP | IP | 伪线控制字段 | 内层MPLS标签 | 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       21709         Et0/2      12.1.1.1    
2001       Pop Label  3.3.3.3/32       22642         Et0/3      23.1.1.3

R3收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段:

| FCS | ICMP | IP |

在R3上sh mpls forwarding-table,会发现R3将会为这个ping包执行No Label(弹出所有MPLS标签):

R3#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             Et5/0      23.1.1.2    
3001       2000       1.1.1.1/32       0             Et5/0      23.1.1.2    
3002       Pop Label  12.1.1.0/24      0             Et5/0      23.1.1.2    
3003       Pop Label  34.1.1.4/32      0             Fa0/0      34.1.1.4    
3004       No Label   l2ckt(78)        1634          Et5/0      23.1.1.2    
3005       No Label   l2ckt(910)       1596          Et5/0      23.1.1.2    
3006       No Label   l2ckt(78)        1552          Fa0/0      34.1.1.4    
3007       No Label   l2ckt(910)       2092          Fa0/0      34.1.1.4

数据包现在只要再打上Ethernet二层头部然后就会转发给R4了吗?显然还没有完,不要忘了我们在R3和R4之间做了伪线缝补。如下图所示,数据包在R3上从第一段伪线出来以后,紧接着就进入到了第二段伪线:

VC ID = 910的三段伪线
VC ID = 910的三段伪线

在R3上sh mpls l2transport binding 910,可以看到R4为编号为910的这条伪线分配的MPLS标签是4007:

R3#sh mpls l2transport binding 910
  Destination Address: 1.1.1.1,  VC ID: 910
    Local Label:  3007
        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]
  Destination Address: 4.4.4.4,  VC ID: 910
    Local Label:  3005
        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: 4007
        Cbit: 1,    VC Type: IP,    GroupID: 0
        MTU: 1500,   Interface Desc: n/a
        VCCV: CC Type: CW [1], RA [2]
              CV Type: LSPV [2]

如果去往伪线的另一端(这里伪线的另一端是R4)还有MPLS标签的话,还会像IOU1一样再打上一层最外层的MPLS标签,由下图可知,在R3上去往R4是不打MPLS标签的:

R3#sh ip cef 4.4.4.4
4.4.4.4/32
  nexthop 34.1.1.4 FastEthernet0/0

所以,最终数据包会在R3上打上一层编号为4007的MPLS标签和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包转发给R4。如果在R3和R4之间的链路上抓取数据包,数据包的报头结构应该是这样的:

| FCS | ICMP | IP | 伪线控制字段 | 内层MPLS标签(4007) | Ethernet |

R4收到这个数据包后,会剥离最外层的Ethernet二层头部,No Label(弹出所有MPLS标签),删除伪线控制字段:

| FCS | ICMP | IP |

在R4上sh mpls forwarding-table,会发现R4将会为这个ping包执行No Label(弹出所有MPLS标签):

R4#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             Et5/0      45.1.1.5    
4001       Pop Label  56.1.1.0/24      0             Et5/0      45.1.1.5    
4002       5001       6.6.6.6/32       0             Et5/0      45.1.1.5    
4003       Pop Label  34.1.1.3/32      0             Fa0/0      34.1.1.3    
4004       No Label   l2ckt(78)        646           Et5/0      45.1.1.5    
4005       No Label   l2ckt(78)        626           Fa0/0      34.1.1.3    
4006       No Label   l2ckt(910)       1332          Fa0/0      34.1.1.3    
4007       No Label   l2ckt(910)       1926          Et5/0      45.1.1.5

这个时候也还没有完,R4上也是做了伪线缝补的,所以数据包在R4上从第二段伪线出来以后,紧接着就进入到了第三段伪线。

在R4上sh mpls l2transport binding 910,可以看到R6为编号为910的这条伪线分配的MPLS标签是6004:

R4#sh mpls l2transport binding 910
  Destination Address: 3.3.3.3,  VC ID: 910
    Local Label:  4007
        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: 3005
        Cbit: 1,    VC Type: IP,    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:  4006
        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]

在R4上去往伪线的另一端(这里伪线的另一端是R6)还有MPLS标签,所以还会再打上一层最外层的MPLS标签,由下图可知,在R4上去往R6打的MPLS标签是5001:

R4#sh ip cef 6.6.6.6
6.6.6.6/32
  nexthop 45.1.1.5 Ethernet5/0 label 5001

所以,最终数据包会在R4上会打上两层MPLS标签(内层6004,外层5001)和一个伪线控制字段,再打上最外层的Ethernet二层头部,然后将数据包发送给IOU5。如果在R4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:

| FCS | ICMP | IP | 伪线控制字段 | 内层标签(6004) | 外层标签(5001) | Eth |

 

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

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

如上图所示,这是R4给IOU5发送的数据包的报头结构,该数据包外层MPLS标签是5001,内层MPLS标签是6004。虽然没法在R4的f 0/0口上抓包,但是这个截图足以证明我上面的描述。

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 | 伪线控制字段 | 内层MPLS标签 | 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       46338         Et0/2      45.1.1.4    
5001       Pop Label  6.6.6.6/32       46549         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来减少垃圾评论。了解我们如何处理您的评论数据