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

实验需求:
- 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的互连;
- IOU1和IOU6上不允许运行BGP。
实验步骤:
1、先配置两个互联网服务提供商(ISP)上的IP地址、IGP(OSPF)和MPLS:
IOU1:
conf t int e 0/2 router ospf 123 int r e 0/2 , l 0 ip cef int e 0/2 |
IOU2:
conf t int e 0/2 int e 0/3 router ospf 123 int r e 0/2-3 , l 0 ip cef int r e 0/2-3 |
IOU3:
conf t int e 0/3 router ospf 123 int r e 0/3 , l 0 ip cef int e 0/3 |
IOU4:
conf t int e 0/2 router ospf 456 int r e 0/2 , l 0 ip cef int e 0/2 |
IOU5:
conf t int e 0/2 int e 0/3 router ospf 456 int r e 0/2-3 , l 0 ip cef int r e 0/2-3 |
IOU6:
conf t int e 0/3 router ospf 456 int r e 0/3 , l 0 ip cef int e 0/3 |
2、再配置IOU7、IOU8、IOU9和IOU10上的IP地址:
IOU7:
conf t |
IOU8:
conf t |
IOU9:
conf t |
IOU10:
conf t |
3、配置IOU3和IOU4之间的EBGP,并将BGP路由重分布到IGP,让IOU1和IOU6之间实现通信:
IOU3:
int e 0/0 router bgp 123 router ospf 123 |
IOU4:
int e 0/0 router bgp 456 router ospf 456 |
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上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 2002 6.6.6.6/32 0 Et0/2 12.1.1.2 1004 No Label l2ckt(78) 0 Et0/0.7 point2point 1005 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 5002 1.1.1.1/32 0 Et0/3 56.1.1.5 6004 No Label l2ckt(78) 0 Et0/0.8 point2point 6005 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 = 9/11/13 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 12 msec 12 msec 12 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 = 10/11/12 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 11 msec 11 msec 11 msec
也通了!通过traceroute可以看到IOU9显示它跟IOU10也是直连的。
不知道为什么IOU9先ping IOU10是通不了的,不知道是不是IOU的bug,如果有知道的朋友可以在下方留言,大家互相交流一下。
数据包的报头结构追踪:

我们先追踪IOU7和IOU8之间的数据包,Ricky会在IOU1的e 0/0口、IOU2的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给IOU1发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | 802.1Q | Ethernet |
2、在IOU7上ping 78.1.1.8时,IOU2的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收到这个数据包后,会查LFIB,然后根据LFIB的指示将数据包转发给IOU3,不会像Back to Back那样Pop Label。如果在IOU2和IOU3之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | Eth |
在IOU2上sh mpls forwarding-table,会发现IOU2将会为这个ping包打上编号为3004的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 47046 Et0/2 12.1.1.1 2001 Pop Label 3.3.3.3/32 0 Et0/3 23.1.1.3 2002 3004 6.6.6.6/32 50522 Et0/3 23.1.1.3
3、在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 | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | Eth |
在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 60096 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 60914 Et0/0 34.1.1.4
IOU4收到这个数据包后,会查LFIB,然后根据LFIB的指示将数据包转发给IOU5。如果在IOU4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | Ethernet | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | Eth |
在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 77094 Et0/2 45.1.1.5 4004 3001 1.1.1.1/32 76356 Et0/0 34.1.1.3
4、在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 0 Et0/2 45.1.1.4 5001 Pop Label 6.6.6.6/32 84222 Et0/3 56.1.1.6 5002 4004 1.1.1.1/32 88376 Et0/2 45.1.1.4
5、在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 |
这样,数据包就转发到目的地了。

接下来,我们追踪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给IOU1发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | PPP |
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收到这个数据包后,会查LFIB,然后根据LFIB的指示将数据包转发给IOU3,不会像Back to Back那样Pop Label。如果在IOU2和IOU3之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | Ethernet |
在IOU2上sh mpls forwarding-table,会发现IOU2将会为这个ping包打上编号为3004的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 47046 Et0/2 12.1.1.1 2001 Pop Label 3.3.3.3/32 0 Et0/3 23.1.1.3 2002 3004 6.6.6.6/32 50522 Et0/3 23.1.1.3
3、在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 | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | 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 60096 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 60914 Et0/0 34.1.1.4
IOU4收到这个数据包后,会查LFIB,然后根据LFIB的指示将数据包转发给IOU5。如果在IOU4和IOU5之间的链路上抓取数据包,数据包的报头结构应该是这样的:
| FCS | ICMP | IP | 伪线控制字段 | 内层MPLS标签 | 外层MPLS标签 | 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 77094 Et0/2 45.1.1.5 4004 3001 1.1.1.1/32 76356 Et0/0 34.1.1.3
4、在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 0 Et0/2 45.1.1.4 5001 Pop Label 6.6.6.6/32 84222 Et0/3 56.1.1.6 5002 4004 1.1.1.1/32 88376 Et0/2 45.1.1.4
5、在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 |
这样,数据包就转发到目的地了。
本文完。如有疑问,欢迎在下方留言;如本文有什么错误,欢迎在下方留言指正,谢谢。
其他相关文章:
- 【实验】域间MPLS L2VPN实验 —— Inter-AS option A/option 1(Back to Back)
- 【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)BGP路由重分布到IGP
- 【实验】域间MPLS L2VPN实验 —— Inter-AS option B/option 2(End to End)PE上均开启BGP
- 【实验】域间MPLS L2VPN实验 —— Inter-AS option 3(PseudoWire Stitching at ASBRs,伪线缝补)
- 关于域间MPLS L2VPN实验(共四个实验)的数据包报头结构小结
发表评论?