StrongSwan + xl2tpd 客户端超时在 2-5 分钟之间

StrongSwan + xl2tpd 客户端超时在 2-5 分钟之间

我在 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 根本无法建立连接。

相关内容