Что нужно для запуска:
- Ubuntu 24.04 с белым IP
- Открытые порты 500/udp и 4500/udp
- Домен или статический IP для CN сертификата
- Около 30 минут времени
Порядок: установка пакетов → генерация PKI → конфиг strongswan → UFW + NAT → проверка → подключение клиентов.
Диагноз: почему именно IKEv2
Тебе нужен корпоративный VPN. Пользователи — люди с айфонами, андроидами, рабочими ноутами на Windows. Ты поднял OpenVPN. Теперь пишешь инструкции «как установить клиент», отвечаешь на вопросы в чате и объясняешь бухгалтерии что такое tun-адаптер. Знакомо?
Настройка IKEv2 VPN сервера на Ubuntu решает эту проблему. IKEv2 встроен во все мажорные ОС — Windows 10+, iOS 9.1+, Android 11+, macOS 10.11+. Пользователь заходит в системные настройки, добавляет VPN, вводит логин и пароль. Всё.
Что получишь в итоге:
- VPN сервер с EAP-аутентификацией по логину/паролю
- Нативное подключение с любой платформы без сторонних приложений
- AES-256-GCM + ChaCha20 — современные алгоритмы шифрования
- Автовосстановление соединения через MOBIKE при смене сети
Уйдёт 25-35 минут. Нужен root или sudo на сервере.
Матрица совместимости: что работает без клиента
Перед тем как разворачивать — смотри реальность:
| Протокол | Windows 10/11 | iOS 17+ | Android 11+ | macOS 12+ |
|---|---|---|---|---|
| IKEv2/IPsec | Нативно | Нативно | Нативно | Нативно |
| L2TP/IPsec | Нативно | Нативно | Нативно | Нативно |
| PPTP | Устарел | Удалён в iOS 10 | Устарел | Удалён |
| SSTP | Нативно | Нет | Нет | Нет |
| OpenVPN | Нужен клиент | Нужен клиент | Нужен клиент | Нужен клиент |
| WireGuard | Нужен клиент | Нужен клиент | Нужен клиент | Нужен клиент |
L2TP тоже везде есть, но медленнее и содержит известные уязвимости в реализациях PSK. IKEv2 — единственный правильный выбор для 2025 года, если нужен нативный клиент без вопросов от пользователей.
Системные требования
| Параметр | Минимум | Рекомендуется |
|---|---|---|
| ОС | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS |
| StrongSwan | 5.9.x | 5.9.13+ (из репо Ubuntu 24.04) |
| RAM | 512 MB | 1 GB+ |
| IP | Статический публичный IP | IP + домен (для Let’s Encrypt) |
| Порты | 500/udp, 4500/udp | 500/udp, 4500/udp, 22/tcp |
На момент публикации актуальна StrongSwan 5.9.13. Перед установкой проверь актуальную версию в репозитории: apt-cache policy strongswan.
Таблица портов
| Порт | Протокол | Назначение | Снаружи |
|---|---|---|---|
| 500 | UDP | IKE/ISAKMP — обмен ключами IKEv2 | Да |
| 4500 | UDP | IPsec NAT-T — туннель за NAT | Да |
| 22 | TCP | SSH — управление сервером | Да (ограничь по IP) |
Архитектура решения
Причины почему IKEv2 может не работать после установки
Перед тем как делать — пойми что ломается чаще всего. Сэкономишь час дебага.
- Неверный CN/SAN в сертификате. Указал IP, клиент подключается по домену — не совпадает, отказ. Или наоборот. SAN обязателен — современные клиенты без него сертификат не примут.
- DEFAULT_FORWARD_POLICY=»DROP» в UFW. Классика. Клиент подключается, пинги до сервера идут, интернета нет. NAT работает, форвардинг заблокирован на уровне политики.
- Не включён IP forwarding в ядре. Без
net.ipv4.ip_forward=1трафик между туннелем и внешней сетью не пойдёт даже при правильном UFW. - Слабые или несовместимые алгоритмы шифрования. Конфиг с только
aes256-sha256-modp2048отвалится на iOS или свежем macOS — они требуют современные DH-группы. - Неверный сетевой интерфейс в правилах NAT. Хардкодишь
eth0, а у тебяens3илиenp3s0. NAT не работает, трафик не идёт. - CA-сертификат не импортирован на клиенте. Windows и macOS требуют его в системном хранилище доверенных сертификатов.
Установка пакетов
Обновляем систему и ставим всё что нужно:
sudo apt update && sudo apt upgrade -y
sudo apt install -y \
strongswan \
strongswan-pki \
libcharon-extra-plugins \
libcharon-extauth-plugins \
libstrongswan-extra-plugins
Зачем каждый пакет:
strongswan-pki— утилитаpkiдля генерации CA и сертификатовlibcharon-extauth-plugins— поддержка EAP-аутентификации (логин/пароль для клиентов)libcharon-extra-plugins— дополнительные протоколы, включая EAP-MSCHAPv2libstrongswan-extra-plugins— поддержка эллиптических кривых (Curve25519), нужна для современных cipher suites
Проверяем установку:
ipsec version
Должно вернуть что-то вроде Linux strongSwan 5.9.13.
Генерация PKI: сертификаты без которых никуда
Создаём рабочую директорию и генерируем всю цепочку: CA → серверный сертификат.
mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki
cd ~/pki
Генерируем ключ и самоподписанный CA-сертификат:
# Приватный ключ CA
pki --gen --type rsa --size 4096 --outform pem > private/ca-key.pem
# CA-сертификат, действует 10 лет
pki --self --ca --lifetime 3650 \
--in private/ca-key.pem \
--type rsa \
--dn "CN=VPN Root CA" \
--outform pem > cacerts/ca-cert.pem
Теперь серверный ключ и сертификат. Замени vpn.example.com на свой домен или IP:
# Ключ сервера
pki --gen --type rsa --size 4096 --outform pem > private/server-key.pem
# Серверный сертификат - подписываем нашим CA
pki --pub --in private/server-key.pem --type rsa \
| pki --issue \
--lifetime 1825 \
--cacert cacerts/ca-cert.pem \
--cakey private/ca-key.pem \
--dn "CN=vpn.example.com" \
--san vpn.example.com \
--flag serverAuth \
--flag ikeIntermediate \
--outform pem > certs/server-cert.pem
Копируем сертификаты в системные директории StrongSwan:
sudo cp cacerts/ca-cert.pem /etc/ipsec.d/cacerts/
sudo cp certs/server-cert.pem /etc/ipsec.d/certs/
sudo cp private/server-key.pem /etc/ipsec.d/private/
sudo chmod 600 /etc/ipsec.d/private/server-key.pem
Настройка StrongSwan: конфиг ipsec.conf
Бэкапим оригинал и пишем свой:
sudo cp /etc/ipsec.conf /etc/ipsec.conf.bak
sudo tee /etc/ipsec.conf > /dev/null << 'EOF'
config setup
charondebug="ike 1, knl 1, cfg 0"
uniqueids=no
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
mobike=yes
# Алгоритмы шифрования - современные + совместимые со старыми клиентами
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha1-modp2048!
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,aes128-sha1!
# Dead peer detection
dpdaction=clear
dpddelay=300s
rekey=no
# Сервер (левая сторона)
left=%any
leftid=@vpn.example.com
leftauth=pubkey
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
# Клиенты (правая сторона)
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=10.10.10.0/24
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
eap_identity=%identity
EOF
Три момента которые важны:
leftauth=pubkey - обязательная директива. В оригинальных статьях её часто забывают. Без неё StrongSwan не знает как аутентифицировать серверную сторону.
mobike=yes - включает MOBIKE (RFC 4555). Клиент переключается между Wi-Fi и мобильной сетью без разрыва VPN-сессии. Очень актуально для мобильных пользователей.
Набор алгоритмов в ike= - здесь есть и ChaCha20-Poly1305 для современных устройств, и классический AES-256 для совместимости со старыми клиентами. Без этого macOS или старый iOS может выдать "No proposal chosen".
Добавление пользователей: ipsec.secrets
sudo tee /etc/ipsec.secrets > /dev/null << 'EOF'
# Ключ сервера
: RSA "server-key.pem"
# Пользователи: username : EAP "password"
ivan : EAP "SecurePass2025!"
maria : EAP "AnotherPass456@"
EOF
sudo chmod 600 /etc/ipsec.secrets
Чтобы добавить пользователя без перезапуска сервиса - вставь строку и выполни:
sudo ipsec rereadsecrets
Настройка UFW и NAT: три места где всё ломается
Сначала определяем интерфейс. Не хардкоди eth0 - проверь:
ip route show default
# Смотри поле "dev": dev eth0, dev ens3, dev enp3s0 и т.д.
IFACE=$(ip route show default | awk '/default/ {print $5}')
echo "Интерфейс: $IFACE"
Включаем форвардинг на уровне ядра:
sudo tee -a /etc/sysctl.conf << 'EOF'
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
EOF
sudo sysctl -p
Теперь UFW. Вот тут три места где ошибаются:
Место 1. Меняем политику форвардинга в /etc/default/ufw:
sudo sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
Место 2. Добавляем NAT-правила в начало /etc/ufw/before.rules - строго до блока *filter:
sudo tee /tmp/ufw-nat.txt << 'EOF'
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
COMMIT
*mangle
:FORWARD ACCEPT [0:0]
-A FORWARD -m policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
COMMIT
EOF
# Вставляем перед первой строкой *filter
sudo sed -i '/*filter/e cat /tmp/ufw-nat.txt' /etc/ufw/before.rules
Либо - если sed с heredoc не нравится - открой файл вручную и вставь блок выше в начало, перед строкой *filter:
sudo nano /etc/ufw/before.rules
Место 3. Добавляем разрешение форвардинга для VPN-подсети. В том же файле /etc/ufw/before.rules, внутри блока *filter, после строки :ufw-before-forward:
# Добавить в секцию *filter блока ufw-before-forward:
-A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT
Открываем порты и применяем:
sudo ufw allow 500/udp
sudo ufw allow 4500/udp
sudo ufw allow OpenSSH
sudo ufw disable && sudo ufw enable
Запуск и проверка
sudo systemctl restart strongswan-starter
sudo systemctl enable strongswan-starter
sudo systemctl status strongswan-starter
Проверяем что демон поднялся и конфиг загружен:
sudo ipsec status
sudo ipsec listconn
Вывод ipsec listconn должен показать ikev2-vpn в списке. Если соединений нет - это нормально до первого подключения клиента.
Проверяем форвардинг:
sysctl net.ipv4.ip_forward
# Ожидаем: net.ipv4.ip_forward = 1
Проверяем NAT:
sudo iptables -t nat -L POSTROUTING -v -n
# Должна быть строка с MASQUERADE и 10.10.10.0/24
Подключение клиентов
Windows 10/11
Сначала импортируй CA-сертификат. Без этого Windows выдаст ошибку проверки сертификата:
# Запусти PowerShell от администратора
# Скопируй ca-cert.pem на машину и выполни:
Import-Certificate -FilePath "ca-cert.pem" -CertStoreLocation Cert:\LocalMachine\Root
Теперь добавляем VPN через PowerShell (быстрее чем через GUI):
Add-VpnConnection -Name "Corporate VPN" `
-ServerAddress "vpn.example.com" `
-TunnelType IKEv2 `
-AuthenticationMethod EAP `
-EncryptionLevel Required `
-RememberCredential
Или через GUI: Параметры - Сеть и Интернет - VPN - Добавить VPN-подключение. Тип: IKEv2, адрес: vpn.example.com, тип входа: имя пользователя и пароль.
Set-VpnConnectionIPsecConfiguration -ConnectionName "Corporate VPN" `
-AuthenticationTransformConstants SHA256128 `
-CipherTransformConstants AES256 `
-DHGroup Group14 `
-EncryptionMethod AES256 `
-IntegrityCheckMethod SHA256 `
-PfsGroup None `
-Force
iOS / iPadOS
Настройки - Основные - VPN и управление устройством - VPN - Добавить конфигурацию VPN.
Заполняй:
- Тип: IKEv2
- Описание: любое
- Сервер:
vpn.example.com - Удалённый ID:
vpn.example.com - Локальный ID: оставить пустым
- Аутентификация: имя пользователя
- Имя пользователя и пароль: из
ipsec.secrets
Если используешь самоподписанный CA - нужно установить его как профиль. Отправь ca-cert.pem по почте или положи на веб-сервер, открой на iPhone, установи через Настройки - Профиль загружен - Установить.
Android
Нативный клиент IKEv2 есть в Android 11+. Настройки - Сеть и интернет - VPN - добавить.
На Android 12 и новее путь может отличаться в зависимости от оболочки. Тип соединения - IKEv2/IPSec MSCHAPv2 или IKEv2/IPSec PSK. Вводи адрес сервера, логин, пароль.
На старых версиях Android или если нативный клиент капризничает - официальное приложение StrongSwan из Play Store решает проблему. Там же импортируй CA-сертификат.
macOS
Системные настройки - Сеть - кнопка "+" - VPN - тип IKEv2.
Адрес сервера и удалённый ID: vpn.example.com. Аутентификация: имя пользователя. CA-сертификат импортируй в Keychain Access в категорию "Системные" с уровнем доверия "Всегда доверять".
macOS хорошо работает с IKEv2, но иногда требует принудительного указания DH-группы. Если не подключается - добавь в конфиг StrongSwan в строку ike= вариант aes256gcm16-sha256-ecp256.
Осложнения: ошибки и как их чинить
| Ошибка | Причина | Решение |
|---|---|---|
| Certificate validation failed | CA не импортирован на клиенте или CN/SAN не совпадает с адресом сервера | Импортируй ca-cert.pem в системное хранилище. Проверь что адрес в SAN совпадает с адресом подключения |
| No proposal chosen | Клиент предлагает алгоритмы которых нет в конфиге сервера | Добавь в ike= и esp= более широкий набор алгоритмов. Посмотри что предлагает клиент в логах: journalctl -fu strongswan-starter |
| Подключается, интернета нет | Форвардинг или NAT не работает | Проверь sysctl net.ipv4.ip_forward = 1. Проверь DEFAULT_FORWARD_POLICY=ACCEPT в /etc/default/ufw. Проверь правило MASQUERADE с правильным интерфейсом |
| Authentication failed | Неверные credentials или не перечитан secrets | Проверь /etc/ipsec.secrets, запусти ipsec rereadsecrets |
| Connection reset / timeout | Порты 500/udp или 4500/udp закрыты | sudo ufw status. Проверь firewall на уровне хостера/облака - там может быть отдельный security group |
| iOS не подключается после обновления | Apple ужесточила требования к алгоритмам | Добавь в ike= строку aes256gcm16-sha384-prfsha384-ecp384 - Apple предпочитает именно этот набор |
Главный инструмент диагностики - лог charon в реальном времени:
sudo journalctl -fu strongswan-starter
Смотри на IKE_SA_INIT и IKE_AUTH пакеты. По ним видно где именно обрывается рукопожатие.
Альтернативы и когда их выбирать
| Решение | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| IKEv2 + StrongSwan | Нативные клиенты на всех ОС | Нужна PKI | Корпоративный VPN, смешанный парк устройств |
| WireGuard | Максимальная скорость, минимальный код | Нужен клиент на каждой платформе | IT-команды, разработчики, технари |
| OpenVPN | Гибкость, зрелость | Клиент везде, сложная настройка | Когда нужна нестандартная маршрутизация |
| L2TP/IPsec | Нативно везде, простая настройка с PSK | Медленно, известные уязвимости в PSK | Legacy-совместимость, последний вариант |
WireGuard быстрее IKEv2 - это факт. Но бухгалтер с iPhone не будет устанавливать приложение из App Store по твоей инструкции в 12 шагов. IKEv2 решает эту проблему на уровне ОС.
Профилактика и безопасность
Мониторинг активных сессий
# Активные Security Associations
sudo ipsec statusall
# Смотреть подключения в реальном времени
sudo journalctl -fu strongswan-starter | grep "IKE_SA"
Ротация пользовательских паролей
# Редактируем secrets
sudo nano /etc/ipsec.secrets
# Применяем без перезапуска
sudo ipsec rereadsecrets
Обновление сертификатов
Серверный сертификат выдан на 1825 дней (5 лет). Поставь напоминание. За 30 дней до истечения:
# Проверяем срок действия
openssl x509 -in /etc/ipsec.d/certs/server-cert.pem -noout -dates
Для продакшна - используй Let's Encrypt вместо самоподписанного CA. Тогда клиентам не нужно импортировать CA-сертификат, он уже в системном хранилище. Скрипт для этого: jawj/IKEv2-setup.
Ограничение доступа по IP для SSH
sudo ufw delete allow OpenSSH
sudo ufw allow from 1.2.3.4 to any port 22
Автоматический запуск
sudo systemctl enable strongswan-starter
Проверь что в /etc/ipsec.conf стоит auto=add, а не auto=start. С auto=add сервер ждёт входящих подключений. С auto=start будет пытаться сам инициировать туннель, что для road warrior-конфигурации не нужно.
Резервное копирование
Что бэкапить:
/etc/ipsec.conf- конфигурация/etc/ipsec.secrets- учётные данные пользователей/etc/ipsec.d/- вся PKI (сертификаты и ключи)/etc/ufw/before.rules- NAT-правила
# Архив всего необходимого
sudo tar -czf vpn-backup-$(date +%Y%m%d).tar.gz \
/etc/ipsec.conf \
/etc/ipsec.secrets \
/etc/ipsec.d/ \
/etc/ufw/before.rules
# Храни ключи CA в надёжном месте - без них не восстановишь PKI
Особенно береги private/ca-key.pem. Это корень доверия всей твоей инфраструктуры. Потеряешь - придётся перевыпускать все сертификаты и переконфигурировать клиентов.
FAQ
Почему IKEv2 VPN не подключается после настройки?
Четыре самые частые причины: несовпадение CN/SAN в сертификате с адресом сервера, CA-сертификат не импортирован на клиенте, закрытые порты 500/udp или 4500/udp, неверный пароль в ipsec.secrets. Смотри лог: sudo journalctl -fu strongswan-starter во время попытки подключения - там будет конкретная причина.
Как проверить что StrongSwan VPN работает правильно?
После подключения клиента выполни sudo ipsec statusall. Должна появиться активная Security Association. Клиент должен получить IP из пула 10.10.10.0/24. Проверь ip addr на клиенте и пингани 8.8.8.8 через туннель. Если пинг идёт, DNS разрешает имена - всё работает.
Что делать если пишет No proposal chosen?
Это несовпадение алгоритмов между клиентом и сервером. Смотри в логе какие алгоритмы предлагает клиент. Расшири список в ike= и esp= в /etc/ipsec.conf. Для старых Windows-клиентов добавь aes256-sha1-modp1024. Для macOS - aes256gcm16-sha256-ecp256. После изменения: sudo ipsec reload.
Чем IKEv2 отличается от OpenVPN для корпоративного VPN?
IKEv2 встроен в ОС - не нужен клиент. OpenVPN требует установки приложения на каждое устройство. IKEv2 работает на уровне ядра, чуть быстрее OpenVPN в userspace. OpenVPN гибче в маршрутизации и работает через 443/tcp там где UDP заблокирован. Для корпоративного VPN с обычными пользователями IKEv2 выигрывает по удобству развёртывания.
Как удалить пользователя из VPN?
Удали или закомментируй строку в /etc/ipsec.secrets и выполни sudo ipsec rereadsecrets. Активную сессию пользователя разорви: sudo ipsec down ikev2-vpn[имя_сессии]. Имя сессии видно в выводе ipsec statusall.
Можно ли использовать IKEv2 VPN через 443 порт?
Нет. IKEv2 работает на UDP:500 и UDP:4500 - это фиксированные порты стандарта. Если UDP заблокирован у пользователя, IKEv2 не поможет. В таком случае нужен OpenVPN на TCP:443 как fallback.
Итог
Сервер поднят. Клиенты подключаются нативно с Windows, iOS, Android и macOS. Никаких инструкций «установите приложение», никаких тикетов «у меня не работает».
Один нюанс на будущее: раз в год проверяй срок действия серверного сертификата. Когда он истечёт, все клиенты перестанут подключаться одновременно, в пятницу вечером. Murphy's law - это не теория, это производственный стандарт.
Если что-то не поднялось - пиши в комментарии. Разберёмся.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →




Настроил StrongSwan по статье. iPhone и macOS подключаются без проблем. Windows 11 не хочет — пишет «не удается подключиться». В логах strongswan вижу IKE_SA_INIT но потом ошибка.
Windows 11 с IKEv2 капризничает по поводу алгоритмов шифрования. Попробуй добавить в конфиг strongswan: ike=aes256-sha256-modp2048,aes256-sha1-modp2048! Windows по умолчанию предпочитает SHA-1 в некоторых конфигурациях. Ещё проверь что сертификат CA добавлен в хранилище Trusted Root Certification Authorities на Windows машине — без этого IKEv2 не подключится.
А сертификаты можно использовать от Let’s Encrypt или нужно свой CA делать?
Let’s Encrypt для IKEv2 VPN не подходит — их сертификаты предназначены для веб-серверов и не содержат нужных расширений для IPsec. Нужен свой CA. Это проще чем кажется — генерируется за 5 минут через easy-rsa или прямо через strongswan pki. Зато полный контроль над сертификатами и не зависишь от внешнего удостоверяющего центра.
Хорошая инструкция. Добавлю что на Ubuntu 24.04 нужно явно установить пакет strongswan-swanctl иначе некоторые команды не работают.
Спасибо, добавлю в статью. В Ubuntu 24.04 пакетная структура strongswan изменилась — теперь основной пакет strongswan тянет меньше зависимостей и swanctl нужно ставить отдельно. Команда: apt install strongswan strongswan-swanctl libcharon-extra-plugins.