Введение: зачем нужен L2TP/IPsec и когда его выбирать
L2TP/IPsec - это связка двух протоколов, которая десятилетиями обеспечивает удалённый доступ в корпоративных сетях. L2TP (Layer 2 Tunneling Protocol) создаёт туннель для передачи PPP-сессий, а IPsec шифрует и аутентифицирует каждый пакет внутри этого туннеля. Результат: проверенная временем, предсказуемая технология с нативной поддержкой во всех операционных системах.
Выбор между L2TP/IPsec, OpenVPN и WireGuard сводится к трём критериям: совместимость, производительность и сложность внедрения. L2TP/IPsec выигрывает по первому пункту - он встроен в Windows, macOS, Linux, Android и iOS без установки стороннего ПО. OpenVPN требует клиентское приложение на каждой машине. WireGuard быстрее и проще в настройке, но до сих пор не везде доступен из коробки, особенно в старых версиях Windows и корпоративных сборках Android.
Недостатки протокола: два обязательных порта (UDP 500 для IKE и UDP 4500 для NAT-Traversal) плюс протокол ESP, который некоторые провайдеры и отельные сети блокируют на уровне маршрутизатора. Производительность ниже, чем у WireGuard, из-за двойной инкапсуляции и работы IPsec в режиме туннеля. Если вам нужна максимальная совместимость без развёртывания клиентского ПО на сотнях устройств - L2TP/IPsec остаётся рабочим выбором в 2026 году. Если приоритет - скорость и минималистичный код, обратите внимание на настройку WireGuard на Android и других платформах.
Архитектура L2TP/IPsec: как работает защищённый туннель
Понимание архитектуры избавляет от слепого копирования конфигов. Когда клиент инициирует соединение, первой вступает в работу фаза IKEv1 (Internet Key Exchange version 1). Стороны договариваются о параметрах шифрования, проходят взаимную аутентификацию - по сертификатам или pre-shared key - и устанавливают ISAKMP SA (Security Association). Это защищённый управляющий канал.
Внутри этого канала IPsec создаёт ESP (Encapsulating Security Payload) SA для шифрования данных. ESP инкапсулирует трафик, добавляя заголовок и трейлер с контрольной суммой. AH (Authentication Header) в связке L2TP/IPsec практически не применяется - он не поддерживает NAT-Traversal.
Поверх IPsec поднимается L2TP-туннель. Демон xl2tpd на сервере принимает L2TP-пакеты и передаёт их демону PPP (pppd). PPP выполняет аутентификацию пользователя по логину и паролю через CHAP или PAP, назначает IP-адрес клиенту из пула и устанавливает сетевые параметры - DNS, MTU, маршрут по умолчанию.
Клиент за NAT - стандартная ситуация. Здесь вступает в дело NAT-Traversal: IPsec-пакеты инкапсулируются в UDP-датаграммы на порт 4500. Это позволяет ESP-трафику проходить через устройства, которые не умеют отслеживать IP-сессии протокола 50 (ESP). Без NAT-Traversal клиент за NAT просто не установит соединение.
Подготовка сервера: установка StrongSwan и необходимых компонентов
Серверная часть состоит из трёх компонентов: StrongSwan (IPsec), xl2tpd (L2TP-демон) и ppp (PPP-демон). Установка на Ubuntu 22.04/24.04 LTS или Debian 12 выполняется одной командой.
apt update && apt install strongswan xl2tpd ppp -y
После установки проверяем версии:
ipsec --version
xl2tpd --version
pppd --version
StrongSwan 5.9.8 и выше содержит все необходимые плагины для L2TP, включая attr-sql и kernel-libipsec. Останавливаем сервисы перед конфигурацией - они запустятся позже с корректными настройками:
systemctl stop strongswan-starter xl2tpd
systemctl disable strongswan-starter xl2tpd
Disable временный - после завершения настройки сервисы будут включены и запущены.
Создание инфраструктуры открытых ключей (PKI)
Pre-shared key приемлем для тестового стенда или домашней сети. В корпоративной среде, где подключаются десятки и сотни устройств, сертификаты дают два преимущества: компрометация одного клиента не раскрывает общий ключ, и каждый сертификат можно отозвать по отдельности. StrongSwan включает утилиту ipsec pki для управления сертификатами без внешних зависимостей.
Генерация корневого сертификата (CA)
Корневой сертификат - якорь доверия для всей PKI. Приватный ключ CA должен храниться на отключённой от сети машине или как минимум с правами 600.
mkdir -p /etc/ipsec.d/private /etc/ipsec.d/certs /etc/ipsec.d/cacerts
ipsec pki --gen --type rsa --size 4096 --outform pem > /etc/ipsec.d/private/ca-key.pem
chmod 600 /etc/ipsec.d/private/ca-key.pem
ipsec pki --self --ca --lifetime 3650 --in /etc/ipsec.d/private/ca-key.pem \
--dn "CN=Admin Wiki Root CA, O=AdminWiki, C=RU" \
--outform pem > /etc/ipsec.d/cacerts/ca-cert.pem
Параметр --lifetime 3650 задаёт срок действия 10 лет. Distinguished Name (DN) должен быть уникальным в вашей инфраструктуре. CN (Common Name) - осмысленное имя, по которому сертификат идентифицируется в логах.
Создание серверного сертификата
Серверный сертификат предъявляется клиентам при установке IPsec-соединения. Критически важно указать subjectAltName - IP-адрес или DNS-имя, по которому клиенты подключаются к серверу. Без этого поля современные клиенты (особенно Windows и iOS) отклонят соединение.
ipsec pki --gen --type rsa --size 2048 --outform pem > /etc/ipsec.d/private/server-key.pem
chmod 600 /etc/ipsec.d/private/server-key.pem
ipsec pki --pub --in /etc/ipsec.d/private/server-key.pem --type rsa \
| ipsec pki --issue --lifetime 1825 \
--cacert /etc/ipsec.d/cacerts/ca-cert.pem \
--cakey /etc/ipsec.d/private/ca-key.pem \
--dn "CN=vpn.admin-wiki.ru, O=AdminWiki, C=RU" \
--san "vpn.admin-wiki.ru" --san "10.0.0.1" \
--flag serverAuth --flag ikeIntermediate \
--outform pem > /etc/ipsec.d/certs/server-cert.pem
Флаг serverAuth указывает, что сертификат используется для аутентификации сервера. Флаг ikeIntermediate требуется для IKEv1. Если сервер имеет несколько IP-адресов или DNS-имён, добавьте их через дополнительные параметры --san.
Создание клиентских сертификатов
Каждый клиент получает уникальный сертификат. Common Name должен идентифицировать пользователя или устройство - это упрощает аудит и отзыв.
ipsec pki --gen --type rsa --size 2048 --outform pem > /etc/ipsec.d/private/client1-key.pem
chmod 600 /etc/ipsec.d/private/client1-key.pem
ipsec pki --pub --in /etc/ipsec.d/private/client1-key.pem --type rsa \
| ipsec pki --issue --lifetime 365 \
--cacert /etc/ipsec.d/cacerts/ca-cert.pem \
--cakey /etc/ipsec.d/private/ca-key.pem \
--dn "CN=ivanov-pc, O=AdminWiki, C=RU" \
--flag clientAuth --flag ikeIntermediate \
--outform pem > /etc/ipsec.d/certs/client1-cert.pem
Клиентский сертификат экспортируется в формат PKCS#12 для переноса на устройство:
openssl pkcs12 -export -inkey /etc/ipsec.d/private/client1-key.pem \
-in /etc/ipsec.d/certs/client1-cert.pem \
-name "Ivanov VPN Certificate" \
-certfile /etc/ipsec.d/cacerts/ca-cert.pem \
-out client1.p12
PKCS#12-файл защищается паролем экспорта. Этот пароль потребуется при импорте на клиентское устройство. Передавайте файл и пароль по разным каналам.
Конфигурация StrongSwan для L2TP/IPsec
Конфигурация StrongSwan состоит из двух файлов: /etc/ipsec.conf (параметры соединений) и /etc/ipsec.secrets (приватные ключи).
Файл ipsec.conf: основные параметры
config setup
charondebug="ike 2, knl 2, cfg 2"
uniqueids=no
conn L2TP-IKEv1
keyexchange=ikev1
authby=pubkey
left=%any
leftid="vpn.admin-wiki.ru"
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightauth=pubkey
rightsourceip=10.10.10.0/24
rightdns=8.8.8.8,1.1.1.1
type=transport
auto=add
ike=aes256-sha256-modp2048
esp=aes256-sha256
dpdaction=clear
dpddelay=30s
rekey=no
fragmentation=yes
forceencaps=yes
Разбор критичных параметров:
keyexchange=ikev1- L2TP/IPsec работает только с IKEv1. IKEv2 используется для pure IPsec-туннелей.type=transport- транспортный режим IPsec, так как L2TP сам создаёт туннель. Туннельный режим добавил бы второй уровень инкапсуляции.left=%any- сервер принимает соединения на любом интерфейсе.leftidзадаёт идентификатор, который сервер предъявляет клиентам - он должен совпадать с subjectAltName в сертификате.rightsourceip=10.10.10.0/24- пул адресов для клиентов. StrongSwan назначает адреса через плагин attr, xl2tpd в этой схеме не управляет IP-адресацией.forceencaps=yes- принудительная инкапсуляция ESP в UDP 4500 даже при отсутствии NAT. Полезно, когда промежуточный файрвол не пропускает ESP.dpdaction=clear- при обнаружении мёртвого пира соединение сбрасывается, освобождая ресурсы.
Файл ipsec.secrets: хранение ключей
: RSA server-key.pem
Синтаксис: идентификатор (двоеточие означает «любой»), тип ключа, путь к файлу. Путь относительный - StrongSwan ищет файлы в /etc/ipsec.d/private/.
После сохранения конфигурации перезапускаем StrongSwan и проверяем статус:
systemctl enable strongswan-starter
systemctl start strongswan-starter
ipsec statusall
Вывод должен показать соединение L2TP-IKEv1 со статусом «loaded» и списком алгоритмов.
Настройка xl2tpd и PPP
StrongSwan обрабатывает IPsec, но L2TP-туннель и PPP-сессию поднимают xl2tpd и pppd. Их конфигурация определяет аутентификацию пользователей и параметры сетевого интерфейса.
Конфигурация xl2tpd.conf
[global]
listen-addr = 0.0.0.0
ipsec saref = yes
[lns default]
ip range = 10.10.10.100-10.10.10.200
local ip = 10.10.10.1
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
Параметр ipsec saref = yes включает привязку L2TP-сессий к IPsec SA - без этого возможны проблемы при нескольких одновременных подключениях из-за одного NAT. Диапазон ip range используется как fallback, если StrongSwan не назначил адрес через rightsourceip. local ip - адрес серверного конца PPP-соединения.
Настройка аутентификации PPP
Файл /etc/ppp/options.xl2tpd:
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 1.1.1.1
auth
require-chap
mtu 1280
mru 1280
noccp
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
MTU 1280 - консервативное значение, которое гарантирует прохождение пакетов через любые каналы с учётом накладных расходов IPsec (около 60-80 байт) и L2TP (около 40 байт). noccp отключает сжатие - на современных процессорах сжатие PPP замедляет передачу данных.
Пользователи задаются в /etc/ppp/chap-secrets:
ivanov l2tpd StrongP@ssw0rd 10.10.10.100
petrov l2tpd An0therP@ss 10.10.10.101
Формат: имя пользователя, сервер (l2tpd - значение из конфигурации xl2tpd), пароль, IP-адрес (звёздочка для любого). Фиксированный IP удобен для аудита и применения персональных правил файрвола.
Запускаем xl2tpd:
systemctl enable xl2tpd
systemctl start xl2tpd
systemctl status xl2tpd
Настройка брандмауэра и маршрутизации
Без правил файрвола VPN-сервер не пропустит трафик, даже если IPsec и L2TP настроены корректно. Требуется открыть три типа трафика и включить форвардинг.
Правила iptables для L2TP/IPsec
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
iptables -A FORWARD -s 10.10.10.0/24 -j ACCEPT
iptables -A FORWARD -d 10.10.10.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
UDP 500 - IKE, UDP 4500 - IPsec NAT-Traversal, ESP - протокол 50. Правила FORWARD разрешают трафик между VPN-подсетью и остальной сетью. MASQUERADE подменяет адрес источника на внешний IP сервера, обеспечивая доступ клиентов в интернет и локальную сеть.
Включение форвардинга пакетов
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
Для сохранения правил iptables после перезагрузки установите iptables-persistent:
apt install iptables-persistent -y
netfilter-persistent save
Проверка доступности портов с внешней машины:
nmap -sU -p 500,4500 vpn.admin-wiki.ru
Оба порта должны быть в состоянии open|filtered (UDP-сканирование не даёт однозначного ответа без ответа прикладного уровня).
Подключение клиентов: Windows, Linux, Android, iOS
Серверная часть готова. Подключение клиентов различается в деталях - импорт сертификатов, выбор типа аутентификации, настройка дополнительных параметров.
Настройка на Windows
Windows 10 и 11 требуют установки корневого сертификата в хранилище «Доверенные корневые центры сертификации» до создания VPN-подключения.
- Перенесите файл
ca-cert.pemна Windows-машину. - Нажмите Win+R, введите
mmc, добавьте оснастку «Сертификаты» для учётной записи компьютера. - Импортируйте ca-cert.pem в «Доверенные корневые центры сертификации».
- Импортируйте клиентский PKCS#12-файл в «Личные» сертификаты.
- Панель управления → Центр управления сетями и общим доступом → Создание и настройка нового подключения → Подключение к рабочему месту → Использовать моё подключение к интернету (VPN).
- Укажите адрес сервера, имя подключения.
- В свойствах VPN-подключения: вкладка «Безопасность» → Тип VPN: L2TP/IPsec с сертификатом → Дополнительные параметры → Использовать сертификат для проверки подлинности.
- Выберите импортированный клиентский сертификат.
Типичная ошибка Windows - «Ошибка 809: не удалось установить соединение». Причина в 90% случаев: заблокирован ESP-трафик на промежуточном устройстве. Решение: принудительное использование NAT-Traversal через параметр реестра AssumeUDPEncapsulationContextOnSendRule со значением 2 в ветке HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent.
Настройка на Linux (NetworkManager)
NetworkManager поддерживает L2TP/IPsec через плагин network-manager-l2tp:
apt install network-manager-l2tp network-manager-l2tp-gnome -y
- Настройки → Сеть → VPN → Добавить → Layer 2 Tunneling Protocol (L2TP).
- Gateway: адрес сервера.
- Аутентификация: User name и Password - из chap-secrets.
- Вкладка «IPsec Settings»: Enable IPsec tunnel to L2TP host, выберите «Use certificate», укажите пути к клиентскому сертификату, ключу и CA-сертификату.
- Вкладка «PPP Settings»: отключите EAP, включите CHAP и MSCHAPv2.
Настройка на Android и iOS
Android требует импорта PKCS#12-файла через Настройки → Безопасность → Шифрование и учётные данные → Установить из памяти устройства. После импорта сертификата:
- Настройки → Сеть и интернет → VPN → Добавить VPN.
- Тип: L2TP/IPsec RSA.
- Адрес сервера, пользователь и пароль.
- В поле «Сертификат IPsec» выберите импортированный клиентский сертификат.
- Сертификат CA: выберите корневой сертификат.
iOS: импорт сертификатов выполняется через Safari или почту - откройте PKCS#12-файл на устройстве, система предложит установить профиль. После установки сертификатов:
- Настройки → Основные → VPN → Добавить конфигурацию VPN.
- Тип: L2TP.
- Сервер, учётная запись, пароль.
- Секретный ключ: оставьте пустым (используется только для PSK).
- Включите «Отправлять весь трафик» для маршрутизации всего трафика через VPN.
Подробнее о настройке VPN на мобильных устройствах - в руководствах по настройке VPN на Android и ручной настройке VPN на Windows и Linux.
Диагностика и устранение типичных ошибок
Соединение не устанавливается, пакеты не идут, скорость минимальна - разбираем причины и методы диагностики.
Ошибки аутентификации и проблемы с сертификатами
Симптом: IPsec-соединение сбрасывается на фазе IKE_AUTH. В логах StrongSwan (journalctl -u strongswan-starter -f) появляется запись «no trusted certificate found» или «certificate validation failed».
Проверки:
ipsec listcerts
openssl verify -CAfile /etc/ipsec.d/cacerts/ca-cert.pem /etc/ipsec.d/certs/server-cert.pem
openssl verify -CAfile /etc/ipsec.d/cacerts/ca-cert.pem /etc/ipsec.d/certs/client1-cert.pem
Убедитесь, что срок действия сертификатов не истёк, subjectAltName сервера совпадает с адресом, который клиент использует для подключения, и корневой сертификат импортирован в доверенные на клиенте.
Проблемы с MTU и фрагментацией
Симптом: HTTPS-сайты не открываются или открываются частично, SSH-сессия зависает при выводе больших объёмов данных. Причина: пакеты превышают MTU канала, а ICMP Fragmentation Needed блокируется.
Определите максимальный MTU без фрагментации:
ping -M do -s 1472 8.8.8.8
Уменьшайте значение -s на 10, пока ping не начнёт проходить. Добавьте 28 байт (заголовки IP/ICMP) - получите оптимальный MTU. Для L2TP/IPsec типичное значение - 1280-1350 байт. Установите его в /etc/ppp/options.xl2tpd (параметры mtu и mru) и в настройках клиента.
Ошибки маршрутизации и доступа к локальной сети
Симптом: VPN подключён, клиент получил IP-адрес, но пинги до локальных ресурсов не проходят. Диагностика:
ip route show table all | grep 10.10.10
iptables -L FORWARD -v -n
tcpdump -i any host 10.10.10.100 and icmp
Частая причина: в целевом устройстве локальной сети отсутствует маршрут к VPN-подсети. Добавьте на шлюзе локальной сети статический маршрут к 10.10.10.0/24 через IP-адрес VPN-сервера. Вторая причина: политика FORWARD в iptables по умолчанию DROP. Добавьте правила для VPN-подсети, как показано в разделе настройки брандмауэра.
Для углублённой диагностики VPN-соединений используйте руководство по диагностике и устранению неисправностей VPN и руководство по VPN-маршрутизации на Linux.
Заключение: обеспечение безопасности и дальнейшая поддержка
Развёртывание L2TP/IPsec VPN - это не разовая акция. StrongSwan, xl2tpd и ядро Linux получают обновления безопасности, которые необходимо применять. Настройте автоматические обновления безопасности через unattended-upgrades или поддерживайте регламент ручного обновления раз в месяц.
Мониторинг: ipsec statusall показывает активные соединения и объём переданного трафика. Настройте алертинг в систему мониторинга (Zabbix, Prometheus) на метрики количества SA и состояния сервисов.
Ротация сертификатов: запланируйте перевыпуск клиентских сертификатов за месяц до истечения срока. Процесс можно автоматизировать скриптом, который генерирует PKCS#12-файлы и рассылает уведомления пользователям.
Ограничение доступа: если VPN-сервер используется только сотрудниками определённого отдела или подрядчиками, ограничьте входящие подключения по IP через iptables. Это снизит поверхность атаки и нагрузку от сканеров.
При выборе хостинга для VPN-сервера обратите внимание на облачную инфраструктуру Timeweb Cloud - VDS/VPS с гибким масштабированием ресурсов и предустановленными образами Ubuntu и Debian. Для автоматизации рутинных задач, включая генерацию конфигураций и скриптов диагностики, используйте AiTunnel - агрегатор API для доступа к нейросетевым моделям без VPN и с оплатой в рублях.