February 5, 2024

Боремся с экстремизмом и дискриминацией: поднимаем VPN за полчаса

Важный и очень понятный дисклеймер. На момент публикации этого гайда (5 февраля 2024 года) обсуждение и использование личных средств обхода блокировок не является противозаконным. Автор свято чтит русское законодательство и не призывает вас к совершению противоправных действий. Всё, что вы делаете, вы делаете на свой страх и риск. Я предупредил.


Итак, ситуация. Вам нужно скачать драйвера для вашего чипсета Intel, вы заходите на официальный сайт и видите, что эта контора пидарасов повесила заглушку «мы остановили бизнес в России».

Знакомо, да? В 2023 году педерастия была объявлена экстремизмом в нашей стране — так давайте же бороться с экстремизмом вместе!

Хостинг

Для начала вам нужен собственный сервер. Это должна быть виртуальная машина (VPS) или выделенный сервер (VDS). Шаред-хостинги и прочее не подойдут — нам нужен полноценный линукс-компьютер, к которому мы имеем рут-доступ. В нынешние времена этот пункт самый сложный — мало того, что половина зарубежных хостингов выкинула россиян на мороз (кто-то из-за отсутствия возможности заплатить МИРом или криптой, кто-то — потому что пидарасы экстремисты), так ещё и с 1 февраля 2024 года компаниям, не входящим в реестр РКН, запрещено предоставлять услуги хостинга россиянам. Ни одна зарубежная компания в этот список не зарегистрировалась.

Помимо выбора компании, которая продаст вам доступ к линукс-машине, вам сразу надо будет выбрать одну определенную локацию, где она будет находиться. Здесь вам не коммерческий VPN, пощелкать в приложении среди пятидесяти стран не получится. Если вы находитесь за пределами нашего богоспасаемого отечества и хотите получить доступ к сайтам внутри России — арендуйте машину в России. В противном случае — арендуйте машину там, где ближе всего ваши любимые сайты. Для европейской части России отлично работают сервера в Нидерландах, Германии или Франции.

Ссылок на хостинги по изложенным выше причинам давать не буду — в комментариях к моему каналу пользователи предложили свои варианты, выбирайте. Ну или гугл в помощь. Удачи.

Софт

VPN-решения для селфхоста делятся на два типа: «технические» и «для обычных пользователей». Первые требуют более полного погружения со стороны пользователя в процесс настройки, зато по итогу пользователь понимает, что конкретно обеспечивает работу его соединения и может довериться в какой-то мере ПО с открытым исходным кодом. Вторые же прячут всю техническую требуху за простым пользовательским интерфейсом — с одной стороны, обычному пользователю так удобней, с другой, безопасность и надёжность такого решения ненамного лучше, чем у просто коммерческих VPN. В общем, выбор за пользователем, а я освещу оба варианта.

Amnezia VPN

... идёт нахуй. Это ваш прямой пропуск в каталажку. Господа открыто сотрудничают с политическими диссидентами и в целом не вызывают доверия (а ещё я не сразу нашёл исходники, но они есть). Кроме того, они требуют полный доступ к вашему серверу: по сути, вы передаёте сервер в управление чужому дяде без гарантий и ответственности. Если завтра эти товарищи решат устроить из серверов, на которых установлена их программа, ботнет, атакующий Пентагон/Минобороны/Китай/кого там нынче модно будет атаковать — вы мало того, что ничего с этим и сделаете, так ещё и сами за это присядете, так как, выдав рут-доступ этому приложению, вы на всё согласились и начали нести ответственность.

В целом, важное правило безопасности: никогда не доверяйтесь системам, которые сотрудничают с политическими диссидентами, оппозицией (или властями) той или иной страны, и прочими товарищами, взаимодействие с которыми может привести рядового Васю Пупкина в состав Шторм Z. Опять же, я вас предупредил.

Outline VPN

А вот этот софт пробовать можно. Ссылка: тыц. Исходники в наличии, если есть желание провести аудит — пожалуйста. Диссидентскую прессу не рекламируют — и то хлеб. Впрочем, весь мой спич про ботнет выше вполне себе применим и к Outline VPN, так что этот способ рекомендуется исключительно тем, кто не хочет заморачиваться — и исключительно на чистой виртуалке, где больше ничего не установлено.

Итак, предположим, что вы нашли хостинг, и купили себе там виртуалку. Для дальнейших шагов будет использоваться следующая конфигурация:

  • 1 ядро CPU 2.3 GHz
  • 2 гигабайта RAM
  • 40 гигабайт SSD
  • Ubuntu 22.04 (последняя на данный момент LTS)

Машинка, конечно, весьма хилая, но для одного-двух пользователей VPN будет вполне достаточно. Для чистоты эксперимента автор воспользовался не собственной инфраструктурой, а завёл VPS на одном из рекомендованных пользователями сервисов.

Итак, я получил письмо с параметрами сервера, и запустил таймер на телефоне. Предположим, что у вас установлена Windows — в последних версиях Windows 10 и Windows 11 уже встроен SSH-клиент из консоли. Открываем Windows Terminal (правой кнопкой мыши по меню Пуск → Windows Terminal) и в открывшемся окне набираем:

$ ssh root@<IP-адрес, который вам предоставил хостинг, например, 112.19.54.22>

У вас попросят пароль — ввведите тот, что вам предоставил хостинг (или тот, что установили сами при установке ОС через панель управления хостинга). Нас встретит «дружелюбная» оболочка Ubuntu. Первым делом, обновляем систему — чаще всего, хостинги устанавливают ОС с готовых образов, которые обновляют раз в полгода.

 # apt update && apt upgrade && reboot

На предложенный список пакетов для обновления отвечаем Y, после чего система автоматически обновится и перезагрузится.

Так как мы выбираем «хомячковый путь», то вся дальнейшая история опять же проходит через приложение поставщика VPN. Скачиваем его отсюда (Outline Manager), ну или с гитхаба. Приложение доступно под Windows, Linux и macOS.

После установки приложение встречает нас мастером настройки:

Скорее всего, нас будет интересовать четвёртый пункт — «Настройте Outline где угодно». Выбираем его:

Нам предлагается запустить bash-скрипт для установки Outline на сервер. Скрипт можно (и нужно!) почитать вот тут — запускать что попало на своих машинах не глядя, нельзя!

Открываем Windows Terminal (если вы его вдруг закрыли), после чего заходим на свой сервер по SSH:

$ ssh root@<IP-адрес>

После того, как увидели приветствие Ubuntu в терминале, копипастим туда предложенную команду. Скрипт предложит установить Docker — соглашаемся. Установка Docker занимает пару минут.

В конце скрипт поздравит вас с установкой Outline и покажет зелёным текстом строку, которую надо скопировать в Outline Manager. Нажимаем «Готово», иии...

Успех! ПО установлено.

А что же нам установил Outline? Так как это ПО работает в Docker, мы можем проверить запущенные контейнеры, выполнив в терминале нашей убунты команду docker ps:

# docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS                   PORTS      NAMES
8b3b05335449   containrrr/watchtower              "/watchtower --clean…"   3 minutes ago   Up 3 minutes (healthy)   8080/tcp   watchtower
bc485a0f8ee6   quay.io/outline/shadowbox:stable   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes
       shadowbox

Как видим, запущены два контейнера: сам Outline и ватчдог, который следит за его состоянием. Исходники для них можно найти — это упражнение оставляю пытливому читателю.

Командой netstat -nlp в том же убунтовском терминале можно проверить открытые порты, которые слушает наш сервер:

# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      430/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      560/sshd: /usr/sbin
tcp        0      0 127.0.0.1:9090          0.0.0.0:*               LISTEN      2519/prometheus
tcp        0      0 127.0.0.1:9092          0.0.0.0:*               LISTEN      2524/outline-ss-ser
tcp6       0      0 ::1:9091                :::*                    LISTEN      2508/node
tcp6       0      0 :::22                   :::*                    LISTEN      560/sshd: /usr/sbin
tcp6       0      0 :::55840                :::*                    LISTEN      2508/node
tcp6       0      0 :::36791                :::*                    LISTEN      2524/outline-ss-ser
udp        0      0 127.0.0.53:53           0.0.0.0:*                           430/systemd-resolve
udp6       0      0 :::36791                :::*                                2524/outline-ss-ser
raw6       0      0 :::58                   :::*                    7           388/systemd-network
...


Пришло время устанавливать клиент — скачивается он там же, где и сервер. Клиенты есть под Android, iOS, Windows, Linux и macOS. После установки на ПК нас встретит вот такое окно:

Предположим, что вы доверяете разработчикам Outline (иначе вы бы не дали им рут-доступ на предыдущем шаге, не так ли?). Нажимаем ОК.

Нажимаем «Добавить сервер». Приложение запросит ключ доступа — переходим в Outline Manager, и видим, что у нашего сервера внизу установлен один ключ доступа. Нажимаем кнопку Share рядом с ним и копируем ключ в буфер обмена. Клиент Outline автоматически прочитает ключ из буфера обмена, и вставит его (ай-яй-яй, господа, прослушивать буфер обмена — нехорошо!).

Нажимаем «Добавить сервер». Сервер появляется в интерфейсе, и теперь осталось только нажать кнопку «Подключить». Готово, вы восхитительны!

Время установки: около 10 минут.

Сложность: изи.

Плюсы:

  • быстрая установка
  • не надо быть линукс-гуру
  • работает стабильно

Минусы:

  • вы доверяете свою виртуалку в прямое управление неизвестной группе лиц
  • политические риски (брендированный VPN-клиент могут искать на устройствах пользователей, например — причём не только с помощью личного визита товарища майора)

Если указанные выше минусы вас устраивают — поздравляю, можете расслабиться и скачивать ваши драйвера с сайта Intel. Меня такой подход не устраивает, поэтому пришло время засучить рукава и погрузиться в колдовство с терминалом. Простенькое, но колдовство.

WireGuard

Итак, вы решили немного покрасноглазить и установить самый популярный сервер VPN последних нескольких лет. И сразу же важный дисклеймер: в некоторых сетях банят всех WireGuard-соединения без разбору, включая личные и даже рабочие. Я с таким не сталкивался, но предупредить должен.

Итак, возвращаемся в исходное положение — у нас есть чистый сервер с Ubuntu 22.04, конфиг которого я описал в разделе про Outline. Заходим на него по SSH, обновляем, перезагружаем...

У нас есть два пути: тяжёлый и полегче. Тяжёлый — это устанавливать руками wireguard-tools, бодаться с ключами, и так далее. Лёгкий — взять готовый докер-контейнер с конфигуратором, например, тут. К контейнеру прилагается читаемый Dockerfile и исходники админ-панели, идущей в комплекте. В этот раз мы пойдём лёгким путём.

Для начала, устанавливаем Docker последней версии. Для этого вводим в терминале Ubuntu команду:

 # curl https://get.docker.com/ | sh

Этот автоматический скрипт добавит репозиторий Docker в систему и установит его. Напоминаю, что перед запуском скриптов на своей машине в них лучше заглянуть!

После завершения выполнения скрипта командой docker info проверяем, что сервис установился. В ответ на команду в консоли должно появиться нечто подобное:

# docker info
Client: Docker Engine - Community
 Version:    25.0.2
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.12.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.24.5
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 25.0.2
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.15.0-91-generic
 Operating System: Ubuntu 22.04.2 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 1.918GiB
 Name: p513342.kvmvps
 ID: 91998490-e43b-4dc4-ae64-f9a780389728
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

Следующим шагом будет написание файла Docker Compose: это специальный файл, который описывает запускаемый Docker-ом сервис с его параметрами. Написание таких файлов для запускаемых контейнеров — отличная идея. Он позволяет обеспечить автозапуск и управление сервисом простыми командами, без длинной колбасы параметров командной строки. Файл Docker Compose называется docker-compose.yaml. Для его написания на сервере введите команду nano ~/docker-compose.yaml

Откроется не самый дружелюбный в мире текстовый редактор Nano, который, впрочем, позволяет в себя спокойно копипастить — а большего нам, в целом и не требуется. Ваш файл docker-compose.yaml должен выглядеть примерно вот так:

version: "2.4"

services:
  wgeasy:
    container_name: wgeasy
    image: ghcr.io/wg-easy/wg-easy
    restart: unless-stopped
    environment:
      - LANG=ru
      - WG_HOST=<ваш IP адрес, который вам предоставил хостинг>
      - PASSWORD=<ваш суперсекретный пароль>
    volumes:
      - "~/.wgeasy:/etc/wireguard"
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1

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

Сохранив файл, приступаем к первому запуску контейнера. Для этого набираем docker compose up. В случае успеха у вас в терминале появится нечто подобное:

Если у вас появилась строка Wireguard Config synced, первый запуск прошёл успешно. Останавливайте контейнер, нажав Ctrl-C — мы не хотим постоянно висящий терминал, который подключен к нашей виртуалке, поэтому мы должны запустить контейнер в «отвязанном» режиме — то есть, в фоне. Для этого выполняем команду:

 # docker compose up -d

Ключ -d в этой команде указывает Docker, что мы не хотим подключаться к логам контейнера, и хотим видеть его в фоне. Теперь, чтобы увидеть логи контейнера, мы можем запустить команду docker compose logs.

Для следующего шага нам понадобится веб-браузер и тот пароль, что вы записали в файле docker-compose.yaml ранее (вы же позаботились о том, чтобы он был надёжным, верно?). Открываем сайт с адресом http://<IP вашей виртуалки>:51821. Да, именно так — http и с номером порта на конце. В случае успеха вас поприветствует интерфейс, который попросит пароль:

По умолчанию в наш WireGuard-сервер не добавлен ни один клиент.

Пара клиент-сервер обязательна для работы данного VPN, так что добавляем нашего первого клиента. Нажимаем New Client:

В поле Name вводим любое удобное имя — сейчас мы будем настраивать клиент для Windows, поэтому я назову клиент «windows». Нажимаем Create:

Клиент создан. Теперь нам надо подключиться. Скачиваем официальное приложение WireGuard для Windows с сайта проекта (кнопка Download Windows Installer в самом верху). Клиент запускается автоматически сразу после установки (и не даёт себя скриншотить).

Возвращаемся в веб-браузер с нашей админкой Wireguard, где нажимаем кнопку скачивания рядом с нашим добавленным клиентом «windows». Открыв клиент Wireguard, нажимаем в основном окне кнопку «Импорт туннелей из файла». В открывшемся проводнике выбираем скачанный файл (в данном случае — «windows.conf»), нажимаем ОК и видим, что наш конфиг добавился в клиентское приложение.

Нажимаем «Подключить» справа ближе к центру. Если ваш провайдер не страдает фигней и не блокирует весь WireGuard-трафик — готово, вы восхитительны!

Процедура настройки WireGuard на телефоне ещё более простая: устанавливаем клиент из Google Play, в веб-интерфейсе нашего WireGuard-сервера добавляем клиента, нажимаем рядом с ним кнопку с изображением QR-кода, открываем WireGuard на телефоне, нажимаем плюсик, сканируем код, радуемся жизни.

Ну как «радуемся», скорость оно режет примерно на половину от той, что рекламирует хостинг виртуалки, но для своих задач — вполне подойдёт. Общее время установки VPN и настройки двух клиентов — где-то 15-20 минут.

Пара слов про фаерволы

Во время написания этого гайда я ни разу не упомянул настройку фаерволов. Дело в том, что большинство хостинг-провайдеров не имеют фаервола на своей стороне, и в целом не препятствуют никакому трафику, исходящему от ваших виртуальных машин. Однако это верно не для всех провайдеров — а кроме того, вы можете захотеть настроить себе фаервол самостоятельно — так что могут возникать ситуации, когда трафик вашего VPN-сервера блокируется. Так как гайд уже разросся в простыню, я оставлю настройку фаервола на своей виртуалке за скобками (отличная идея для статьи уважаемому @coweram, кстати). Ну а если вам попался хостинг, у которого есть свой внешний фаервол — здоровья погибшим, время ковыряться в их панели управления или общаться с техподдержкой.

Заключение

Надеюсь, этот гайд был вам полезен. В этой части я затронул достаточно простые (как для установки, так и для блокировки со стороны провайдера) виды VPN — в дебри ShadowSocks и прочих шаманств я, пожалуй, погружусь в следующий раз. Для большинства пользователей одного из двух представленных выше вариантов должно хватить за глаза — во всяком случае пока. Дерзайте, и помните — за селфхостом будущее.

Поблагодарить автора можно тут, а подписаться — тут.