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
安卓連接成功:
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/xl2tpd
1.3.1
。通過我的修復,xl2tpd 不再在“超出最大重試次數”時終止隧道,它只是記錄一條消息並繼續前進。現在所有客戶端都很開心,Android 不再斷開連接,並且相同的配置在 MacOS/iOS/Windows 7 上仍然可以正常執行。
順便說一句,xl2tpd 1.3.2 已經發布,但根據我的測試,它根本不適用於 Android:
- 負責計算
select()
超時的調度器產生的超時時間太短(亞秒級),導致大量網路超時,Android L2TP 連接無法及時建立。- 即使
select()
手動更改超時時間(改為 5 或 10 秒),“對等方請求隧道 xxx 兩次”問題不僅存在,而且變得更糟——Android 根本無法建立連接。