Vpn

StrongSwan + xl2tpd 客戶端超時 2-5 分鐘

  • November 16, 2013

我在 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

安卓連接成功:

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

同時,安卓客戶端上網完美,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 上完美執行,在這些作業系統上沒有斷開連接問題。

謝謝!

經過近一個月的調試工作,我仍然無法對問題給出明確的答案,但有一個解決方法。

在最初的問題中,Android 客戶端似乎總是請求隧道兩次 - “peer requested tunnel xxx 兩次”,但它不會發生在其他客戶端(MacOS、Macbook、Windows 7、iOS)上。

在原始碼中,如果重傳計數器達到某個門檻值,xl2tpd 會終止一條隧道,它會記錄一條消息“超過隧道 xxx 的最大重試次數”,然後掛斷 PPP 連接。

但問題是:無論出於何種原因,隧道都是主動使用的隧道,所以掛起它意味著終止Android的L2TP連接。

所以我最終在分支中將 xl2tpd 版本 1.3.1 分叉到https://github.com/HouzuoGuo/xl2tpd1.3.1。通過我的修復,xl2tpd 不再在“超出最大重試次數”時終止隧道,它只是記錄一條消息並繼續前進。

現在所有客戶端都很開心,Android 不再斷開連接,並且相同的配置在 MacOS/iOS/Windows 7 上仍然可以正常執行。

順便說一句,xl2tpd 1.3.2 已經發布,但根據我的測試,它根本不適用於 Android:

  • 負責計算select()超時的調度器產生的超時時間太短(亞秒級),導致大量網路超時,Android L2TP 連接無法及時建立。
  • 即使select()手動更改超時時間(改為 5 或 10 秒),“對等方請求隧道 xxx 兩次”問題不僅存在,而且變得更糟——Android 根本無法建立連接。

引用自:https://serverfault.com/questions/550377