VPN L2TP/IPsec с общим ключом: настройка в Linux и Windows и почему туннель отваливается

8 мин проверено на ALT Linux (KDE Plasma 6), NetworkManager-l2tp 1.52, strongSwan 5.9
Содержание
  1. Что понадобится от администратора VPN
  2. Linux: NetworkManager
  3. Пакеты
  4. Настройка в графическом интерфейсе
  5. Маршруты: только офисные сети через VPN
  6. То же самое из командной строки
  7. Windows
  8. Твик реестра для NAT
  9. Создание подключения
  10. Проблема 1. VPN подключён, а офисные серверы недоступны
  11. Проблема 2. Туннель рвётся при копировании больших файлов
  12. Проблема 3. Сервер сам закрывает сеанс
  13. Где смотреть журналы
  14. Итог

Как подключиться к офисной сети по VPN L2TP/IPsec с общим ключом (PSK): из Linux через NetworkManager и из Windows. Отдельно — три проблемы, на которые я наткнулся на практике: туннель поднят, а сервер в офисе не пингуется; соединение рвётся при копировании больших файлов; сервер сам закрывает сеанс каждые 10–15 минут.

Пример — подключение к шлюзу UserGate, но всё описанное подходит для любого сервера L2TP/IPsec (MikroTik, pfSense, Windows RRAS, Keenetic и т.п.). Адрес шлюза, логин и ключи на скриншотах заменены.

Что понадобится от администратора VPN

Параметр Пример Где вводится
Адрес шлюза vpn.example.ru или внешний IP «Шлюз»
Тип VPN L2TP с IPsec, предварительный ключ (PSK) —
Общий ключ IPsec (PSK) строка из букв и цифр настройки IPsec
Логин и пароль ivanov / … «Имя пользователя», «Пароль»
Протокол проверки подлинности PAP (иногда CHAP или MS-CHAP v2) настройки PPP
Сети за VPN например 192.168.1.0/24 маршруты

Последний пункт важен: если пускать в VPN только трафик к офисным сетям, а интернет оставить напрямую, нужно знать, какие сети там находятся.

Linux: NetworkManager

Пакеты

Нужен плагин L2TP для NetworkManager, а он тянет за собой xl2tpd и strongSwan (или libreswan).

bash
# ALT Linux (KDE Plasma)
apt-get install NetworkManager-l2tp plasma-nm-connect-l2tp
# Debian / Ubuntu
apt install network-manager-l2tp network-manager-l2tp-gnome
# Fedora / RED OS
dnf install NetworkManager-l2tp NetworkManager-l2tp-gnome

После установки перезапустите NetworkManager (systemctl restart NetworkManager) или просто перелогиньтесь, чтобы в списке типов VPN появился L2TP.

Настройка в графическом интерфейсе

Скриншоты сделаны в KDE Plasma («Параметры системы → Wi-Fi и сеть»), в GNOME (nm-connection-editor) поля называются так же.

Добавьте подключение типа «Протокол туннелирования второго уровня (L2TP)» и на вкладке VPN (l2tp) заполните шлюз, тип аутентификации «Пароль», логин и пароль.

Вкладка VPN (l2tp): шлюз, логин и пароль
Вкладка VPN (l2tp): шлюз, логин и пароль

«Сохранить пароль для всех пользователей» нужно, если подключение должно подниматься без входа в графический сеанс или из консоли (nmcli con up). Иначе пароль хранится в KWallet / GNOME Keyring и спрашивается при подключении.

Кнопка Настроить IPsec… — включаем туннель IPsec, тип «Предварительно согласованный общий ключ (PSK)», вставляем ключ. Остальные поля оставляем пустыми: NetworkManager предложит серверу стандартный набор алгоритмов, и с большинством шлюзов этого достаточно.

Настройки IPsec: общий ключ PSK
Настройки IPsec: общий ключ PSK

Кнопка Настроить PPP… — здесь две важные вещи:

  • методы аутентификации: оставьте только то, что требует сервер. В нашем случае — PAP (CHAP оставлен как запасной). Если включить только MSCHAPv2, а сервер ждёт PAP, подключение будет падать сразу после установки IPsec с ошибкой аутентификации PPP;
  • MRU и MTU = 1280 — об этом подробно ниже, в разделе про обрывы.
Настройки PPP: PAP и MTU/MRU 1280
Настройки PPP: PAP и MTU/MRU 1280

Шифрование MPPE не включайте: трафик и так идёт внутри IPsec, а большинство серверов L2TP/IPsec MPPE не поддерживает.

Маршруты: только офисные сети через VPN

На вкладке IPv4 нажмите Маршруты…, добавьте сети офиса и поставьте галочку «Использовать только для ресурсов этого соединения».

Вкладка IPv4 подключения
Вкладка IPv4 подключения
Маршрут к офисной сети и режим «только для ресурсов этого соединения»
Маршрут к офисной сети и режим «только для ресурсов этого соединения»

Галочка означает «не делать VPN шлюзом по умолчанию» — интернет продолжает ходить напрямую, а через туннель идёт только то, что указано в маршрутах. Шлюз в строке маршрута можно оставить 0.0.0.0 — тогда маршрут вешается прямо на интерфейс ppp0.

То же самое из командной строки

bash
nmcli connection add type vpn con-name office-l2tp ifname '*' vpn-type l2tp \
  vpn.data "gateway=vpn.example.ru, user=ivanov, password-flags=0, ipsec-enabled=yes, ipsec-psk-flags=0, \
            refuse-eap=yes, refuse-mschap=yes, refuse-mschapv2=yes, mtu=1280, mru=1280" \
  vpn.secrets "password=ПАРОЛЬ, ipsec-psk=ОБЩИЙ_КЛЮЧ" \
  ipv4.never-default yes \
  ipv4.routes "192.168.1.0/24"

nmcli connection up office-l2tp

password-flags=0 и ipsec-psk-flags=0 — хранить секреты в самом подключении (в /etc/NetworkManager/system-connections/, файл доступен только root). Изменение системного подключения требует прав root: если nmcli connection modify отвечает Insufficient privileges, выполните его через sudo.

Проверка:

bash
ip -br addr show ppp0                 # адрес из пула VPN
ip route get 192.168.1.10             # должно быть: dev ppp0
ping -c3 192.168.1.10

Windows

Встроенный клиент Windows умеет L2TP/IPsec, но с двумя особенностями.

Твик реестра для NAT

Если компьютер находится за NAT (почти всегда — домашний роутер, офисная сеть), Windows по умолчанию отказывается устанавливать IPsec с сервером, который тоже за NAT. Лечится параметром реестра, после которого обязательна перезагрузка:

cmd
reg add HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 2 /f

Без него подключение висит на «Проверка имени пользователя и пароля…» и падает с ошибкой 809.

Создание подключения

«Параметры → Сеть и Интернет → VPN → Добавить VPN»: тип «L2TP/IPsec с предварительным ключом», адрес сервера, ключ, логин и пароль. Затем в «Панель управления → Сетевые подключения → свойства подключения → Безопасность» выставляем:

  • шифрование данных — «обязательное»;
  • «Разрешить следующие протоколы» — только «Незашифрованный пароль (PAP)» (или то, что требует ваш сервер).
Windows: вкладка «Безопасность» подключения L2TP/IPsec
Windows: вкладка «Безопасность» подключения L2TP/IPsec

Ключ IPsec задаётся там же, кнопкой «Дополнительные параметры».

Чтобы интернет не шёл через офис, на вкладке «Сеть → IP версии 4 → Свойства → Дополнительно» снимите «Использовать основной шлюз в удалённой сети» и добавьте маршрут к офисной сети, который будет появляться при каждом подключении:

powershell
Add-VpnConnectionRoute -ConnectionName "VPN Офис" -DestinationPrefix 192.168.1.0/24 -PassThru

Проблема 1. VPN подключён, а офисные серверы недоступны

Симптом: значок VPN показывает «подключено», адрес на ppp0 есть, но до серверов в офисе не достучаться — ping молчит, SSH и RDP по таймауту. Особенно коварно, когда раньше всё работало, а после переподключения перестало.

Диагностика — одна команда:

bash
ip route get 192.168.1.10
# плохо:   192.168.1.10 via 10.0.0.1 dev enp5s0 ...   ← пакет ушёл в обычную сеть мимо туннеля
# хорошо:  192.168.1.10 dev ppp0 ...

Причина: стоит «использовать только для ресурсов этого соединения» (ipv4.never-default yes), но маршрутов к офисным сетям в подключении нет. NetworkManager честно не делает VPN шлюзом по умолчанию и ставит маршрут только до адреса противоположной стороны туннеля (/32). Если раньше маршрут добавлялся руками (ip route add …), при каждом переподключении он пропадает.

Решение — прописать сети в самом подключении (как в разделе «Маршруты» выше), тогда они восстанавливаются при каждом подъёме туннеля:

bash
sudo nmcli connection modify office-l2tp +ipv4.routes 192.168.1.0/24
nmcli connection up office-l2tp

Проблема 2. Туннель рвётся при копировании больших файлов

Симптом: обычная работа (SSH, RDP) идёт нормально, но стоит начать копировать файл в сотни мегабайт — через 20–40 секунд связь пропадает целиком, VPN переподключается. В журнале:

текст
xl2tpd[...]: Connection 110 closed to <шлюз>, port 1701 (Timeout)
pppd[...]: Connect time 0.6 minutes.
pppd[...]: Sent 2377129 bytes, received 39961 bytes.

Ключевое слово — (Timeout): туннель закрыл не сервер, а сам клиент, потому что перестал получать служебные пакеты L2TP (hello). Пакеты PPP внутри L2TP внутри IPsec внутри UDP получают много заголовков; полноразмерные пакеты при MTU 1400–1500 не пролезают через канал без фрагментации, фрагменты теряются, очередь забивается, и вместе с данными теряются служебные пакеты.

Что помогает:

  1. Уменьшить MTU и MRU до 1280 (в настройках PPP или mtu=1280, mru=1280 в vpn.data). Это главное.

  2. Ограничить скорость больших передач, если канал всё равно не выдерживает:

    bash
    rsync -a --partial --append-verify --bwlimit=3000 файл user@192.168.1.10:/path/   # ~3 МБ/с, с докачкой
    sftp -l 24000 user@192.168.1.10        # лимит в Кбит/с

    --partial --append-verify у rsync и reput у sftp позволяют докачать файл с места обрыва, а не начинать сначала.

  3. Для SSH-сессий — -o ServerAliveInterval=15, чтобы зависшее соединение быстро обнаруживалось.

Проблема 3. Сервер сам закрывает сеанс

Симптом: туннель живёт 10–15 минут и падает, хотя ничего не копировалось. В журнале:

текст
xl2tpd[...]: Connection 108 closed to <шлюз>, port 1701 (Server closing)
pppd[...]: Connect time 10.0 minutes.

Здесь (Server closing) — инициатор сервер. Самые частые причины:

  • тот же логин подключён ещё откуда-то — с рабочего ноутбука, с телефона, со второго компьютера. Многие шлюзы (в том числе UserGate) разрешают одному пользователю один сеанс L2TP и при новом подключении выбивают старое. Два устройства по очереди выбивают друг друга. Решение — отдельная учётная запись VPN на каждое устройство;
  • таймаут бездействия на сервере — если обрыв ровно через одинаковое время при простое. Решается настройкой сервера или эхо-пакетами PPP («Посылать эхо-пакеты PPP» в настройках PPP);
  • политика сервера (лимит времени сеанса, смена ключей IPsec) — смотреть журнал на стороне шлюза.

Где смотреть журналы

bash
journalctl -u NetworkManager --since "-30 min" | grep -E 'xl2tpd|pppd|charon|ppp0'
journalctl --since "-30 min" | grep -E 'pppd\[[0-9]+\]: (Connect time|Sent)|closed to'   # краткая история обрывов
Что видно в журнале Что это значит
charon ... no proposal chosen / NO_PROPOSAL_CHOSEN не совпали алгоритмы IPsec — задать «Алгоритмы фазы 1/2» в настройках IPsec под сервер
charon ... authentication of ... failed неверный общий ключ PSK
pppd ... PAP authentication failed / CHAP authentication failed неверный логин/пароль или не тот метод аутентификации в настройках PPP
xl2tpd ... closed ... (Timeout) обрыв со стороны клиента — MTU, перегруженный канал (проблема 2)
xl2tpd ... closed ... (Server closing) сервер закрыл сеанс (проблема 3)

Итог

  • В Linux L2TP/IPsec настраивается штатным NetworkManager с плагином L2TP; в Windows — встроенным клиентом плюс твик реестра для NAT.
  • Если VPN нужен только для офиса — включайте «только для ресурсов этого соединения» и обязательно прописывайте маршруты к офисным сетям в самом подключении.
  • MTU/MRU 1280 и ограничение скорости больших копирований избавляют от обрывов (Timeout).
  • Обрывы (Server closing) чаще всего — один логин на двух устройствах.
Статья помогла?

Нашли ошибку или устаревшую команду? Выделите текст и нажмите Ctrl+Enter.