IKEv2 (strongSwan) на Debian 12: пошаговая установка
IKEv2 хорошо переживает переключение сетей (Wi-Fi на мобильный интернет и обратно) и поддерживается «из коробки» на iOS, macOS, Windows и большинстве Android-прошивок без стороннего клиента. На Debian 12 его поднимают через strongSwan — зрелую реализацию IPsec со своим центром сертификации и systemd-юнитом. Дальше — пошаговая установка: от пакетов до firewall-правил в nftables, с реальными командами и конфигами.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что понадобится и почему именно IKEv2
Перед началом убедитесь, что у вас есть:
- чистый сервер на Debian 12 (bookworm) с root-доступом или sudo;
- публичный статический IP (или домен, указывающий на него) — без него сертификаты и профили придётся перевыпускать при смене адреса;
- открытые на уровне провайдера (Security Group / файервол панели) порты UDP 500, UDP 4500 и протокол ESP (IP protocol 50).
IKEv2 с IPsec ESP шифрует трафик на уровне ядра — это дешевле по CPU, чем OpenVPN в userspace, и заметно на слабых VPS. Плюс клиенты Apple и Windows понимают протокол нативно — установка приложения не нужна.
Минус — конфигурация многословнее, чем у WireGuard: нужен собственный CA и сертификаты. Если важнее минимализм, смотрите установку WireGuard на VPS — там пара ключей и один conf-файл.
Устанавливаем strongSwan и зависимости
Обновите систему и поставьте пакеты. Если работаете не под root — учтите, что в минимальных образах Debian sudo не установлен по умолчанию, в отличие от Ubuntu:
apt update && apt upgrade -y
apt install -y strongswan strongswan-pki \
libcharon-extra-plugins libstrongswan-extra-plugins \
libtss2-tcti-tabrmd0
libcharon-extra-plugins подтягивает EAP-модули (нужны для аутентификации по логину/паролю — так работает большинство мобильных клиентов), strongswan-pki даёт утилиту pki для своего центра сертификации.
Проверьте, что демон встал под systemd:
systemctl status strongswan-starter
Заметное отличие от Ubuntu-сборок: Debian регистрирует юнит именно как strongswan-starter.service — он читает классические /etc/ipsec.conf и /etc/ipsec.secrets. Есть и параллельный бэкенд — strongswan.service (пакет strongswan-swanctl), через VICI и swanctl.conf. Используем классическую схему через strongswan-starter: она проще для ручной правки.
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверГенерируем сертификаты своего CA
strongSwan на Debian хранит материал в /etc/ipsec.d/{cacerts,certs,private}. Сгенерируем корневой CA и серверный сертификат утилитой pki.
mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
pki --self --ca --lifetime 3650 \
--in ~/pki/private/ca-key.pem --type rsa \
--dn "CN=VPN Root CA" \
--outform pem > ~/pki/cacerts/ca-cert.pem
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
pki --pub --in ~/pki/private/server-key.pem --type rsa \
| pki --issue --lifetime 1825 \
--cacert ~/pki/cacerts/ca-cert.pem \
--cakey ~/pki/private/ca-key.pem \
--dn "CN=vpn.example.com" \
--san "vpn.example.com" \
--flag serverAuth --flag ikeIntermediate \
--outform pem > ~/pki/certs/server-cert.pem
Замените vpn.example.com на реальный домен или IP сервера — значение должно совпадать с leftid в ipsec.conf ниже. Копируем файлы на место и закрываем права на приватный ключ:
cp ~/pki/cacerts/ca-cert.pem /etc/ipsec.d/cacerts/
cp ~/pki/certs/server-cert.pem /etc/ipsec.d/certs/
cp ~/pki/private/server-key.pem /etc/ipsec.d/private/
chown root:root /etc/ipsec.d/private/server-key.pem
chmod 600 /etc/ipsec.d/private/server-key.pem
Клиентские сертификаты для схемы EAP-MSCHAPv2 (логин/пароль) не обязательны — сервер аутентифицируется сертификатом, а клиент присылает пароль внутри туннеля.
Настраиваем ipsec.conf и ipsec.secrets
Откройте /etc/ipsec.conf и приведите его к такому виду:
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
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=@vpn.example.com
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0,::/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=10.10.10.0/24
rightdns=1.1.1.1,8.8.8.8
rightsendcert=never
eap_identity=%identity
ike=aes256-sha256-modp2048,aes256-sha1-modp2048!
esp=aes256-sha256,aes256-sha1!
leftid обязательно с @ перед доменом — формат FQDN-идентификатора в strongSwan. rightsourceip — подсеть, из которой сервер раздаёт адреса клиентам; она не должна пересекаться с локальной сетью сервера.
В /etc/ipsec.secrets пропишите ключ сервера и пароли пользователей:
: RSA server-key.pem
ivan : EAP "СложныйПароль123!"
maria : EAP "ЕщёОдинПароль456!"
Файл читается только root — проверьте, что права 600. Перезапустите демон:
systemctl restart strongswan-starter
ipsec statusall
Если ikev2-vpn присутствует в разделе Connections без ошибок — конфиг синтаксически корректен.
Маршрутизация, NAT и firewall на nftables
Без включённой пересылки пакетов ядром сервер не выпустит трафик клиентов в интернет. Создайте /etc/sysctl.d/99-ikev2.conf и примените без перезагрузки:
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.rp_filter = 1
sysctl --system
Debian 12 использует nftables как штатный backend — в отличие от многих Ubuntu-гайдов, где поверх ставят UFW (базовые принципы разобраны в статье про настройку фаервола на Debian 12). Для IKEv2 с NAT и ESP удобнее писать nftables-правила напрямую — так NAT и фильтрация окажутся в одном файле.
Если nftables не установлен:
apt install -y nftables
systemctl enable --now nftables
Замените содержимое /etc/nftables.conf (сохраните резервную копию, если там уже есть свои правила) под свой SSH-порт и внешний интерфейс (имя уточните командой ip -o link show, часто это eth0 или ens3):
#!/usr/sbin/nft -f
flush ruleset
define WAN_IF = eth0
define VPN_SUBNET = 10.10.10.0/24
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
iif lo accept
ct state established,related accept
ct state invalid drop
tcp dport 22 accept
udp dport { 500, 4500 } accept
ip protocol esp accept
icmp type echo-request accept
}
chain forward {
type filter hook forward priority 0; policy drop;
ct state established,related accept
ip saddr $VPN_SUBNET accept
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority 100;
ip saddr $VPN_SUBNET oifname $WAN_IF masquerade
}
}
Проверьте синтаксис и примените:
nft -c -f /etc/nftables.conf
systemctl restart nftables
Порт 22 оставлен для SSH — если у вас нестандартный порт, скорректируйте строку под свою настройку.
Клиентские профили: iOS, macOS, Windows, Android
Для устройств Apple проще всего собрать .mobileconfig — профиль, который импортирует и CA, и параметры подключения одним файлом. Сначала экспортируйте корневой сертификат в DER:
openssl x509 -in ~/pki/cacerts/ca-cert.pem -outform der -out ca-cert.der
В .mobileconfig (XML) указываете блок com.apple.security.root (сертификат в base64) и com.apple.vpn.managed с типом IKEv2, RemoteAddress и RemoteIdentifier (тот же vpn.example.com). Профиль отправляется на устройство любым способом — пользователь подтверждает установку в «Настройки → Профиль».
- Windows 10/11: «Параметры → Сеть → VPN → Добавить подключение», тип IKEv2, вход по логину и паролю. Сертификат CA импортируется в «Доверенные корневые центры сертификации» через
certmgr.msc. - macOS: «Сеть → добавить VPN → IKEv2», сертификат CA — через Keychain Access.
- Android: встроенный клиент есть не на всех прошивках — надёжнее приложение strongSwan из Google Play, оно берёт
ca-cert.pemнапрямую.
Сравнение протоколов для разных сценариев — в статье WireGuard или OpenVPN: что выбрать.
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Клиент не подключается, хотя ipsec statusall показывает соединение активным?
Чаще всего дело в firewall провайдера (Security Group), который блокирует UDP 500/4500 или ESP отдельно от nftables — проверьте правила в панели провайдера.
Можно использовать IP вместо домена в leftid?
Да, но сертификат тогда выпускается с --san в виде IP, а не строки с @. При смене IP сертификат придётся перевыпускать — с доменом проще.
Нужен отдельный сертификат каждому клиенту?
Нет, при rightauth=eap-mschapv2 сервер аутентифицируется сертификатом один раз, а клиенты входят по логину и паролю из ipsec.secrets.
strongSwan не поднялся после перезагрузки — с чего начать?
С journalctl -u strongswan-starter -n 50 — почти всегда причина в правах на /etc/ipsec.d/private/* или опечатке в ipsec.secrets.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →