Если возникают проблемы, что-то не получается - пишите в телеграми, он есть у меня в профиле. Каждому постараюсь помочь.
Недавно я обнаружил, что на iPhone можно сделать так, чтобы VPN автоматически включался и выключался в определенных условиях. Хорошенько раскурив документацию, я накатал конфиг, и теперь VPN у меня на телефоне работает при подключении к мобильной сети или гостевому Wi-Fi, а дома отключается. В этой статье я покажу, как сделать нечто подобное. Однако сначала нам понадобится сам сервер VPN — в качестве него мы установим strongSwan.
Такой выбор обусловлен тем, что ни OpenVPN, ни WireGuard не поддерживаются в iOS без программы‑клиента. Нам же для того, чтобы покопаться в правилах подключения, нужно будет загрузить на устройство кастомный профиль VPN, а это возможно, только если мы подключаемся системными средствами. Протокол IKEv2/IPSec, реализованный в strongSwan, как раз поддерживается на уровне системы. Причем не только в iOS — точно так же без всякого клиента к нему можно подключаться из Windows и Linux.
Ответ на вопрос, зачем тебе свой VPN, ты, думаю, уже знаешь. Например, через него часто настраивают подключение к приватной инфраструктуре или получают доступ к ресурсам, до которых трафик по тем или иным причинам не доходит напрямую. Теория окончена, перейдем к практике. Для начала нам нужно арендовать VPS сервер.
Говоря о том, что нам там предлагают под наши цели — это виртуальные VPS сервера, расположенные в странах европы, России и США. С реальной скоростью соединения с сервером примерно 500 мбит/с и безлимитным трафиком (что очень важно для VPN сервера) . Лично я буду использовать хостера Aeza - дешевый и относительно стабильный, с нормальными хар-ми сервера.
Итак, если вы, всё-таки решили арендовать сервер у Аезы, а не пошли писать гневные комментарии под моим постом этому поводу, то алгоритм действий такой:
1. Для начала вам нужно перейти по этой ссылке, зарегистрироваться и перейти в личный кабинет.
2. Далее, нажмите на Виртуальный сервер, выберите нужную страну, тариф Shared и минимальную конфигурацию сервера.
3. На наш сервер нужно установить операционную систему Ubuntu 20.04— её и выберите. Отключите бекапы — тут они не нужны (в случае чего всё можно быстро переустановить) . Выберите период оплаты и, собственно, оплатите аренду.
Кстати, после регистрации по моей реферальной ссылке у вас в течении 24 часов будет бонус 15% к пополнению баланса.
Минуты 2-3 сервер будет активироватьсяи после на почту придут данные для авторизации для подключения к серверу. Либо, ip-адрес и пароль можно будет посмотреть в разделе мои услуги и нажать на название вашего сервера.
Подключение к VPS
Как только вы приобрели VPS‑сервер с уже установленной туда чистой Ubuntu 20.04 — как правило в течении нескольких минут провайдер выдаст вам доступ к серверу. Чаще всего приходит e‑mail, иногда данные можно найти в панели.
В моем случае с aeza - данные есть и на почте и в личном кабинете.
Вам нужны две строки: IP-адрес и root-пароль
Подключитесь к серверу по SSH:
- Наберите ssh root@111.111.111.111 в консоли (IP поменяйте на свой).
Пароль можно вставить из буфера с помощью ПКМ, он не отображается для безопасности. Иногда пароль вставляется корректно только при включённой английской раскладке клавиатуры.
- Либо используйте веб-интерфейс "VNC" в панели VPS
- Либо используйте какое-либо SSH-приложение (подойдет командная строка)
СТАВИМ И НАСТРАИВАЕМ STRONGSWAN НА СЕРВЕРЕ
Начнем мы с развертывания strongSwan на частном сервере. Ниже я приведу краткий пересказ мануала по его настройке, предполагая, что у тебя установлена Ubuntu 20.04. Если у тебя другой Linux, команды могут отличаться, но принцип и конфиги будут по большей части те же.
Первый шаг стандартный для установки чего угодно:
sudo apt update
Теперь ставим нужные пакеты:
sudo apt install strongswan strongswan-pki \
libcharon-extra-plugins libcharon-extauth-plugins \
libstrongswan-extra-plugins libtss2-tcti-tabrmd-dev
Когда все скачается, перейдем к настройке.
Генерируем сертификаты
Создаем каталоги для сертификатов и ключей:
mkdir -p ~/pki/{cacerts,certs,private}
Убираем у этой папки лишние права — для надежности:
chmod 700 ~/pki
Генерируем корневой ключ RSA:
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
Число 3650 — это десять лет (в днях), которые будет работать сертификат. Можешь изменить это значение на свое усмотрение.
Корневые сертификаты готовы, теперь нам нужен сертификат для нашего сервера.
Делаем приватный ключ:
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
И сам сертификат. Обрати внимание, что IP в трех местах нужно изменить на IP твоего сервака.
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=NNN.NNN.NNN.NNN" --san @NNN.NNN.NNN.NNN --san NNN.NNN.NNN.NNN \
--flag serverAuth --flag ikeIntermediate --outform pem \
> ~/pki/certs/server-cert.pem
С этим закончили, можем перемещать ключи и сертификаты из домашнего каталога в папку настроек strongSwan:
sudo cp -r ~/pki/* /etc/ipsec.d/
Настраиваем strongSwan
На всякий случай переименуем старый файл с настройками, если он есть:
sudo mv /etc/ipsec.conf{,.original}
Откроем его /etc/ipsec.conf в nano:
sudo nano /etc/ipsec.conf
Добавляем раздел config setup:
config setup
charondebug="ike 1, knl 1, cfg 0"
uniqueids=no
Дальше добавляем настройки туннеля IKEv2 (не забудь подставить свой IP):
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=NNN.NNN.NNN.NNN
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
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
Здесь забиты адреса гугловского DNS (8.8.8.8 и 8.8.4.4), ты можешь использовать их или заменить, например, адресом своего роутера (его можно узнать, набрав ip route show default).
Сохраняем конфиг и выходим из nano (Ctrl-X, Y, Enter).
Сервер VPN мы настроили, осталось создать креды, с которыми клиент сможет авторизоваться. За них отвечает файл /etc/ipsec.secrets. Открываем его в nano:
sudo nano /etc/ipsec.secrets
Добавляем в него строчку
: RSA "server-key.pem"
Двоеточие и пробел после него важны, не убирай их!
Дальше задаем логин и пароль пользователя. Замени их своей комбинацией. Хороший стойкий пароль можешь создать в парольном менеджере.
логин : EAP "пароль"
Сохраняй файл, и перезапустим strongSwan, чтобы он прочитал новые конфиги:
sudo systemctl restart strongswan-starter
Настраиваем сеть
Наш VPN уже работает и готов принимать соединения, но сетевой трафик до него пока не доходит. Нужно настроить файрвол и IP-форвардинг.
Разрешаем пропускать трафик OpenSSH, а также UDP на портах 500 и 4500:
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw allow 500,4500/udp
Осталось сделать так, чтобы входящие пакеты IPSec обрабатывались нашей службой. Узнаем адрес нашего сетевого интерфейса:
ip route show default
Посмотри, что будет написано после слова dev. Это может быть, например, eth0 или ens2 либо еще что‑нибудь в таком духе. Запомни или запиши куда‑нибудь эти буквы.
Открываем файл с настройками правил файрвола:
sudo nano /etc/ufw/before.rules
В самом начале файла, до секции *filter, нам надо добавить два блока. Замени в трех местах ИНТЕРФЕЙС тем, что мы нашли выше.
*nat
-A POSTROUTING -s 10.10.10.0/24 -o ИНТЕРФЕЙС -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o ИНТЕРФЕЙС -j MASQUERADE
COMMIT
*mangle
-A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o ИНТЕРФЕЙС -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
COMMIT
*filter
...
А в конце *filter — такие две строки:
-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
Закрываем, сохраняем. Теперь открываем файл с настройками службы файрвола:
sudo nano /etc/ufw/sysctl.conf
Добавляем в конец вот такие строки:
net/ipv4/ip_forward=1
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0
net/ipv4/ip_no_pmtu_disc=1
Выключаем и включаем файрвол для применения настроек:
sudo ufw disable
sudo ufw enable
Если система запросит подтверждение, жми Y.
Настраиваем подключение
Нам нужно забрать с сервера свой сертификат, с которым мы будем подключаться. Он лежит в файле по такому пути:
/etc/ipsec.d/cacerts/ca-cert.pem
Можешь вывести его командой cat, скопировать и сохранить в файл на своем компьютере либо забрать, подключившись по SFTP.
Для подключения к VPN тебе понадобятся три вещи: IP твоего сервера, файл с сертификатом и пара из логина и пароля, которые ты задал в файле /etc/ipsec.secrets. Все это у тебя есть!
Настройки в разных ОС выполняются немного по‑разному.
В macOS тебе нужно:
- Дважды кликнуть на файл с сертификатом и подтвердить его добавление в цепочку ключей, введя пароль.
- Открыть цепочку (Keychain Access), найти VPN root CA и задать нужные разрешения. Дважды кликни по нему, раскрой раздел «Доверять» (Trust) и выбери «Доверять всегда» (Always Trust) напротив строки IPSec.
- Создать соединение в настройках сети. Нажимай плюсик внизу, выбирай VPN, IKEv2 и жми «Создать» (Create), вписывай IP сервера в строки «Адрес сервера» и «Удаленный ID».
- В настройках соединения выбирай «Имя пользователя» и укажи свои логин и пароль.
В Windows процесс немного другой:
- Открывай «Консоль управления», выбирай «Файл → Добавить или удалить оснастку → Сертификаты → Добавить».
- Чтобы VPN работал для любого пользователя, выбирай «Учетная запись компьютера» и жми «Далее». Затем жми «Локальный компьютер» и «Закончить».
- В «Корне консоли» выбирай «Доверенные корневые центры сертификации для доверия федерации» и «Сертификаты».
- В меню «Действия» в правой панели нажми «Все задачи» и «Импортировать».
- Вызови меню выбора файла, выставь тип X.509 и импортируй свой сертификат.
- Теперь нужно создать подключение к VPN. Зайди в «Панель управления → Сеть интернет». В Windows 7 может понадобиться создать новое подключение к рабочему месту, в Windows 10 и 11 должен быть специальный раздел VPN. В любом случае вписывай адрес сервера, логин и пароль.
- Можешь подключаться!
На iOS установка схожа с тем, что мы делали на macOS. Но поскольку я обещал продемонстрировать возможность автоматически включать и выключать VPN, мы вместо этого создадим файл с профилем, который заодно будет содержать и все настройки.
На Android, увы, strongSwan не поддерживается на уровне ОС, поэтому тебе придется скачать клиентское приложение и настроить его. Впрочем, эта статья ориентирована на пользователей iOS, так что я не предполагаю, что речь о твоем основном телефоне.
КУЕМ ПРОФИЛЬ ДЛЯ IOS
А теперь самая важная часть нашего приключения, ради которой все и затевалось. Мы создадим кастомный профиль для iOS, где пропишем, при каких условиях устройство должно подключаться к VPN. Не волнуйся — полностью полагаться на автоматизацию необязательно, и при желании ты сможешь деактивировать такое поведение в настройках, чтобы включать и выключать VPN вручную.
За основу я взял чей‑то готовый профиль, а потом добавил в него правила.
Помимо логина, пароля и IP сервера, тебе понадобится сертификат, который мы скачали с сервера. Точнее, его содержимое между строками BEGIN CERTIFICATE и END CERTIFICATE.
Также создай четыре случайные строки произвольной длины. На macOS я их сгенерировал командой uuidgen. Но это чистое пижонство, ты можешь использовать в качестве UUID любую последовательность символов — осмысленных или нет.
В конфиге ниже тебе понадобится изменить следующее:
- добавить сертификат вместо строки 13;
- вставить первый UUID в строках 20 и 24;
- задать название VPN в строке 32;
- добавить второй UUID в строке 36;
- добавить IP сервера в строках 42 и 44;
- задать свой логин в строке 73 и пароль в строке 75;
- вставить третий UUID в строке 96;
- вставить четвертый UUID в строке 102.
vpn.mobileconfig
<?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>PayloadCertificateFileName</key>
<string>cert.pem</string>
<key>PayloadContent</key>
<data>
СЮДА ВСТАВЛЯЙ СЕРТИФИКАТ
</data>
<key>PayloadDescription</key>
<string>Adds a certificate</string>
<key>PayloadDisplayName</key>
<string>cert.pem</string>
<key>PayloadIdentifier</key>
<string>com.apple.security.pkcs12.ПЕРВЫЙ UUID</string>
<key>PayloadType</key>
<string>com.apple.security.pem</string>
<key>PayloadUUID</key>
<string>ПЕРВЫЙ UUID ЕЩЕ РАЗ</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
<dict>
<key>UserDefinedName</key>
<string>StrongSwan</string>
<key>PayloadDisplayName</key>
<string>НАЗВАНИЕ</string>
<key>PayloadIdentifier</key>
<string>swan.vpn.always</string>
<key>PayloadUUID</key>
<string>ВТОРОЙ UUID</string>
<key>VPNType</key>
<string>IKEv2</string>
<key>IKEv2</key>
<dict>
<key>RemoteAddress</key>
<string>IP ТВОЕГО СЕРВЕРА</string>
<key>RemoteIdentifier</key>
<string>IP ТВОЕГО СЕРВЕРА</string>
<key>LocalIdentifier</key>
<string></string>
<key>AuthenticationMethod</key>
<string>None</string>
<key>DeadPeerDetectionRate</key>
<string>Medium</string>
<key>DisableMOBIKE</key>
<integer>0</integer>
<key>DisableRedirect</key>
<integer>0</integer>
<key>EnableCertificateRevocationCheck</key>
<integer>0</integer>
<key>EnablePFS</key>
<integer>0</integer>
<key>ExtendedAuthEnabled</key>
<true/>
<key>IKESecurityAssociationParameters</key>
<dict>
<key>DiffieHellmanGroup</key>
<integer>2</integer>
<key>EncryptionAlgorithm</key>
<string>3DES</string>
<key>IntegrityAlgorithm</key>
<string>SHA1-96</string>
<key>LifeTimeInMinutes</key>
<integer>1440</integer>
</dict>
<key>AuthName</key>
<string>ЛОГИН</string>
<key>AuthPassword</key>
<string>ПАРОЛЬ</string>
</dict>
<!-- СЮДА ВСТАВЛЯЕМ ПРАВИЛА -->
<key>OverridePrimary</key>
<true/>
<key>IPv4</key>
<dict>
<key>OverridePrimary</key>
<integer>1</integer>
</dict>
<key>PayloadType</key>
<string>com.apple.vpn.managed</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</array>
<key>PayloadDisplayName</key>
<string>VPN Configuration</string>
<key>PayloadIdentifier</key>
<string>ТРЕТИЙ UUID</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>ЧЕТВЕРТЫЙ UUID</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
ДОБАВЛЯЕМ ПРАВИЛА ПОДКЛЮЧЕНИЯ
На строке 78 ты мог заметить комментарий — он не будет мешать работе профиля. Однако добавил я его, чтобы отметить место, куда ты можешь вставить правила автоматического подключения.
Каждое правило — это словарь, в начале которого идет тег key со значением Action, затем — string с типом действия (Connect, Disconnect или Ignore) и список параметров (key), то есть условие подключения или отключения.
Условия бывают следующие:
- DNSDomainMatch (массив строк) — домены серверов DNS, которые могут быть перечислены в настройках сети. Это один из способов понять, к какой сети мы подключены;
- DNSServerAddressMatch (массив строк) — то же самое, но используются IP-адреса серверов DNS;
- InterfaceTypeMatch (строка) — тип интерфейса подключения. Может быть Celluar для мобильной сети или WiFi;
- SSIDMatch (массив) — название беспроводной сети;
- URLStringProbe (строка) — доступность определенного URL. Если ресурс доступен и возвращает код 200, правило срабатывает. Обрати внимание, при редиректе правило не сработает.
Массив строк выглядит как тег array с одним или несколькими тегами string внутри.
WWW
Подробнее с форматом можешь ознакомиться в официальной документации (PDF, страница 96).
Правила проверяются сверху вниз. Правило срабатывает, когда все указанные внутри него условия соблюдаются. Если правило сработало, то проверка завершается. Поэтому вариант действия по умолчанию можно поставить последним.
Давай напишем простой конфиг. В нем будет три правила:
- первое проверяет интерфейс, и если это мобильная сеть, то VPN включается;
- второе проверяет, не подключены ли мы к домашнему Wi-Fi, определяя его по SSID (это строка с названием). Если да, то VPN отключается;
- третье говорит подключаться к VPN, если мы подключены к какому‑то другому Wi-Fi.
<key>OnDemandEnabled</key>
<integer>0</integer>
<key>OnDemandRules</key>
<array>
<dict>
<key>Action</key>
<string>Connect</string>
<key>InterfaceTypeMatch</key>
<string>Cellular</string>
</dict>
<dict>
<key>Action</key>
<string>Disconnect</string>
<key>SSIDMatch</key>
<array>
<string>SSID ТВОЕГО WI-FI</string>
</array>
</dict>
<dict>
<key>Action</key>
<string>Connect</string>
<key>InterfaceTypeMatch</key>
<string>WiFi</string>
</dict>
</array>
По умолчанию автоматическое подключение будет деактивировано — просто на всякий случай (см. первые две строки). Если уверен в своих правилах, можешь поставить 1 вместо 0, но это можно сделать и потом — в настройках iOS.
Собирай итоговый XML, сохраняй в файл с расширением .mobileconfig и переправь его на устройство любым способом (наиболее конспиративным, если это для тебя важно).
Затем тебе нужно будет сделать следующее:
- Нажать на файл, появится сообщение «Профиль загружен».
- Перейти в настройки и открыть «Основные → VPN и управление устройством → VPN Configuration».
- Нажимать «Установить» и вводить ПИН‑коды и пароли, пока iOS не успокоится и не решит, что ты и правда желаешь установить какой‑то левый серт.
- Зайти в раздел VPN (здесь или в общем списке настроек), поставить галочку напротив своего сервера и попробовать переключить статус в режим «Подключено».
- Чтобы активировать автоматическую работу, заходи в настройки подключения (пиктограмма i) и включай «Подключение по запросу».
Если вдруг возникнут проблемы, отключай «Подключение по запросу» и удаляй профиль там же, где ты его добавлял.
ВЫВОДЫ
Мы развернули свой сервер VPN на основе strongSwan, создали на нем учетную запись и сгенерировали сертификат. С этим сертификатом можно подключаться к VPN с любого устройства.
Далее мы научились делать профили VPN для iOS. Все настройки можно было бы задать и вручную, однако интерфейса, чтобы задавать условия подключения, в iOS нет, тогда как в профиле мы смогли их настроить.
Ты можешь подстроить этот конфиг под свои условия и, например, подключать или отключать VPN на работе или в каких‑то других локациях, экономя время и силы.