Встроенный IKEv2-профиль на iPhone без приложений
Если сервер настроен на 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
- Откройте
https://ваш-адрес/ca.derв Safari (не в стороннем браузере — вариант с загрузкой профиля по кастомной схеме там может не сработать одинаково надёжно). iOS покажет: «Загружен профиль конфигурации». - Настройки → (баннер «Профиль загружен» вверху, либо) Основные → VPN и управление устройством → в разделе «Загруженный профиль» откройте его и нажмите Установить.
- Введите код-пароль устройства, подтвердите ещё раз «Установить» на предупреждении о неподписанном профиле — это нормально для самоподписанного CA.
- Отдельный и обязательный шаг, который часто забывают: Настройки → Основные → Об этом устройстве → Настройки доверия сертификатов (Certificate Trust Settings) → включите полное доверие для вашего корневого сертификата.
Без пункта 4 сертификат установлен, но не считается доверенным корнем — при подключении получите ошибку проверки сертификата сервера. Это отдельный переключатель, о котором iOS явно не напоминает.
Ручная настройка VPN-профиля
Теперь сам профиль — без единого стороннего приложения:
- Настройки → Основные → VPN и управление устройством → VPN → Добавить конфигурацию VPN…
- Тип: IKEv2.
- Описание: любое понятное имя, например «Мой сервер».
- Сервер: домен или IP — тот же, что указан в SAN сертификата (
vpn.example.com). - Удалённый ID: тот же адрес, что и в поле «Сервер» (должен совпадать с
leftidна сервере, включая@, если он указан в конфиге — в примере выше@vpn.example.com). - Локальный ID: обычно оставляют пустым — тогда iOS отправит его автоматически на основе имени пользователя.
- Аутентификация пользователя: Имя пользователя — вводите логин/пароль из
ipsec.secrets(ivan/ пароль). - Секретный ключ сертификата не запрашивается — сервер аутентифицируется автоматически по сертификату, который вы уже добавили в доверенные корни.
- Нажмите Готово, затем включите тумблер VPN на этом же экране.
Таблица полей для сверки, если что-то не подключается:
| Поле в iOS | Значение | Должно совпасть с |
|---|---|---|
| Сервер | vpn.example.com | SAN сертификата, leftid без @ |
| Удалённый ID | vpn.example.com или @vpn.example.com | leftid в 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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →