Они блокируют нам VPN-сервисы? Тогда мы сделаем свой, с адблоком и плюшками!


Введение
Если без шуток, то в очень непростое время мы живём.
Дисклеймер:
Я не собираюсь давать никаких оценок и мнения касаемо происходящей в мире ситуации, рассмотрим лишь способ обхода ограничений доступа к интернет-ресурсам.
Это касается не только любимого “инстаграмчика” (чёрт бы с ним, но предпринимателей, потерявших платформу, действительно жаль)
Это касается практически каждого из нас. Конкретно могу судить только по сфере IT, но я уверен, что ограничения испытывают как журналисты, так и научные сотрудники.
Вначале некоторые зарубежные сервисы блокировали российские IP. Кто-то из идеологических побуждений, кто-то из регуляторных норм.
Затем некоторые компании и их сервисы за определённые действия начали ограничиваться российскими ведомствами (Meta, как очевидный пример).
А теперь блокируют и публичные VPN-сервисы.
Дело в том, что люди продолжают работать. Что касается embedded, разрабатываются новые проекты, используя нарощенные запасы или доступные в продаже компоненты. Поддерживаются старые. Для всего этого нужна техническая документация, доступная в основном только на сайтах производителей.




Безусловно, можно было скачать всё заранее, или сейчас воспользоваться ещё доступными VPN-сервисами. А если понадобится какая-то дополнительная информация, откуда её брать?
Если кто-то пользуется Qt — то установить его ныне можно тоже только через VPN.
Другой вопрос, касающийся остальных областей IT, относится к безопасности. Имея российский IP, можно нанести вред своему проекту, а то и грохнуть все файлы, использовав какую-то не ту библиотеку или пакет.
Выбор VPS
Что же делать в данной ситуации?
Давайте подойдём к ней прагматично. Если блокируют именно публичные VPN-сервисы, то на ум сразу приходят выделенные серверы, VPS или VDS они называются. На них и развернём VPN.
VPS — кусочек производительности и памяти, выделенный на основном сервере.
Почему такой сервер не заблокируют?
Логика простая. Кому какая разница, чем вы на этих серверах в рамках закона занимаетесь.
У кого-то на них висят веб-сервисы для личных или корпоративных задач, например, буча поднимется нехилая, если безосновательно блокировать начнут.
Теперь дело за малым. Найти правильного хостинг-провайдера.
Критерии для поиска очень простые: сервера есть вне РФ, есть возможность оплаты без гемора.
Вспоминаем, что MasterCard и VISA за рубежом больше не принимаются, поэтому все сугубо иностранные провайдеры отпадают.
Среди наших сервисов есть RuVDS. Помимо РФ, сервера предоставляются в: Швейцарии, Германии, Британии, Нидерландах.
Не выбрал я его только потому, что в своё время был не очень позитивный опыт.
В поиске альтернатив нашёлся PQ Hosting. Ссылка реферальная — покупка услуг поддержит мой сайт.
У них более широкая география серверов: 16 стран, а также возможность оплаты криптовалютой, например.
Важный нюанс:
По правилам хостинга, функционал VPN разрешается использовать только для личных целей. Условно подключить семью, друзей, но не более.

Сравним цены с популярными VPN-сервисами.
Предполагается, что платить будем за 1 месяц, так как при нынешнем курсе не каждый готов внести оплату на полгода-год вперёд.
Я составил прямо список популярных серверов. За доступность не отвечаю, просто взглянем на то, что нам предлагают.
- https://whatismyipaddress.com/vpn-comparison — Общий сводный список. На цены не смотрим, это офферы при оплате на год.
- https://order.surfshark.com/ — EUR 12 за 1 мес. Без лимита устройств.
- https://nordvpn.com/ru/pricing/ — USD 12 за 1 мес. 6 устройств.
- https://protonvpn.com/ru/getvpn — EUR 10 за 1 мес. 10 устройств.
- https://rus.privateinternetaccess.com/buy-vpn-online — USD 12 за 1 мес. 10 устройств.
На хостинге достаточно будет самого минимального тарифа, если не планируется развертывание дополнительных сервисов.
В выборе страны ничего посоветовать не могу, зависит либо от конкретных задач, либо от субъективных предпочтений.
Изначально я выбрал Чехию, но в силу технических обстоятельств пришлось выбрать Нидерланды.

Ключевое отличие от “покупных” сервисов — фиксированная геолокация. Это может быть как недостатком — невозможность быстро сменить регион в специфических обстоятельствах, так и преимуществом — IP белый, статический, привязанный только к Вам. Если какая-то авторизация завязана на это — ничего не слетит.
А ещё не ограничены трафик и время подключения, выбор любой удобной технологии.
Есть небольшой нюанс — скорость подключения зависит напрямую от тарифа. Хоть и указан гигабитный порт — это значит, что гигабит заходит на стойку в дата-центре, а дальше всё зависит от приоритета по тарифу.
Пример:
# Тариф за 5.27 Евро (Argentum-[NL]):
speedtest
Retrieving speedtest.net configuration...
Testing from PQ HOSTING S.R.L (91.242.хх.хх)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by 31173 Services AB (Amsterdam) [94.29 km]: 25.654 ms
Testing download speed...
Download: 38.27 Mbit/s
Testing upload speed...
Upload: 61.09 Mbit/s
# Тариф за 8.27 Евро (Ruthenium-[NL]):
speedtest
Retrieving speedtest.net configuration...
Testing from Netassist Limited (94.131.xx.xx)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by 31173 Services AB (Amsterdam) [5862.40 km]: 4.567 ms
Testing download speed...
Download: 125.57 Mbit/s
Testing upload speed...
Upload: 156.84 Mbit/s
Что сказать… Маркетинг, плюс дорогой интернет в этих ваших Европах.
Сотки вполне себе должно хватать для комфортного сёрфинга, учитывая скорость мобильного интернета.
Да, 8 Евро может быть дорого, но если брать с кем-то в складчину — то вполне себе норм.
Регистрируемся, не забывая про рефералку. Пополняем счёт любым удобным способом, заказываем сервер.

Выбираем Ubuntu, панель управления нам не нужна.

Оплачиваем, через 15 минут будет выдан IP и запущен процесс установки. Если что-то не так — смело стучимся в поддержку.
Проследить за выполнением установки можно перейдя в панель управления услугой, затем открыть инстанс VNC.



Процесс установки ОС занимает примерно 15-17 минут. Вводим пароль, который можно найти в кабинете биллинга, или меняем на свой, в панели управления услугой.

UPD 2023:
pq-hostng начал ставить новую панель управления, в ней какие-то проблемы с подключением к встроенному VNC, подключайтесь сразу по SSH.
Дополнительно [опционально!] я делегировал домен. Описано это в FAQ.
Нужно внести 2 записи:
Первую в DNS домена, который обслуживает доменный брокер. У меня это reg.ru. (Ссылка реферальная, на покупку домена)
МОЙ ПРОМОКОД на 5% скидки: 234C-5D92-2F61-A31A

Вторую запись нужно внести на DNS-хостинг провайдера сервера.

Связываем IP сервера и доменное имя — прописываем master-запись.

Выбор технологии
Существует несколько протоколов для организации VPN-туннеля.
Устаревшими и менее безопасными считаются L2TP, IKEv1, RSA, OpenVPN.
Современные протоколы — WireGuard, IKEv2.
Проще всего развернуть протокол через скрипт. Не нужно морочиться с настройкой и прописыванием всего вручную, один раз сконфигурировал, запустил и забыл.
Одним из таких скриптов был Streisand. Но он 2 года уже как не поддерживается, репозиторий в архиве, придётся очень постараться, чтоб запустить его без проблем.
Если хочется запустить чисто WireGuard, с удобным веб-интерфейсом, то есть скрипт wg-easy.
Вся установка там описана, заостряться на ней не буду.
Я же воспользуюсь скриптом algo VPN.
Он разворачивает протоколы IPSec IKEv2 (изкоробочный для iOS).
А также WireGuard, самый современный, простой и быстрый.
Генерирует для них профили. Блокирует рекламу на уровне DNS.
Предполагается загрузка его на локальную машину, а затем запуск на готовом сервере от одного из хостинг-провайдеров. Мы же будем разворачивать его локально.
Дополнительно воспользуемся установкой OpenVPN с помощью скрипта openvpn-install.
Для вас это необязательно, но мне требуется для некоторых устройств.
Deploy в прод
Установка WireGuard & IPSec
Для доступа к своему серверу можно воспользоваться VNC. Либо же воспользоваться SSH:
– Под Windows — PuTTY или WinSCP.
– Linux имеет SSH “из коробки”.
Я буду пользоваться ssh из терминала своей федоры, так привычней.
Для подключения сгенерируем SSH-ключ и скопируем его на сервер. Так мы сможем подключаться без пароля. Описание.
ssh-keygen
Ответ будет таким:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/enik/.ssh/id_rsa): # оставим пустым по умолчанию
Enter passphrase (empty for no passphrase): 123 # запишем дополнительный пароль, например '123'
Enter same passphrase again: 123
Your identification has been saved in /home/enik/.ssh/id_rsa.
Your public key has been saved in /home/enik/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:GKW7yzA1J1qkr1Cr9MhUwAbHbF2NrIPEgZXeOUOz3Us enik@enik
The key's randomart image is:
+---[RSA 2048]----+
|.*++ o.o. |
|.+B + oo. |
| +++ *+. |
| .o.Oo.+E |
| ++B.S. |
| o * =. |
| + = o |
| + = = . |
| + o o |
+----[SHA256]-----+
Далее скопируем ключик на сервер:
ssh-copy-id root@crazygeeks.ru
# скопируется файл из директории по умолчанию
# перед @ указывается пользователь, после - IP/домен сервера
Получим ответ:
root@crazygeeks.ru's password: # вводим пароль сервера
Теперь подключимся к серверу:
Со скопированным ключом это произойдёт без пароля!
ssh root@crazygeeks.ru
Теперь начинаем установку скрипта.
UPD 2023:
Ниже указывается, что можно будет потом добавить пользователей. Либо авторы обновили скрипт, либо я нашёл решение проблемы.
Оно таково: нужно запускать скрипт из под обычного пользователя, не из под root.
Поэтому создадим пользователя для VPN:
adduser vpn # Создаём пользователя VPN
# Указываем все его параметры и пароль
usermod -aG sudo vpn # Даём права суперпользователя
groups vpn # Проверяем, что всё получилось
su vpn # переходим в нашего пользователя
Хостинг ставит минимальную конфигурацию Ubuntu, поэтому для следующих шагов нам необходимо установить Git.
sudo apt update
sudo apt upgrade
sudo apt install git -y
Далее начинаем идти по гайду, описанному в readme.md.
Для начала скачаем репозиторий.
git clone https://github.com/trailofbits/algo.git
Далее скачаем python с поддержкой виртуальных окружений.
sudo apt install -y --no-install-recommends python3-virtualenv
Переходим в директорию, куда загрузился репозиторий, и запускаем установку зависимостей окружения.
python3 -m virtualenv --python="$(command -v python3)" .env &&
source .env/bin/activate &&
python3 -m pip install -U pip virtualenv &&
python3 -m pip install -r requirements.txt

После установки заходим и редактируем файл config.cfg
nano config.cfg
В нём прописываем профили для каждого пользователя. Желательно ещё и для каждого устройства создать свой.

Остальная конфигурация нас в основном не интересует. Можете покопаться, но для обычной установки трогать ничего не надо.
Выходим из nano: Ctrl-X.
Ну и далее запуск скрипта.
./algo
Установка будет несколько раз прервана в начале, ожидая ввод параметров от пользователя, так что внимательно обращаем на это внимание.
Первое, что нас спросят — расположение установки. У нас кастомный сервер, указываем 12.

Далее 2 раза спросят про опцию “Connect on Demand” для iOS-устройств. Она значит, что VPN будет подключен всегда, в сотовых и в Wi-Fi сетях соответственно. В любом случае, эту опцию потом можно будет переключить со стороны клиента.

Если ответили положительно касаемо Wi-Fi сетей, попросят ввести список “доверенных” SSID, где VPN будет по умолчанию отключен. Можно оставить это поле пустым.
Далее спросят про сохранение ключей. Эта опция необходима, в случае если хотим потом отредактировать список пользователей, добавить/удалить профили.

Далее блокировка рекламы.

Затем спросят про ключи SSH для каждого клиента. Предполагается, что никто из пользователей не будет напрямую взаимодействовать с сервером, поэтому отвечаем отрицательно.

Подтверждаем, что согласны со всеми рисками клавишей ENTER.

Последние 2 вещи, которые попросят:
Указать адрес установки. Ставим всё внутри сервера, поэтому указываем localhost.
Указать внешний IP адрес сервера (из панели биллинга) или доменное имя, которое делегировали на IP.

Откидываемся в кресле и ждём приблизительно 10 минут.
Если всё получилось, выйдет подобное сообщение. ОБЯЗАТЕЛЬНО сохраняем ключи, они могут пригодиться в дальнейшем.

Если нужно добавить новых пользователей:
cd ~/algo
nano config.cfg # Открываем файл конфигурации и вписываем новых пользователей
source .env/bin/activate # Запускаем окружение
./algo update-users # Просим algo обновить список пользователей
Процесс снова займёт какое-то время. По окончании не забудьте снова сохранить пароль.
Установка OpenVPN
Дополнительно можно установить OpenVPN.
Переходим в домашнюю папку и скачиваем git-репозиторий.
Затем перейдём в папку репозитория, пропишем права на запуск скрипта.
cd ~
git clone https://github.com/angristan/openvpn-install.git
cd openvpn-install/
chmod +x openvpn-install.sh
Теперь можем его запускать.
./openvpn-install.sh
Установка снова интерактивная, все профили добавляются в процессе.
Для начала введём внешний IP или домен сервера.

IPv6 нам не нужен, так как он нормально в РФ не работает.
Выбираем порт доступа.

Далее указываются протокол подключения и DNS-сервера.

Остальные 2 параметра касаются безопасности, оставляем их по умолчанию.

Подтверждаем установку любой клавишей, немного ждём, а затем прописываем первый профиль.

Для повторной установки необходимо вновь запустить скрипт по той же команде, следовать инструкциям.
На этом установку можно считать оконченной.
Загрузка профилей
Перед подключением, необходимо достать профили с сервера, чтоб мочь раздать их людям.
На линуксе есть встроенные утилиты такие как: scp
, rsync
.
Я воспользовался rsync
, так как он банально быстрее.
Синтаксис прост:
rsync options from to_src
# например - перенос профиля в папку VPN в домашней директории
rsync -av root@crazygeeks.vpn:~/profile.ovpn ~/VPN
Для Windows есть масса программ с графическим интерфейсом. Например, WinSCP

Получаем удобный доступ к домашней папке, можем смело копировать профили на локальную машину.

Что касается профилей algo, нас интересует директория algo/configs/<server>.

Клиентская установка
IPSec подходит лучше для Apple-устройств. Скрипт формирует готовые профили с расширением .mobileconfig
.
В остальных случаях следует применить WireGuard или OpenVPN.
Установка на iOS
Любым удобным способом направляем файлик с профилем .mobileconfig пользователю.
Листайте галерею:
Если требуется, чтоб VPN постоянно был включен, то ставим соответствующую галочку, или наоборот.

Установка WireGuard
С WireGuard тоже всё просто. Для пользователей создаётся пара файлов: файл .cfg и PNG-картинка с QR-кодом.
Для Windows есть GUI-клиент, устанавливаем, туда вносим .cfg и пользуемся.


Для мобильных устройств воспользуемся приложением и QR-кодом.


Тесты скорости
Проводная сеть
У меня дома гигабитный канал, поэтому все ограничения не будут упираться только в него. Контрольный замер:

Теперь посмотрим на туннель OpenVPN:

Не густо… Ну а как ещё.
И WireGuard:

Скорость ощутимо выше, что означает, что веб-ресурсами будет пользоваться гораздо комфортнее.
Wi-Fi
Сеть 5 ГГц, все тесты телефон находился в статичном одинаковом положении.
Сперва контрольный замер:

Туннель IPSec

Туннель WireGuard

Как мы видим, показатели вполне сопоставимы, что позволяет использовать оба протокола на равных условиях.
Ссылки
Блокировки РКН:
Материалы о вредительстве в Open-Source ПО:
- https://www.youtube.com/watch?v=2M-L0yPbtPE
- https://pikabu.ru/story/poyavilsya_novyiy_trend__nanosit_ushcherb_kompam_iz_rf_8934074
- https://docs.google.com/spreadsheets/d/1H3xPB4PgWeFcHjZ7NOPtrcya_Ua4jUolWm-7z9-jSpQ/htmlview?pru=AAABf7s6eoc*lXxgW2OQG5yig1d0fmf3cQ#
Дополнительные статьи об установке VPN сервера:
- https://vc.ru/services/371769-kak-sozdat-svoy-personalnyy-vpn-na-windows-ios-i-macos
- https://eternalhost.net/base/vps-vds/vps-dlya-vpn
- https://habr.com/ru/post/335516/
- https://www.comss.ru/page.php?id=6755