Я запускаю CentOS 6.4 на Amazon EC2, используя xl2tpd-1.3.1 из репозитория EPEL вместе с 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, в этих ОС нет проблем с отключением.
Спасибо!
После почти месяца работы по отладке я все еще не могу дать окончательного ответа на проблему, но есть обходной путь.
В исходном выпуске клиент Android всегда запрашивает туннель дважды - «одноранговый узел запрашивал туннель xxx дважды», но этого не происходит на других клиентах (MacOS, Macbook, Windows 7, iOS).
В исходном коде xl2tpd уничтожает туннель, если счетчик повторной передачи достигает определенного порога, регистрирует сообщение «Превышено максимальное количество повторных попыток для туннеля xxx», а затем зависает при подключении PPP.
Но проблема в том, что по какой-то причине туннель - это активно используется туннель, поэтому его повешение означает разрыв L2TP-соединения Android.
Итак, я закончил форк xl2tpd версии 1.3.1 на https://github.com/HouzuoGuo/xl2tpd в филиале 1.3.1
. С моими исправлениями xl2tpd больше не убивает туннель при «превышении максимального числа повторных попыток», он просто регистрирует сообщение и продолжает работу.
Теперь все клиенты довольны, Android больше не отключается, и та же конфигурация по-прежнему прекрасно работает на MacOS / iOS / Windows 7.
Кстати, уже вышла xl2tpd 1.3.2, но по моим тестам она вообще не работает с Android:
select()
timeout приводит к слишком короткому таймауту (менее секунды), что приводит к большому количеству тайм-аутов сети и не может быть установлено соединение Android L2TP вовремя.select()
тайм-аут вручную изменен (на 5 или 10 секунд), проблема «одноранговый узел запросил туннель xxx дважды» не только существует, но и становится еще хуже - Android не может установить соединение вообще.