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

实验需求:
- IOU2、IOU3 和 IOU4 上运行 IGP(OSPF 234)和 MPLS;
- 在 IOU2 和 IOU4 上配置 IP / L2TPv3,让 IOU1 和 IOU7 实现 L2VPN 通信;
- 在 IOU2 和 IOU4 上配置 IP / L2TPv3,让 IOU5 和 IOU6 实现 L2VPN 通信;
- 在 IOU2 和 IOU4 上配置 IP / L2TPv3,让 IOU8 和 IOU9 实现 L2VPN 通信;
- 因为是 L2VPN,所以 IOU2 的 s 2/0、e 0/1 和 e 1/0 接口均不需要配置 IP 地址,IOU4 的 s 2/0、s 2/1 和 e 1/0 接口也不需要配置 IP 地址。
其他相关文章:
什么是 IP / L2TPv3?IP / L2TPv3 属于 L2VPN → Point-to-Point → Like-to-Like(Any-to-Any) → IP / L2TPv3 这个分类,详情请看:《L2VPN传统结构》- 如果您想了解的是 L2TPv3 这个协议本身的内容,请看:《L2TPv3 概述》
实验步骤:
1、先配置 IP 地址和 IGP(OSPF 234):
IOU2:
conf t int e 0/2 router ospf 234 int r e 0/2 , l 0 |
IOU3:
conf t int e 0/2 int e 0/3 router ospf 234 int r e 0/2-3 , l 0 |
IOU4:
conf t int e 0/3 router ospf 234 int r e 0/3 , l 0 |
|
IOU1:
conf t |
IOU7:
conf t |
IOU5:
conf t |
IOU6:
conf t |
IOU8:
conf t |
IOU9:
conf t |
2、配置 IOU1 和 IOU7 上的 IP / L2TPv3:

IOU2:
pseudowire-class T17 int s 2/0 |
IOU4:
pseudowire-class T17 int s 2/0 |
关于配置命令:
- pseudowire-class T17:首先要配置一个 pseudowire-class(伪线类),类名为 T17;
- encapsulation l2tpv3:然后将封装格式设置成 L2TPv3,与之对应的还有一个 MPLS 封装;
- ip local interface l 0:再设置一个 loopback 口,这样路由器就会使用这个 loopback 口作为源 IP 地址,跟其他路由器建立伪线(类似于 BGP 中的 update-source);
- xconnect 4.4.4.4 17 pw-class T17 中的 “4.4.4.4” 指的是伪线对端路由器的 IP 地址,伪线会在 2.2.2.2 和 4.4.4.4 之间建立;
- xconnect 4.4.4.4 17 pw-class T17 中的 “17” 指的是 VC ID value(如下图所示),路由器通过 VC ID 来区分每条虚拟线路(如果是同一条虚拟线路,那么两台路由器上配置的 VC ID 必须一致)。
IOU2(config)#int s 2/0 IOU2(config-if)#xconnect 4.4.4.4 ? <1-4294967295> Enter VC ID value
其他相关文章:
- 通过 MPLS 也可以实现 L2VPN,详情请看:《【实验】MPLS L2VPN下,Point-to-Point的AToM实验》
此时,你会看到在 IOU2 和 IOU4 上弹出了一条 log 日志,pseudowire0 接口起来了:
IOU4(config-if)#
*Nov 22 04:51:55.714: %LINEPROTO-5-UPDOWN: Line protocol on Interface pseudowire0,
changed state to up
现在 IOU1 就可以 ping 通 IOU7 了:
IOU1#p 10.1.1.7 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.1.1.7, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 17/19/20 ms
traceroute 一下你会发现看不到 IOU2、IOU3 和 IOU4,相当于 IOU1 和 IOU7 是 “直连” 的:
IOU1#tra 10.1.1.7 Type escape sequence to abort. Tracing the route to 10.1.1.7 VRF info: (vrf in name/id, vrf out name/id) 1 10.1.1.7 21 msec 19 msec 19 msec IOU1#
在 IOU4 上 sh l2tp tunnel summary 就会看到现在建立了一条 tunnel(控制会话)和一条 session(数据会话):
IOU4#sh l2tp tunnel summary L2TP Tunnel Information Total tunnels 1 sessions 1 LocTunID RemTunID Remote Name State Remote Address Sessn L2TP Class/ Count VPDN Group 1538966429 2131524028 IOU2 est 2.2.2.2 1 l2tp_default_cl IOU4#
在 IOU4 上 sh l2tp tunnel all 可以看到思科路由器是采用 IP 协议号为 115 的形式进行封装的:
IOU4#sh l2tp tunnel all L2TP Tunnel Information Total tunnels 1 sessions 1 Tunnel id 1538966429 is up, remote id is 2131524028, 1 active sessions Locally initiated tunnel Tunnel state is established, time since change 00:06:22 Tunnel transport is IP (115) Remote tunnel name is IOU2 Internet Address 2.2.2.2, port 0 Local tunnel name is IOU4 Internet Address 4.4.4.4, port 0 L2TP class for tunnel is l2tp_default_class Counters, taking last clear into account: 52 packets sent, 52 received 4537 bytes sent, 4537 received Last clearing of counters never Counters, ignoring last clear: 52 packets sent, 52 received 4537 bytes sent, 4537 received Control Ns 11, Nr 9 Local RWS 1024 (default), Remote RWS 1024 Control channel Congestion Control is disabled Tunnel PMTU checking disabled Retransmission time 1, max 1 seconds Unsent queuesize 0, max 0 Resend queuesize 0, max 2 Total resends 0, ZLB ACKs sent 7 Total out-of-order dropped pkts 0 Total out-of-order reorder pkts 0 Total peer authentication failures 0 Current no session pak queue check 0 of 5 Retransmit time distribution: 0 0 0 0 0 0 0 0 0 Control message authentication is disabled IOU4#
其他相关文章:
- 除了采用 IP 协议号为 115 的形式封装 L2TPv3 报头以外,还有一种是使用 UDP 端口号 1701,详情请看:《L2TPv3 概述》。
在 IOU4 上 sh l2tun session all 可以看到 L2VPN 数据会话的封装格式和 L2VPN 所在的接口,以及其他一些详细的信息:
IOU4#sh l2tun session all L2TP Session Information Total tunnels 1 sessions 1 Session id 1797294749 is up, logical session id 32775, tunnel id 1538966429 Remote session id is 1171276197, remote tunnel id 2131524028 Locally initiated session Unique ID is 0 Session Layer 2 circuit, type is HDLC, name is Serial2/0 Session vcid is 17 Circuit state is UP Local circuit state is UP Remote circuit state is UP Call serial number is 3416000001 Remote tunnel name is IOU2 Internet address is 2.2.2.2 Local tunnel name is IOU4 Internet address is 4.4.4.4 IP protocol 115 Session is L2TP signaled Session state is established, time since change 00:12:00 93 Packets sent, 92 received 7768 Bytes sent, 7423 received Last clearing of counters never Counters, ignoring last clear: 93 Packets sent, 92 received 7768 Bytes sent, 7423 received Receive packets dropped: out-of-order: 0 other: 0 total: 0 Send packets dropped: exceeded session MTU: 0 other: 0 total: 0 DF bit off, ToS reflect disabled, ToS value 0, TTL value 255 Sending UDP checksums are disabled Received UDP checksums are verified No session cookie information available FS cached header information: encap size = 24 bytes 45000014 00000000 ff73af6b 04040404 02020202 45d041a5 Sequencing is off Conditional debugging is disabled SSM switch id is 4096, SSM segment id is 8202 IOU4#
3、配置 IOU5 和 IOU6 上的 IP / L2TPv3:

IOU1 上是通过 serial 口(HDLC 封装)连接的 IOU2,IOU7 也是通过 serial 口(HDLC 封装)连接的 IOU4,那如果(两个客户路由器上)连接服务提供商的接口不同(或者二层封装格式不同)可不可以互通呢?答案是:可以的。
现在 IOU6 是通过 e 0/1 口(Ethernet 封装)连接的 IOU2,而 IOU5 是通过 s 2/1 口(PPP 封装)连接的 IOU4。
IOU2:
pseudowire-class T56 int e 0/1 |
IOU4:
pseudowire-class T56 int s 2/1 |
IOU5 和 IOU6 之间的伪线配置相对于 IOU1 和 IOU7 之间的伪线配置,多了一个 interworking ip。interworking ip 的含义是在伪线里只允许传递 IP 三层头部,也就是说二层头部将会被全部擦除(文章下方对这部分会有详细的讲解)。
注意:IOU4 和 IOU5 的链路上是要配置 PPP 封装的。如果不配置 PPP 封装,在配置 xconnect 时,就会报下面的错误:
IOU4(config-if)#int s 2/1
IOU4(config-if)#xconnect 2.2.2.2 56 pw-class T56
Interworking specified in pw-class is not supported on this interface
现在 IOU6 就可以 ping 通 IOU5 了,traceroute 也会发现 IOU5 和 IOU6 之间显示是直连的:
IOU6#p 100.1.1.5 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 100.1.1.5, timeout is 2 seconds: .!!!! Success rate is 80 percent (4/5), round-trip min/avg/max = 10/11/13 ms IOU6#traceroute 100.1.1.5 Type escape sequence to abort. Tracing the route to 100.1.1.5 VRF info: (vrf in name/id, vrf out name/id) 1 100.1.1.5 10 msec 9 msec 9 msec IOU6#
在 IOU4 上 sh l2tun tunnel summary 可以看到现在 session(数据会话)变成了两条,而 tunnel(控制会话)还是一条:
IOU4#sh l2tun tunnel summary L2TP Tunnel Information Total tunnels 1 sessions 2 LocTunID RemTunID Remote Name State Remote Address Sessn L2TP Class/ Count VPDN Group 1538966429 2131524028 IOU2 est 2.2.2.2 2 l2tp_default_cl
其他相关文章:
- 如果您想了解PPP封装的报文格式,请看:《链路层常见报文格式及长度》
4、配置 IOU8 和 IOU9 上的 IP / L2TPv3:

IOU8 和 IOU9 上连接服务提供商的接口采用的都是 802.1Q 子接口:
IOU2:
pseudowire-class T89 int e 1/0 |
IOU4:
pseudowire-class T89 int e 1/0 |
interworking ethernet 的含义是在伪线里只允许传递 Ethernet 二层头部,也就是说其他二层头部将会被全部擦除(文章下方对这部分会有详细的讲解)。
这个时候发现 IOU8 ping 不通 IOU9:
IOU8#p 200.1.1.9 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 200.1.1.9, timeout is 2 seconds: ..... Success rate is 0 percent (0/5) IOU8#p 200.1.1.9 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 200.1.1.9, timeout is 2 seconds: ..... Success rate is 0 percent (0/5)
在 IOU2 上 sh l2tun tunnel summary 会发现 session (数据会话)还是两条:
IOU2#sh l2tun tunnel summary L2TP Tunnel Information Total tunnels 1 sessions 2 LocTunID RemTunID Remote Name State Remote Address Sessn L2TP Class/ Count VPDN Group 2131524028 1538966429 IOU4 est 4.4.4.4 2 l2tp_default_cl
这很奇怪,估计是 IOU 的 bug 。现在我们在 IOU4 上 sh l2tun tunnel summary,发现这边的 session (数据会话)就是三条的:
IOU4#sh l2tun tunnel summary L2TP Tunnel Information Total tunnels 1 sessions 3 LocTunID RemTunID Remote Name State Remote Address Sessn L2TP Class/ Count VPDN Group 1916316032 2814769188 IOU2 est 2.2.2.2 3 l2tp_default_cl
再回到 IOU2 上 sh l2tun tunnel summary 会发现 session (数据会话)也变成三条了:
IOU2#sh l2tun tunnel summary L2TP Tunnel Information Total tunnels 1 sessions 3 LocTunID RemTunID Remote Name State Remote Address Sessn L2TP Class/ Count VPDN Group 2814769188 1916316032 IOU4 est 4.4.4.4 3 l2tp_default_cl
所以,如果你发现 IOU8 和 IOU9 之间 ping 不通,那你就在 IOU2 和 IOU4 上各 sh l2tun tunnel summary 一次,就可以了。
现在 IOU8 就可以 ping 通 IOU9 了,traceroute 也会发现 IOU8 和 IOU9 之间显示是直连的:
IOU8#p 200.1.1.9 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 200.1.1.9, timeout is 2 seconds: .!!!! Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/1 ms IOU8#traceroute 200.1.1.9 Type escape sequence to abort. Tracing the route to 200.1.1.9 VRF info: (vrf in name/id, vrf out name/id) 1 200.1.1.9 2 msec 1 msec 2 msec IOU8#
实验完成。
5、如果要在 IOU2 和 IOU4 之间做 L2TPv3 的认证,应该要这么配置:
IOU2:
conf t int e 0/2 router ospf 234 int r e 0/2 , l 0 l2tp-class IOU2IOU4 pseudowire-class T17 int s 2/0 pseudowire-class T56 int e 0/1 pseudowire-class T89 int e 1/0 |
IOU4:
conf t int e 0/3 router ospf 234 int r e 0/3 , l 0 l2tp-class IOU2IOU4 pseudowire-class T17 int s 2/0 pseudowire-class T56 int s 2/1 pseudowire-class T89 int e 1/0 |
先写一个 L2TP 类(l2tp-class IOU2IOU4),然后在这个类中配置开启认证的命令(authentication)和认证所需要的密码(password ccie.lol),最后在伪线类中调用一下即可(protocol l2tpv3 IOU2IOU4)。
值得注意的是,因为是在 IOU2 和 IOU4 这两台路由器上做认证,所以这两台路由器之间的那三条伪线(或者说那三条数据会话)需要设置的密码必须是一致的。不能一条伪线用 ccie.lol 这个密码,而另一条伪线用 ccies.hk 这个密码。
详细地跟踪一下数据包:
现在我们以 IOU1 和 IOU7 为例,来分析一下数据包在各个链路上的报头格式:

我们先追踪 IOU1 和 IOU7 之间的数据包,Ricky会在 IOU2 的 s 2/0 口、IOU3 的 e 0/2 口、IOU4 的 e 0/3 口和 IOU4 的 s 2/0 口用 Wireshark 抓取数据包,然后在 IOU1 上 ping 10.1.1.7。
1、在 IOU1 上 ping 10.1.1.7 时,IOU2 的 s 2/0 口上的抓包:

如上图所示,这是 IOU1 给 IOU2 发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Cisco HDLC |
2、在 IOU1 上 ping 10.1.1.7 时,IOU3 的 e 0/2 口上的抓包:

如上图所示,这是 IOU2 给 IOU3 发送的数据包的报头结构。IOU2 在原数据包的基础上打上了一个 L2TPv3 的报头,然后打上了一个去往 4.4.4.4 的 IP 三层头部,再打上一个 Ethernet 二层头部,最后将数据包转发给 IOU3。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Cisco HDLC | L2TPv3 | IP | Ethernet |
3、在 IOU1 上 ping 10.1.1.7 时,IOU4 的 e 0/3 口上的抓包:

如上图所示,这是 IOU3 给 IOU4 发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Cisco HDLC | L2TPv3 | IP | Ethernet |
4、在 IOU1 上 ping 10.1.1.7 时,IOU4 的 s 2/0 口上的抓包:

如上图所示,这是 IOU4 给 IOU7 发送的数据包的报头结构。IOU4 会剥离掉最外层的 Ethernet 二层头部和 IP 三层头部,再剥离掉 L2TPv3 报头,然后将数据包转发给 IOU7。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Cisco HDLC |
这样,数据包就转发到目的地了。
我们再以 IOU5 和 IOU6 为例,来分析一下数据包在各个链路上的报头格式:

接下来,我们追踪 IOU5 和 IOU6 之间的数据包,Ricky会在 IOU2 的 e 0/1 口、IOU3 的 e 0/2 口、IOU4 的 e 0/3 口和 IOU4 的 s 2/1 口用 Wireshark 抓取数据包,然后在 IOU6 上 ping 100.1.1.5。
1、在 IOU6 上 ping 100.1.1.5 时,IOU2 的 e 0/1 口上的抓包:

如上图所示,这是 IOU6 给 IOU2 发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Ethernet |
2、在 IOU6 上 ping 100.1.1.5 时,IOU3 的 e 0/2 口上的抓包:

如上图所示,这是 IOU2 给 IOU3 发送的数据包的报头结构。IOU2 收到这个数据包后会先抹去 Ethernet 二层头部(因为在 IOU2 上,这条伪线配置了参数:interworking ip,interworking ip 的意思是除了 IP 三层头部以外,其他二层头部都要被抹去),接着 IOU2 在原数据包的基础上打上了一个 L2TPv3 的报头,然后打上了一个去往 4.4.4.4 的 IP 三层头部,再打上一个 Ethernet 二层头部,最后将数据包转发给 IOU3。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | L2TPv3 | IP | Ethernet |
这里需要注意的是,Wireshark 把这个数据包识别错了,最内层不是 Ethernet 和 Data,而是 IP 和 ICMP。
如何判断 Wireshark 是否把数据包识别错了?
首先,如上图所示,你会发现 Cisco HDLC 数据帧里的 IP 地址字段和协议字段都显示为 Unknown,这就很不正常了。
其次,通过上面的截图我们可以知道,“Cisco HDLC 二层头部”(其实是 IP 头部)是以 45 00 00 64 00 0a 开始的。如下图所示,这是这个 ping 包刚从 IOU6 发给 IOU2 时的样子(就是上上一个截图)。你会发现,下面这个数据包的 IP 头部也是以 45 00 00 64 00 0a 开始的,而且后面的字节也都一样。所以这里可以判断,上面那个截图中,Wireshark 错把最内层的 IP 和 ICMP 识别成了 Cisco HDLC 和 Data。

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

如上图所示,这是 IOU3 给 IOU4 发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | L2TPv3 | IP | Ethernet |
4、在 IOU6 上 ping 100.1.1.5 时,IOU4 的 s 2/1 口上的抓包:

如上图所示,这是 IOU4 给 IOU5 发送的数据包的报头结构。IOU4 会剥离掉最外层的 Ethernet 二层头部和 IP 三层头部,再剥离掉 L2TPv3 报头,接着打上 PPP 二层头部(这里之所以打上了 PPP 二层头部,是因为在 IOU4 和 IOU5 之间的网络类型就是 PPP),然后将数据包转发给 IOU5。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | PPP |
这样,数据包就转发到目的地了。
我们再以 IOU8 和 IOU9 为例,来分析一下数据包在各个链路上的报头格式:

接下来,我们追踪 IOU8 和 IOU9 之间的数据包,Ricky会在 IOU2 的 e 1/0 口、IOU3 的 e 0/2 口、IOU4 的 e 0/3 口和 IOU4 的 e 1/0 口用 Wireshark 抓取数据包,然后在 IOU8 上 ping 200.1.1.9。
1、在 IOU8 上 ping 200.1.1.9 时,IOU2 的 e 1/0 口上的抓包:

如上图所示,这是 IOU8 给 IOU2 发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | 802.1Q | Ethernet |
2、在 IOU8 上 ping 200.1.1.9 时,IOU3 的 e 0/2 口上的抓包:

如上图所示,这是 IOU2 给 IOU3 发送的数据包的报头结构。IOU2 收到这个数据包后会先抹去 802.1Q 数据帧(因为在 IOU2 上,这条伪线配置了参数:interworking ethernet,interworking ethernet 的意思是除了 Ethernet 二层头部以外,其他二层头部都要被抹去),接着 IOU2 在原数据包的基础上打上了一个 L2TPv3 的报头,然后打上了一个去往 4.4.4.4 的 IP 三层头部,再打上一个 Ethernet 二层头部,最后将数据包转发给 IOU3。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Ethernet | L2TPv3 | IP | Ethernet |
3、在 IOU8 上 ping 200.1.1.9 时,IOU4 的 e 0/3 口上的抓包:

如上图所示,这是 IOU3 给 IOU4 发送的数据包的报头结构。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | Ethernet | L2TPv3 | IP | Ethernet |
4、在 IOU8 上 ping 200.1.1.9 时,IOU4 的 e 1/0 口上的抓包:

如上图所示,这是 IOU4 给 IOU9 发送的数据包的报头结构。IOU4 会剥离掉最外层的 Ethernet 二层头部和 IP 三层头部,再剥离掉 L2TPv3 报头,接着打上 802.1Q 数据帧(这里之所以打上了 802.1Q 数据帧,是因为在 IOU4 和 IOU9 之间的网络类型就是 802.1Q 子接口),然后将数据包转发给 IOU9。如果要画个简图的话,是如下这个样子的:
| FCS | ICMP | IP | 802.1Q | Ethernet |
这样,数据包就转发到目的地了。
本文完。如有疑问,欢迎在下方留言;如本文有什么错误,欢迎在下方留言指正,谢谢。
Ricky你好,我按照上面进行配置后IOU2到IOU4之间的通道和会话均成功建立,但IOU1和IOU7之间还是ping不通,可能是什么原因
应该是换行处我没有退出配置子命令之前就配置某些接口IP导致的配置未成功,我又重新严格按照上面说明进行配置,这次能ping通了
好的