Не­дав­но я обна­ружил, что на iPhone мож­но сде­лать так, что­бы VPN авто­мати­чес­ки вклю­чал­ся и вык­лючал­ся в опре­делен­ных усло­виях. Хорошень­ко рас­курив докумен­тацию, я накатал кон­фиг, и теперь VPN у меня на телефо­не работа­ет при под­клю­чении к мобиль­ной сети или гос­тевому Wi-Fi, а дома отклю­чает­ся. В этой статье я покажу, как сде­лать неч­то подоб­ное. Одна­ко сна­чала нам понадо­бит­ся сам сер­вер VPN — в качес­тве него мы уста­новим strongSwan.

Та­кой выбор обус­ловлен тем, что ни OpenVPN, ни WireGuard не под­держи­вают­ся в iOS без прог­раммы‑кли­ента. Нам же для того, что­бы покопать­ся в пра­вилах под­клю­чения, нуж­но будет заг­рузить на устрой­ство кас­томный про­филь VPN, а это воз­можно, толь­ко если мы под­клю­чаем­ся сис­темны­ми средс­тва­ми. Про­токол IKEv2/IPSec, реали­зован­ный в strongSwan, как раз под­держи­вает­ся на уров­не сис­темы. При­чем не толь­ко в iOS — точ­но так же без вся­кого кли­ента к нему мож­но под­клю­чать­ся из Windows и Linux.

От­вет на воп­рос, зачем тебе свой VPN, ты, думаю, уже зна­ешь. Нап­ример, через него час­то нас­тра­ивают под­клю­чение к при­ват­ной инфраструк­туре или получа­ют дос­туп к ресур­сам, до которых тра­фик по тем или иным при­чинам не доходит нап­рямую. Да что там, может, тебе прос­то иног­да любопыт­но, как выг­лядит глав­ная стра­ница Pornhub в стра­не, где ты толь­ко что арен­довал недоро­гой VPS!

 

Ставим и настраиваем 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 тебе нуж­но:

  1. Дваж­ды клик­нуть на файл с сер­тифика­том и под­твер­дить его добав­ление в цепоч­ку клю­чей, вве­дя пароль.
  2. От­крыть цепоч­ку (Keychain Access), най­ти VPN root CA и задать нуж­ные раз­решения. Дваж­ды клик­ни по нему, рас­крой раз­дел «Доверять» (Trust) и выбери «Доверять всег­да» (Always Trust) нап­ротив стро­ки IPSec.
  3. Соз­дать соеди­нение в нас­трой­ках сети. Нажимай плю­сик вни­зу, выбирай VPN, IKEv2 и жми «Соз­дать» (Create), впи­сывай IP сер­вера в стро­ки «Адрес сер­вера» и «Уда­лен­ный ID».
  4. В нас­трой­ках соеди­нения выбирай «Имя поль­зовате­ля» и ука­жи свои логин и пароль.

В Windows про­цесс нем­ного дру­гой:

  1. От­кры­вай «Кон­соль управле­ния», выбирай «Файл → Добавить или уда­лить оснас­тку → Сер­тифика­ты → Добавить».
  2. Что­бы VPN работал для любого поль­зовате­ля, выбирай «Учет­ная запись компь­юте­ра» и жми «Далее». Затем жми «Локаль­ный компь­ютер» и «Закон­чить».
  3. В «Кор­не кон­соли» выбирай «Доверен­ные кор­невые цен­тры сер­тифика­ции для доверия федера­ции» и «Сер­тифика­ты».
  4. В меню «Дей­ствия» в пра­вой панели наж­ми «Все задачи» и «Импорти­ровать».
  5. Вы­зови меню выбора фай­ла, выс­тавь тип X.509 и импорти­руй свой сер­тификат.
  6. Те­перь нуж­но соз­дать под­клю­чение к VPN. Зай­ди в «Панель управле­ния → Сеть интернет». В Windows 7 может понадо­бить­ся соз­дать новое под­клю­чение к рабоче­му мес­ту, в Windows 10 и 11 дол­жен быть спе­циаль­ный раз­дел VPN. В любом слу­чае впи­сывай адрес сер­вера, логин и пароль.
  7. Мо­жешь под­клю­чать­ся!

На iOS уста­нов­ка схо­жа с тем, что мы делали на macOS. Но пос­коль­ку я обе­щал про­демонс­три­ровать воз­можность авто­мати­чес­ки вклю­чать и вык­лючать VPN, мы вмес­то это­го соз­дадим файл с про­филем, который заод­но будет содер­жать и все нас­трой­ки.

На Android, увы, strongSwan не под­держи­вает­ся на уров­не ОС, поэто­му тебе при­дет­ся ска­чать кли­ент­ское при­ложе­ние и нас­тро­ить его. Впро­чем, эта статья ори­енти­рова­на на поль­зовате­лей iOS, так что я не пред­полагаю, что речь о тво­ем основном телефо­не.

 

Куем профиль для iOS

А теперь самая важ­ная часть нашего прик­лючения, ради которой все и затева­лось. Мы соз­дадим кас­томный про­филь для iOS, где про­пишем, при каких усло­виях устрой­ство дол­жно под­клю­чать­ся к VPN. Не вол­нуй­ся — пол­ностью полагать­ся на авто­мати­зацию необя­затель­но, и при желании ты смо­жешь деак­тивиро­вать такое поведе­ние в нас­трой­ках, что­бы вклю­чать и вык­лючать VPN вруч­ную.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Подписаться
Уведомить о
4 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии