Время ожидания клиента StrongSwan + xl2tpd от 2 до 5 минут

Я запускаю 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, в этих ОС проблем с отключением нет.

Спасибо!

1 ответ

Решение

После почти месяца отладки я все еще не могу дать однозначный ответ на проблему, но есть обходной путь.

В первоначальном выпуске клиент Android всегда запрашивал туннель дважды - "равноправный запрашиваемый туннель ххх дважды", но на других клиентах (MacOS, Macbook, Windows 7, iOS) этого не происходит.

В исходном коде xl2tpd уничтожает туннель, если счетчик повторных передач достигает определенного порога, регистрирует сообщение "Максимальное количество повторных попыток превышено для туннеля xxx", а затем зависает на соединении PPP.

Но проблема в том, что по какой-то причине туннель является активно используемым туннелем, поэтому его зависание означает разрыв соединения L2TP в Android.

Таким образом, я закончил разветвлением версии 1.3.1 xl2tpd на 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 секунд), проблема "равный запрашиваемому туннелю ххх дважды" не только существует, но и усугубляется - Android вообще не может установить соединение.
Другие вопросы по тегам