MAATRIX / Блог / IKEv2 (strongSwan) на Debian 12: пошаговая установка

IKEv2 (strongSwan) на Debian 12: пошаговая установка

MAATRIX

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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →