Так уж вышло, что в наше неспокойное время лучше иметь под боком всякие запасные варианты… О них мы сегодня и поговорим.

— Жизненная ситуация - просыпаешься утром, открываешь окно и прыгаешь с 6-го этажа….

— Ну нет же! Это другой сценарий в твоей 1931 жизни! А сейчас у нас 85109! Хватит ностольгиировать о неслучившемся!

— Лааадно… Значит так… Жизненная ситуация, просыпаешься в обед, открываешь холодильник, а у тебя WI-FI сломался!

— Тааак.. Продолжай…

— Ну и короче… Открываешь ты холодильник, а там ICE ёбет TURN, а он так: stun~ stun~ stun~

Так начинается типичный разговор между bork и sch…


Как все начиналось

В начале апреля этого года мы задумались о создании своей децентрализованной виртуальной сети, которая бы объединила всю инфраструктуру POTATOM’а. Использовать обычный WireGuard было не совсем круто - один центральный сервер отваливается и вся инфраструктура падает, к тому же, блокировки РКН в сторону VPN протоколов нас настораживали. Разумеется, можно использовать AmneziaWG, но с ним проблема централизации остается актуальной, что нас не устраивало.

Мы начали искать готовые решения, которые могли бы нам помочь в этом… Найти их не так уж сложно, есть всякие TailScale, ZeroTier, NetBird и прочие. Но в них по прежнему используется система единого централизованного узла, через который происходит подключение ко всей сети. Опять же, в случае блокировки IP этого узла вся сеть становится недоступна. Продолжив поиски, мы нашли ультимативное решение - EasyTier. Это инструмент с открытым исходным кодом для создания децентрализованных виртуальных Mesh сетей и проброса портов.

Как работает EasyTier

В отличие от классических VPN, где весь трафик идет через один главный сервер, EasyTier работает по принципу P2P (Peer-to-Peer). При запуске узлы сети обращаются к публичным серверам сообщества или к собственному серверу только для того, чтобы узнать о существовании друг друга. Устройства пытаются установить прямое зашифрованное соединение друг с другом, пробивая брандмауэры и NAT провайдеров. Если пробитие удалось (есть пробитие), трафик идет напрямую от компьютера к компьютеру с минимальной задержкой. Если же прямая связь невозможна, трафик пойдет в обход через один из доступных публичных узлов сети в зашифрованном виде.

В сети EasyTier нет жесткого разделения на сервер и клиент - любой узел может выступать в роли ретранслятора, то есть ретранслировать трафик для других участников сети. Весь сетевой трафик защищен сквозным шифрованием (E2EE) на базе протоколов WireGuard или с использованием шифрования AES-GCM. Даже если данные идут через чужой узел, перехватить или расшифровать их невозможно.

По своей логике EasyTier похож на Tailscale или ZeroTier, но имеет важное преимущество - он полностью независим, написан на языке Rust и не требует обязательной привязки к коммерческому облаку или центральной панели управления.

Но в чем подвох?

Да собственно ни в чем, за исключением того, что это не анонимная сеть, но в нашем случае это и не надо. Проблемы EasyTier начинаются, когда хочется перестать жмакать тупые команды в терминале и перейти на красивый GUI. Поскольку Изька разработана китайцами, для нашего русского человека их понятия не по понятию. Веб-морда и приложение на китайском или ломаном английском, из-за чего простому обывателю пользоваться им практически невозможно. Не думаю, что каждый человек захотевший поиграть в Minecraft по сети знает китайский и сетевые технологии.

Собственно, это и послужило началу разработки pnet!

Pnet - p2p Network Manager

pnet - это обёртка над EasyTier на Go с веб-интерфейсом. Полностью портативная: все файлы лежат рядом с исполняемым файлом, при первом запуске EasyTier скачивается автоматически.

Сейчас я вкратце опишу возможности и конфигурацию:

Возможности

  • Серверы (bootstrap) — список bootstrap-пиров для подключения к mesh-сети
  • Порт bootstrap-пира — локальный listener-порт (по умолчанию 11010); полезно, если pnet сам выступает bootstrap-пиром
  • Сети — настройка VPN-сетей (имя, пароль, IP; пустой IP = DHCP)
  • Имя узла (hostname) — отображаемое имя узла внутри сети; пусто = системный hostname
  • Запуск / Остановить — управление EasyTier-процессами
  • Пиры — просмотр подключенных пиров
  • Автозапуск вкл / выкл — автозапуск сетей (systemd / планировщик Windows)
  • Сохранить — сохранение конфига в config.yml

Конфиг (config.yml)

Создаётся автоматически при первом запуске, если его нет:

# пример конфига
# listen_port — порт bootstrap-пира (по умолчанию 11010)
listen_port: 11010
bootstrap:
  - udp://45.112.194.131:11010
  - udp://92.63.103.86:11010
  - udp://104.239.87.24:11010
networks:
  - name: party
    secret: ''
    ip: null

Параметры:

Поле Назначение
listen_port Локальный listener-порт EasyTier (по умолчанию 11010; для каждой следующей сети +1)
bootstrap Список bootstrap-пиров вида udp://IP:PORT
networks[].name Имя сети
networks[].secret Пароль сети
networks[].ip IP внутри сети; пусто/null — DHCP
networks[].hostname Имя узла в сети; пусто — системный hostname

CLI

pnet                 # веб-интерфейс (по умолчанию)
pnet run             # запустить все сети (скачивает EasyTier при первом запуске)
pnet stop            # остановить все сети
pnet peers           # показать подключенных пиров
pnet autostart       # включить автозапуск
pnet no-autostart    # выключить автозапуск

Как это использовать?

Для запуска и работы с pnet вам потребуется читать инструкцию и смотреть глазами в монитор.

Быстрый старт

  1. Скачать архив с исполняемыми файлами из официального GitHub репозитория
  2. Распаковать архив в отдельную папку и запустить pnet (или pnet.exe на Windows).
  3. Откроется браузер с веб-интерфейсом (127.0.0.1:<случайный порт>).
  4. Проверить сервера (bootstrap) и сети, при необходимости отредактировать.
  • Чтобы добавить сеть, нужно указать ее имя и пароль и нажать кнопку “Добавить”. При желании можно указать конкретный IP-адрес из диапазона локальных IP-адресов и имя хоста (hostname).
  1. Нажать Запуск — EasyTier скачается при первом запуске, сеть поднимется.

Чтобы оказаться в одной сети с двух устройств, нужно, чтобы на обоих устройствах была добавлена одна и та же сеть: имя и пароль сети должны совпадать!

По умолчанию в pnet уже добавлена общедоступная сеть party. Она без пароля, а значит использовать ее может каждый, но для своих локальных шалостей рекомендую все же создавать свои собственные сети. НО! Если так хотите, можете размещать в сети party свои сайты и прочие сетевые ресурсы.

Дополнительный функционал pnet

В pnet вы можете настроить автозапуск сетей при включении компьютера. Также есть возможность использовать pnet из терминала - CLI команды были описаны выше (pnet help)!


Вопрос этот должен быть разрешен во что бы то ни стало. А зимой мне, кстати, делать будет нечего. - Марк Твен.