我在 Amazon EC2 上运行 CentOS 6.4,使用来自 EPEL 存储库的 xl2tpd-1.3.1 和 StrongSwan 5.0.4。
我建立了一个简单的 IPSec 连接:
conn l2tp
type=transport
keyexchange=ikev1
rekey=no
authby=psk
leftsubnet=0.0.0.0/0
rightsubnet=0.0.0.0/0
compress=yes
auto=add
这是 xl2tpd.conf:
[global]
ipsec saref = yes
[lns default]
ip range = 192.168.0.2-192.168.0.250
local ip = 192.168.0.1
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
这是 options.xl2tpd:
ms-dns 8.8.4.4
auth
lock
debug
proxyarp
只有一个客户端 - Android 4.2
Android连接成功:
Oct 27 19:45:02 ip-172-31-17-30 xl2tpd[2706]: Connection established to x.x.x.x, 59578. Local: 18934, Remote: 29291 (ref=0/0). LNS session is 'default'
Oct 27 19:45:02 ip-172-31-17-30 xl2tpd[2706]: Call established with x.x.x.x, Local: 36452, Remote: 29845, Serial: -1369754322
Oct 27 19:45:02 ip-172-31-17-30 pppd[2709]: pppd 2.4.5 started by howard, uid 0
Oct 27 19:45:02 ip-172-31-17-30 pppd[2709]: Using interface ppp0
Oct 27 19:45:02 ip-172-31-17-30 pppd[2709]: Connect: ppp0 <--> /dev/pts/0
Oct 27 19:45:02 ip-172-31-17-30 pppd[2709]: peer from calling number x.x.x.x authorized
Oct 27 19:45:02 ip-172-31-17-30 pppd[2709]: Deflate (15) compression enabled
Oct 27 19:45:03 ip-172-31-17-30 pppd[2709]: Cannot determine ethernet address for proxy ARP
Oct 27 19:45:03 ip-172-31-17-30 pppd[2709]: local IP address 192.168.0.1
Oct 27 19:45:03 ip-172-31-17-30 pppd[2709]: remote IP address 192.168.0.2
Oct 27 19:45:03 ip-172-31-17-30 charon: 06[KNL] 192.168.0.1 appeared on ppp0
Oct 27 19:45:03 ip-172-31-17-30 charon: 06[KNL] 192.168.0.1 disappeared from ppp0
Oct 27 19:45:03 ip-172-31-17-30 charon: 06[KNL] 192.168.0.1 appeared on ppp0
Oct 27 19:45:03 ip-172-31-17-30 charon: 06[KNL] interface ppp0 activated
同时,Android客户端上网流畅,VPN连接稳定、快速。
然而,在连接建立后的2-5分钟内总是会发生这样的情况:
Oct 27 19:47:07 ip-172-31-17-30 xl2tpd[2706]: Maximum retries exceeded for tunnel 18934. Closing.
Oct 27 19:47:07 ip-172-31-17-30 xl2tpd[2706]: Connection 29291 closed to 95.91.227.224, port 59578 (Timeout)
Oct 27 19:47:07 ip-172-31-17-30 charon: 06[KNL] interface ppp0 deactivated
Oct 27 19:47:07 ip-172-31-17-30 charon: 06[KNL] interface ppp0 deleted
然后VPN连接就断了。
那么可能出了什么问题?
相同的 L2TP 服务在 iOS 7、MacOS 10.8 和 Windows 7 上运行顺畅,这些操作系统上不存在断开连接的问题。
谢谢你!
答案1
经过近一个月的调试努力,我仍然无法对该问题给出明确的答案,但是有一个解决方法。
在原始问题中,Android 客户端似乎总是请求隧道两次 - “对等方请求隧道 xxx 两次”,但这不会发生在其他客户端(MacOS、Macbook、Windows 7、iOS)上。
在源代码中,如果重传计数器达到某个阈值,xl2tpd 将终止隧道,它会记录一条消息“隧道 xxx 的最大重试次数超出”,然后挂断 PPP 连接。
但问题是:无论出于什么原因,隧道是积极使用隧道,因此挂断它意味着终止Android的L2TP连接。
所以我最终将 xl2tpd 1.3.1 版本 fork 到了https://github.com/HouzuoGuo/xl2tpd在分支中1.3.1
。通过我的修复,xl2tpd 不再在“超过最大重试次数”时终止隧道,它只是记录一条消息并继续前进。
现在所有客户端都很满意,Android 不再断开连接,并且相同的配置在 MacOS/iOS/Windows 7 上仍然可以完美运行。
顺便说一句,xl2tpd 1.3.2 已经发布了,但是根据我的测试,它根本不能在 Android 上运行:
- 负责计算
select()
超时的调度程序产生的超时时间太短(亚秒),导致大量网络超时,并且无法及时建立 Android L2TP 连接。 - 即使
select()
手动更改超时时间(改为 5 秒或 10 秒),“对等方请求隧道 xxx 两次”问题不仅存在,而且会变得更糟 - Android 根本无法建立连接。