赏善罚恶令出邀侠客,IOS安卓穿NAT建隧道
一、前言:
赏善罚恶令出邀请江湖名宿去侠客岛品尝腊八粥,不去者则死。几十年以来,不知多少武林高手丧生在赏善罚恶使的掌下,而去了侠客岛的江湖高手,无论身手有多不凡,竟然一人也没有再回来,就连武当与少林两大派的掌门竟也被迫“请”上了侠客岛,江湖因此动荡不安。而移动互联江湖中,IOS安卓设备作为移动设备霸主游历其中,穿NAT建立L2TP over IPSEC隧道功能同样是让各IT宗门绞尽脑汁,下面我们就来看看MSR G2是如何修炼的。
二、组网:
图 1
手机(iPhone或者安卓)通过无线接入MSR900中,MSR3020作为NAT设备存在MSR900和MSR2630之间。手机通过设置L2TP over IPsec VPN连接和MSR2630相连,可以访问到MSR2630内部的网络,这里在MSR2630上创建loopback接口100.1.1.1模拟内网。
三、问题描述:
iPhone或者安卓设备拨VPN后提示“L2TP-VPN服务器未响应。请重试连接。如果问题继续存在,请验证您的设置并联系管理员”如图2所示,或者提示“VPN服务器并未响应”,如图3所示:
图 2
图 3
四、过程分析:
一般情况下手机通过L2TP over IPsec VPN拨入设备,会遇到无法拨入成功的问题,而手机上也都会有相应的信息提示,手机终端拨入L2TP over IPsec不成功的原因大致可以分为下几种情况:
情况一:网络不通
接入设备和LNS不通,如图中的MSR900和LNS设备MSR2630网络不通,或者终端设备和LNS不通。
图4
情况二:配置错误
这里的配置错误包括手机终端配置错误和LNS设备配置错误,二者有一方配置有误,均可导致VPN无法建立。
情况三:手机终端不支持NAT-T检测,也就是不支持NAT穿越。
这种情况需要在LNS侧抓包,查看手机终端发过来的第一个isakmp报文是否支持NAT-T协议,查看方式如下:
1、抓包分析
从抓包来看第一个报文为手机终端发上来的报文,在报文中可以看到携带了协商NAT-T的能力,如图5所示,在RFC 3947中规定标识NAT-T能力的vendor ID内容为“RFC 3947”的MD5 HASH运算值,具体运算后的结果十六进制表示为“4a131c81070358455c5728f20e95452f”,如果终端发过来的报文不带有vendor ID内容为“RFC 3947”或者带有vendor ID,但是MD5运算值不正确的,我司都视为不支持NAT穿越,那么ike的第一阶段的第五个和第六个报文依旧使用的500端口,而不是4500端口,将导致ike第一阶段协商不成功。
图 5
从抓包的第二报文可以看到,LNS回复的报文中携带了RFC 3947的内容,如图6所示:
图 6
2、debugging分析
通过debugging ike all查看,设备收到第一个报文后会有如下信息:
//设备收到了一个ike报文,源端口为12288,目的端口为500
<msr2630>*Mar 22 18:23:58:054 2014 msr2630 IKE/7/Packet: Received packet from 1.1.1.2 source port 12288 destination port 500.
*Mar 22 18:23:58:054 2014 msr2630 IKE/7/Packet:
I-Cookie: 5f905f84f4567073
//R-Cookie为全零,表示这是IKE协商的第一个报文
R-Cookie: 0000000000000000
next payload: SA
version: ISAKMP Version 1.0
exchange mode: Main //使用主模式
flags:
message ID: 0
length: 500
//中间报文省略……
//可以看到可以匹配到NAT-T能力
*Mar 22 18:23:58:056 2014 msr2630 IKE/7/Event: Vendor ID NAT-T rfc3947 is matched.
情况四:手机选用了野蛮模式,和V7设备不通
手机上是可以设置野蛮模式还是主模式的,具体方法如下:
iPhone:
配置了群组名称后,iPhone发出的协商第一阶段报文就为野蛮模式
图 7
安卓:
在VPN参数中如果配置了IPsec标识符,那么安卓发出的ike第一阶段协商模式为野蛮模式
图 8
手机终端使能野蛮模式后,发送上来的Peer_ID type为KEY_ID (11),而这种类型的Peer_ID我司设备是不支持的,导致ike协商失败,具体分析请见下方抓包和debugging内容:
1、抓包分析:
从抓包可以看出,手机终端使用野蛮模式的时候,LNS侧一直没有回包,打开报文分析,可以看到终端携带过来的ID_type类型为KEY_ID(11),而路由器上不支持这种ID_type
图 9
2、debugging分析
打开debugging ike all可以看到ike协商失败信息:
//设备收到了一个ike报文,源端口为12288,目的端口为500
*Mar 31 18:53:28:969 2014 msr2630 IKE/7/Packet: Received packet from 1.1.1.2 source port 12288 destination port 500.
*Mar 31 18:53:28:969 2014 msr2630 IKE/7/Packet:
I-Cookie: edaf059b4fc2a322
//R-Cookie为全零,说明此报文为ike协商的第一个报文
R-Cookie: 0000000000000000
next payload: SA
version: ISAKMP Version 1.0
exchange mode: Aggressive //使用的为野蛮模式
flags:
message ID: 0
length: 759
//中间报文交互省略……
*Mar 31 18:53:28:972 2014 msr2630 IKE/7/Packet: Process ID payload.
//可以看到终端发过来的Peer_ID类型为KEY_ID,而这个类型我们不支持,导致IKE直接协商失败
*Mar 31 18:53:28:972 2014 msr2630 IKE/7/Packet: Peer ID type: KEY_ID (11).
*Mar 31 18:53:28:972 2014 msr2630 IKE/7/Error: Failed to negotiate IKE SA.
3、对比分析
将终端设备更换为MSR设备,然后再发起IPsec连接,观察MSR发过来的Peer_ID类型为FQDN,而这个类型我们是支持的,所以IKE协商可以通过,以下信息为和MSR设备对接时的debugging ike all的信息:
*Mar 31 15:46:49:850 2014 msr2630 IKE/7/Packet:
I-Cookie: 57c4f933a6eba3f0
//R-Cookie为全零表示这是ike交互的第一个报文
R-Cookie: 0000000000000000
next payload: SA
version: ISAKMP Version 1.0
exchange mode: Aggressive //协商模式为野蛮模式
flags:
message ID: 0
length: 267
//中间报文省略…………
*Mar 31 15:46:49:852 2014 msr2630 IKE/7/Packet: Process ID payload.
//可以看到MSR发过来的Peer_ID类型为FQDN,值为123,可以正常匹配到相应的ike profile
*Mar 31 15:46:49:852 2014 msr2630 IKE/7/Packet: Peer ID type: FQDN (2).
*Mar 31 15:46:49:852 2014 msr2630 IKE/7/Packet: Peer ID value: FQDN 123.
*Mar 31 15:46:49:852 2014 msr2630 IKE/7/Packet: The profile 1 is matched.
*Mar 31 15:46:49:852 2014 msr2630 IKE/7/Packet: Process SA payload.
情况五:设备不支持IKE的扩展认证方式
手机发上来的IKE验证方式为XAUTHInitPreShared,即IKE的扩展认证方式,V7设备目前不支持此认证方式,iPhone和安卓均有可能遇到此问题。这种情况很少会遇到,这个和手机终端有关系,由于手机终端的ike验证方式无法手工指定,所以终端到底上送那种ike验证方式,这个就要通过debug来看了,如下为debugging ike all的信息。
1、不成功的debugging信息
*Mar 31 17:06:20:789 2014 msr2630 IKE/7/Packet:
I-Cookie: 4926382311c8f326
//R-Cookie为全零,说明这个是ike协商的第一个报文
R-Cookie: 0000000000000000
next payload: SA
version: ISAKMP Version 1.0
exchange mode: Main //使用的是主模式
flags:
message ID: 0
length: 596
//支持NAT-T能力
*Mar 31 17:06:20:791 2014 msr2630 IKE/7/Event: Vendor ID NAT-T rfc3947 is matched.
//接下来是匹配ike的安全提议,MSR默认的安全提议验证类型为pre-shark,也可以选择DSA和RSA数字签名方法
*Mar 31 17:06:20:791 2014 msr2630 IKE/7/Packet: Process SA payload.
*Mar 31 17:06:20:792 2014 msr2630 IKE/7/Packet: Check ISAKMP transform 1.
*Mar 31 17:06:20:792 2014 msr2630 IKE/7/Packet: Lifetime type is 1.
*Mar 31 17:06:20:792 2014 msr2630 IKE/7/Packet: Life duration is 3600.
*Mar 31 17:06:20:792 2014 msr2630 IKE/7/Packet: Encryption algorithm is AES-CBC.
*Mar 31 17:06:20:792 2014 msr2630 IKE/7/Packet: Key length is 256 bytes.
//可以看到终端发上来的认证方法为扩展认证方式,即XAUTH,这种方式我司目前不支持
*Mar 31 17:06:20:792 2014 msr2630 IKE/7/Packet: Authentication method is XAUTHInitPreShared.
//IKE报错,原因为不支持的验证类型
*Mar 31 17:06:20:792 2014 msr2630 IKE/7/Error: Unsupported authentication method: 65001.. Attribute AUTHENTICATION_METHOD.
//终端会带上来很多的ike安全提议,这里不再一一例举,中间的ike安全提议省略……
*Mar 31 17:06:20:796 2014 msr2630 IKE/7/Packet: Check ISAKMP transform 8.
*Mar 31 17:06:20:796 2014 msr2630 IKE/7/Packet: Lifetime type is 1.
*Mar 31 17:06:20:796 2014 msr2630 IKE/7/Packet: Life duration is 3600.
*Mar 31 17:06:20:798 2014 msr2630 IKE/7/Packet: Encryption algorithm is DES-CBC.
*Mar 31 17:06:20:798 2014 msr2630 IKE/7/Packet: Authentication method is XAUTHInitPreShared.
*Mar 31 17:06:20:798 2014 msr2630 IKE/7/Error: Unsupported authentication method: 65001.. Attribute AUTHENTICATION_METHOD.
*Mar 31 17:06:20:798 2014 msr2630 IKE/7/Error: No acceptable transform.
*Mar 31 17:06:20:799 2014 msr2630 IKE/7/Error: Failed to parse the IKE SA payload.
*Mar 31 17:06:20:799 2014 msr2630 IKE/7/Packet: Construct notification packet: NO_PROPOSAL_CHOSEN.
2、可以成功的debugging信息:
*Mar 31 17:08:34:776 2014 msr2630 IKE/7/Packet:
I-Cookie: f8e3442a94926ec4
R-Cookie: 0000000000000000
next payload: SA
version: ISAKMP Version 1.0
exchange mode: Main
flags:
message ID: 0
length: 500
*Mar 31 17:08:34:778 2014 msr2630 IKE/7/Event: Vendor ID DPD is matched.
*Mar 31 17:08:34:778 2014 msr2630 IKE/7/Event: Vendor ID NAT-T rfc3947 is matched.
*Mar 31 17:08:34:778 2014 msr2630 IKE/7/Packet: Process SA payload.
*Mar 31 17:08:34:778 2014 msr2630 IKE/7/Packet: Check ISAKMP transform 1.
*Mar 31 17:08:34:779 2014 msr2630 IKE/7/Packet: Lifetime type is 1.
*Mar 31 17:08:34:779 2014 msr2630 IKE/7/Packet: Life duration is 3600.
*Mar 31 17:08:34:779 2014 msr2630 IKE/7/Packet: Encryption algorithm is AES-CBC.
*Mar 31 17:08:34:779 2014 msr2630 IKE/7/Packet: Key length is 256 bytes.
//正常情况下收到的ike安全提议中的验证方式为Per-shark key方式
*Mar 31 17:08:34:779 2014 msr2630 IKE/7/Packet: Authentication method is Pre-shared key.
*Mar 31 17:08:34:779 2014 msr2630 IKE/7/Packet: HASH algorithm is HMAC-SHA1.
*Mar 31 17:08:34:779 2014 msr2630 IKE/7/Packet: DH group is 2.
五、解决方法:
情况一解决方法:
这种情况可以在LNS侧ping终端地址来确认一下网络是否有问题,如果LNS不可控,可以在终端上下载一些可以进行ping操作的app程序,在终端上做ping测试,例如ping lite软件,如果不通的话,请排查内网网络:
图 10
情况二解决方法:
1、LNS侧请参考如下配置:
//创建L2TP分配地址的地址池
ip pool 1 20.1.1.1 20.1.1.10
#
//配置接收L2TP报文的虚模板
interface Virtual-Template1
ppp authentication-mode pap
remote address pool 1 //引用pool 1
ip address 20.1.1.254 255.255.255.0
#
//配置loopback 0口,模拟内网
interface LoopBack0
ip address 100.1.1.1 255.255.255.255
#
//在公网口下发IPsec策略
interface GigabitEthernet0/0
port link-mode route
ip address 1.1.1.1 255.255.255.0
ipsec apply policy 1
#
ip route-static 0.0.0.0 0 1.1.1.2
#
//在域下配置PPP验证为本地认证
domain system
authentication ppp local
authorization ppp local
accounting ppp local
#
//配置本地用户123,密码也为123,需要注意的是用户类型必须为network,默认类型为manange类型,此类型不支持PPP的服务类型
local-user 123 class network
password cipher $c$3$RSOEA3vKZ4i0JIkSeULQKwYjRE4+Vg==
service-type ppp
authorization-attribute user-role network-operator
#
//配置IPsec安全提议,由于无法预知终端发上来的IPsec安全提示使用哪种方式,所以要多配置一些不同的加密、认证类型组合
ipsec transform-set 1
encapsulation-mode transport
esp encryption-algorithm aes-cbc-192
esp authentication-algorithm sha1
#
ipsec transform-set 2
encapsulation-mode transport
esp encryption-algorithm aes-cbc-128
esp authentication-algorithm sha1
#
ipsec transform-set 3
encapsulation-mode transport
esp encryption-algorithm aes-cbc-256
esp authentication-algorithm sha1
#
ipsec transform-set 4
encapsulation-mode transport
esp encryption-algorithm des-cbc
esp authentication-algorithm sha1
#
ipsec transform-set 5
encapsulation-mode transport
esp encryption-algorithm 3des-cbc
esp authentication-algorithm sha1
#
//在IPsec模板下引用IPsec安全提议和ike-profile,在IPsec模板下最多可以引用6个安全提议
ipsec policy-template 1 1
transform-set 1 2 3 4 5
ike-profile 1
#
ipsec policy 1 1 isakmp template 1
#
l2tp-group 1 mode lns
allow l2tp virtual-template 1
undo tunnel authentication
#
l2tp enable
#
//创建ike profile,需要注意此处的match remote为必配选项,如果不配置,则此profile无效,导致ike协商不通过,由于对端为拨号连接,所以此处匹配任意地址
ike profile 1
keychain 1
match remote identity address 0.0.0.0 0.0.0.0
proposal 1
#
//创建IKE安全提议
ike proposal 1
encryption-algorithm 3des-cbc
dh group2
authentication-algorithm md5
#
//创建ike keychain,由于对端为拨号连接,所以此处匹配任意地址
ike keychain 1
pre-shared-key address 0.0.0.0 0.0.0.0 key cipher $c$3$6XXIHVlyC1ttIXQVb6IMcF34Ide4MQ==#
Return
2、iPhone终端设置,以7.0.5系统为例:
1)添加VPN配置,进入设置->通用->VPN界面,默认没有VPN配置,点击“添加VPN配置”选项,进入VPN配置界面,如图11所示,描述、服务器、账户为必填的选项,请根据实际内容填写,密码和密钥为可选项,此处填写的都是123,请按照实际情况填写,另外,“发送所有流量选项一定要勾选”。
图 11
2)在配置好L2TP界面后,对应的IPsec选项会自动被配置好,不需要再次手工设置,如图12所示:
图 12
3)选择刚刚配置好的VPN配置,然后开启VPN连接,当手机上方出现VPN字样的时候,说明VPN建立成功,如图13所示:
图 13
4)可使用Ping Lite等APP软件测试ping LNS内网地址,此处内网地址为100.1.1.1,可以ping通,如图14所示:
图 14
3、安卓手机设置方法:
1)进入设置->更多->VPN->添加VPN网络,新建一个VPN配置,填写好所有参数,如图15所示:
图 15
其中L2TP密钥为隧道密码,如果没有配置隧道密码,则此项不用填写。
2)配置好VPN参数后,会出现对应的选项,选择自己刚刚配置好的VPN配置,开始连接,如果连接成功,则会提示“已连接”字样,如图16所示:
图 16
情况三解决方法:
请更换支持NAT穿越的手机终端或者APP软件。
情况四解决方法:
请不要在终端上开启野蛮模式。
情况五解决方法:
如果出现这种情况,请将VPN配置删除,重新配置,可能需要配置多次,这种情况取决于手机终端发起认证的时候使用的是扩展认证模式,还是普通的认证方式。