MAATRIX / Блог / Встроенный IKEv2-профиль на iPhone без приложений

Встроенный IKEv2-профиль на iPhone без приложений

MAATRIX

Если сервер настроен на IKEv2 с сертификатной аутентификацией, а под рукой нет MDM и желания ставить сторонний клиент — iPhone справится своими силами. В iOS есть полноценный IKEv2-стек, и всё, что нужно, — доверенный корневой сертификат и вручную заполненный профиль в Настройках. Ниже — весь путь: от генерации CA на сервере до рабочего подключения на телефоне, с типичными граблями.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

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

Что умеет и чего не умеет встроенный IKEv2-клиент iOS

Штатный VPN-клиент iOS поддерживает IKEv2 «из коробки» с 2013 года (начиная с iOS 9 — стабильно), без установки чего-либо из App Store. Он умеет:

  • сертификатную аутентификацию сервера (обязательно) и опционально — клиента;
  • аутентификацию пользователя по логину/паролю через EAP-MSCHAPv2 — самый практичный вариант для одиночного пользователя;
  • ручной ввод всех параметров через Настройки → Основные → VPN и управление устройством → VPN → Добавить конфигурацию VPN;
  • автоматическую установку через .mobileconfig-профиль, открытый в Safari или Файлах.

Чего нет в обычном (не MDM) режиме:

  • Always-On VPN — принудительное постоянное соединение доступно только на управляемых (supervised) устройствах через MDM-профиль, обычным пользователям недоступно;
  • переключение по правилам (VPN on Demand с доменными фильтрами) доступно частично и только через .mobileconfig, вручную через UI такие правила не настраиваются;
  • IKEv2 с preshared key (PSK) в UI iOS вообще не показывается как опция для ручного добавления — только сертификат или сертификат + EAP.

Отсюда практический вывод: если хочется простоты — делайте на сервере сертификат для аутентификации сервера и EAP-MSCHAPv2 (логин/пароль) для пользователя. Клиентский сертификат на телефоне не понадобится, а от iPhone нужно только одно — доверять корневому сертификату сервера.

Подготовка сервера: strongSwan и собственный CA

Дальше пример на strongSwan (Ubuntu/Debian/AlmaLinux — принцип одинаковый, отличаются только пакетные команды и systemd-юниты). Если сервер ещё не поднят, есть отдельный разбор — strongSwan IKEv2 на Ubuntu 24.04 с нуля, здесь же — только та часть, что касается сертификатов под iPhone.

Генерируем корневой CA и серверный сертификат утилитой ipsec pki:

mkdir -p ~/pki/{cacerts,certs,private}
cd ~/pki

# корневой ключ и самоподписанный CA
ipsec pki --gen --type rsa --size 4096 --outform pem > private/caKey.pem
ipsec pki --self --ca --lifetime 3650 \
  --in private/caKey.pem --type rsa \
  --dn "C=RU, O=MyOrg, CN=MyOrg Root CA" \
  --outform pem > cacerts/caCert.pem

# ключ и сертификат сервера, подписанный CA
ipsec pki --gen --type rsa --size 4096 --outform pem > private/serverKey.pem
ipsec pki --pub --in private/serverKey.pem --type rsa \
  | ipsec pki --issue --lifetime 1825 \
    --cacert cacerts/caCert.pem --cakey private/caKey.pem \
    --dn "CN=vpn.example.com" \
    --san "vpn.example.com" \
    --flag serverAuth --outform pem > certs/serverCert.pem

Критично: в --san должен быть тот же адрес (домен или IP), который вы позже укажете в поле «Сервер» на iPhone. Это самая частая причина ошибки «не удаётся проверить удостоверение сервера» — SAN сертификата и адрес подключения не совпали.

Копируем файлы в системные каталоги strongSwan:

sudo cp ~/pki/cacerts/caCert.pem /etc/ipsec.d/cacerts/
sudo cp ~/pki/certs/serverCert.pem /etc/ipsec.d/certs/
sudo cp ~/pki/private/serverKey.pem /etc/ipsec.d/private/
sudo chmod 600 /etc/ipsec.d/private/serverKey.pem

/etc/ipsec.conf — минимальная рабочая конфигурация под EAP-MSCHAPv2:

config setup
    charondebug="ike 1, knl 1, cfg 0"

conn ikev2-eap
    auto=add
    compat=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    rekey=no
    dpdaction=clear
    dpddelay=300s
    left=%any
    leftid=@vpn.example.com
    leftcert=serverCert.pem
    leftsendcert=always
    leftsubnet=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

/etc/ipsec.secrets — ключ сервера и учётки пользователей:

: RSA serverKey.pem
ivan : EAP "СложныйПароль123!"

Перезапускаем и проверяем:

sudo systemctl restart strongswan-starter
sudo ipsec statusall

Не забудьте про форвардинг и NAT, иначе трафик до сервера дойдёт, а дальше в интернет не пройдёт:

echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
sudo iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

Если пользователей несколько и нужна выдача индивидуальных сертификатов вместо общего логина/пароля — это отдельная схема, разобрана в статье про мультипользовательские сертификаты IKEv2 в strongSwan.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Экспорт корневого сертификата для iPhone

iOS не умеет ставить .pem напрямую как удобно читаемый файл в Safari — надёжнее конвертировать в DER:

openssl x509 -in ~/pki/cacerts/caCert.pem -outform der -out ca.der

Файл ca.der нужно положить туда, откуда iPhone сможет его скачать по HTTPS — на любой веб-сервер, в статику существующего сайта, либо временно поднять:

python3 -m http.server 8080 --directory ~/pki/cacerts

Для одноразовой раздачи подойдёт и HTTP по локальной сети, но если делаете это на постоянной основе — лучше HTTPS с валидным сертификатом (Let's Encrypt), чтобы Safari не ругался при скачивании.

Альтернатива без веб-сервера: отправить ca.der себе через AirDrop или как вложение в Заметки/Почту — iOS одинаково распознает его как профиль для установки сертификата, откуда бы файл ни пришёл (Safari, Файлы, Почта, AirDrop).

Установка корневого сертификата на iPhone

  1. Откройте https://ваш-адрес/ca.der в Safari (не в стороннем браузере — вариант с загрузкой профиля по кастомной схеме там может не сработать одинаково надёжно). iOS покажет: «Загружен профиль конфигурации».
  2. Настройки → (баннер «Профиль загружен» вверху, либо) Основные → VPN и управление устройством → в разделе «Загруженный профиль» откройте его и нажмите Установить.
  3. Введите код-пароль устройства, подтвердите ещё раз «Установить» на предупреждении о неподписанном профиле — это нормально для самоподписанного CA.
  4. Отдельный и обязательный шаг, который часто забывают: Настройки → Основные → Об этом устройстве → Настройки доверия сертификатов (Certificate Trust Settings) → включите полное доверие для вашего корневого сертификата.

Без пункта 4 сертификат установлен, но не считается доверенным корнем — при подключении получите ошибку проверки сертификата сервера. Это отдельный переключатель, о котором iOS явно не напоминает.

Ручная настройка VPN-профиля

Теперь сам профиль — без единого стороннего приложения:

  1. Настройки → Основные → VPN и управление устройством → VPN → Добавить конфигурацию VPN…
  2. Тип: IKEv2.
  3. Описание: любое понятное имя, например «Мой сервер».
  4. Сервер: домен или IP — тот же, что указан в SAN сертификата (vpn.example.com).
  5. Удалённый ID: тот же адрес, что и в поле «Сервер» (должен совпадать с leftid на сервере, включая @, если он указан в конфиге — в примере выше @vpn.example.com).
  6. Локальный ID: обычно оставляют пустым — тогда iOS отправит его автоматически на основе имени пользователя.
  7. Аутентификация пользователя: Имя пользователя — вводите логин/пароль из ipsec.secrets (ivan / пароль).
  8. Секретный ключ сертификата не запрашивается — сервер аутентифицируется автоматически по сертификату, который вы уже добавили в доверенные корни.
  9. Нажмите Готово, затем включите тумблер VPN на этом же экране.

Таблица полей для сверки, если что-то не подключается:

Поле в iOSЗначениеДолжно совпасть с
Серверvpn.example.comSAN сертификата, leftid без @
Удалённый IDvpn.example.com или @vpn.example.comleftid в ipsec.conf
Тип аутентификацииИмя пользователяrightauth=eap-mschapv2
Имя пользователя / парольivan / парольстрока в ipsec.secrets

Автоматизация через .mobileconfig (опционально)

Если профиль нужно раздать нескольким устройствам без переписывания полей руками — можно один раз собрать .mobileconfig (это XML-файл, открывается и ставится всё тем же способом через Safari, приложение MDM для этого не требуется):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>PayloadContent</key>
  <array>
    <dict>
      <key>PayloadType</key><string>com.apple.vpn.managed</string>
      <key>PayloadIdentifier</key><string>com.myorg.vpn.ikev2</string>
      <key>PayloadUUID</key><string>REPLACE-WITH-UUID</string>
      <key>PayloadVersion</key><integer>1</integer>
      <key>UserDefinedName</key><string>Мой сервер</string>
      <key>VPNType</key><string>IKEv2</string>
      <key>IKEv2</key>
      <dict>
        <key>RemoteAddress</key><string>vpn.example.com</string>
        <key>RemoteIdentifier</key><string>vpn.example.com</string>
        <key>AuthenticationMethod</key><string>None</string>
        <key>ExtendedAuthEnabled</key><true/>
        <key>AuthName</key><string>ivan</string>
        <key>ServerCertificateIssuerCommonName</key><string>MyOrg Root CA</string>
      </dict>
    </dict>
  </array>
  <key>PayloadDisplayName</key><string>IKEv2 VPN</string>
  <key>PayloadIdentifier</key><string>com.myorg.vpn.profile</string>
  <key>PayloadType</key><string>Configuration</string>
  <key>PayloadUUID</key><string>REPLACE-WITH-ANOTHER-UUID</string>
  <key>PayloadVersion</key><integer>1</integer>
</dict>
</plist>

UUID генерируются командой uuidgen, каждый должен быть уникальным. Пароль в открытом виде в файле лучше не хранить — с ExtendedAuthEnabled iOS запросит его при первом подключении сама. Такой профиль всё равно ставится вручную одним касанием, без App Store — просто избавляет от заполнения восьми полей на каждом устройстве.

Проверка и типичные ошибки

Подключились — проверьте, что трафик реально идёт через туннель:

Настройки → сверху экрана появится значок VPN

На сервере смотрим активную сессию:

sudo ipsec statusall | grep -A5 ESTABLISHED

Частые проблемы:

  • «Не удалось проверить удостоверение сервера» — SAN сертификата не совпадает с адресом сервера в профиле, либо на шаге 4 из раздела про установку не включено полное доверие сертификату.
  • Профиль подключается и почти сразу отваливается — обычно rightsourceip пересекается с локальной сетью Wi-Fi телефона (например, оба используют 10.0.0.0/24) — смените пул адресов сервера на менее типичный диапазон.
  • Подключение есть, но интернета нет — забыли ip_forward=1 или правило MASQUERADE в iptables/nft.
  • «Пароль неверный» при правильном пароле — на iOS ID пользователя чувствителен к регистру и должен буква в букву совпадать со строкой в ipsec.secrets.
  • Профиль не появляется после установки .mobileconfig — проверьте, что PayloadUUID уникальны и XML валиден (plutil -lint file.mobileconfig на Mac перед раздачей).

Для сравнения, если тот же сервер придётся подключать ещё и с Windows — там процесс ручного добавления IKEv2-профиля отличается интерфейсом, но логика идентичная, разобрано в статье про встроенный IKEv2-клиент Windows 11.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Нужен ли джейлбрейк или сторонний клиент, чтобы использовать сертификат от собственного CA?

Нет. Штатный VPN-стек iOS работает с любым CA, если сертификат добавлен в доверенные корни через Настройки — Apple не требует, чтобы CA был из публичного списка удостоверяющих центров.

Можно ли использовать IKEv2 с preshared key вместо сертификата?

Через ручной ввод в UI — нет, такой опции там не показывают. PSK доступен только через .mobileconfig с типом PPP/legacy-конфигурацией или сторонним профилем, для чистого встроенного IKEv2 Apple ожидает сертификат.

Что будет, если срок действия сертификата истечёт?

Подключение перестанет устанавливаться с ошибкой проверки сертификата сервера. Выпускайте серверный сертификат заранее с запасом (в примере — 5 лет) и держите под рукой команду переиздания с тем же CA.

Слетает ли профиль после обновления iOS?

Обычно нет — конфигурация и установленный сертификат переживают обновления версии iOS. Исключение — переход между поколениями iOS с изменением политики доверия к слабым алгоритмам (например, к SHA-1 или RSA меньше 2048 бит), тогда сертификат придётся переиздать с современными параметрами.

Работает ли этот способ на iPad?

Да, интерфейс и логика идентичны — тот же путь Настройки → Основные → VPN и управление устройством.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

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