MultiOBX

Как устроено

Из чего собран MultiOBX

На чём это работает и почему сделано так. Только то, что есть в коде.

Основа

Протокол WireGuard

Туннель работает по WireGuard. Набор шифров у него фиксированный — ChaCha20-Poly1305 для трафика, Curve25519 для обмена ключами — и настроек, которыми можно случайно ослабить защиту, нет. Код протокола небольшой, его рукопожатие прошло формальную проверку.

Рукопожатие укладывается в один обмен пакетами. Поэтому соединение поднимается за доли секунды и переживает смену сети: переключились с Wi-Fi на мобильный интернет — туннель продолжил с того же места.

Служба на Rust

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

Окно приложения живёт отдельно и без прав администратора. Со службой оно разговаривает через именованный канал Windows, а не через порт на localhost, к которому могла бы обратиться открытая в браузере страница.

Заслон раньше туннеля

Правила файрвола ставятся до того, как появится сетевой адаптер.

Всё, что описано в этом разделе, работает при включённом брандмауэре. По умолчанию он выключен — намеренно: пока вы не знаете программу, её ошибка не должна оставить вас без сети. Включается в приложении: «Настройки» → «Защита».

Порядок подключения Пять шагов по порядку: правила, адаптер, рукопожатие, DNS, разрешение трафика через адаптер. Прямой выход в сеть закрыт с первого шага и остаётся закрытым. 01 02 03 04 05 ПРАВИЛА АДАПТЕР РУКОПОЖАТИЕ DNS ТРАФИК ПРЯМОЙ ВЫХОД В СЕТЬ ЗАКРЫТ, И ОСТАЁТСЯ ЗАКРЫТЫМ ТРАФИК ИДЁТ В ТУННЕЛЬ
Между первым и последним шагом наружу не уходит ни одного пакета. Порядок закреплён тестом: поменяете его — сборка не пройдёт.

С включённым брандмауэром обрыв связи, недоступный сервер и перезапуск туннеля сеть не открывают. Открывает только кнопка «Отключить». Без него при обрыве трафик пойдёт напрямую, и приложение говорит об этом красной меткой.

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

Слои правил

Слои, через которые проходит трафик Четыре плиты одна над другой, пронумерованы сверху вниз: программы, слой DNS, слой туннеля, правила Windows Filtering Platform. Трафик идёт сверху вниз; попытка выйти мимо упирается в нижнюю плиту. 4 3 2 1 ТРАФИК МИМО
1Программы
Браузер, почта, игры. Ни одна из них не знает, что стоит ниже, и настраивать в них ничего не нужно.
2Слой DNS
Запросы имён разбираются отдельно от всего остального. Наружу пропускаются только резолвер внутри туннеля и 127.0.0.1 — даже если вы разрешили локальную сеть. На это есть отдельный тест.
3Туннель
Всё, что не DNS, уходит внутрь WireGuard.
4Правила WFP
Стоят раньше, чем появится сетевой адаптер. Снимает их только кнопка «Отключить» — ни сбой, ни падение туннеля, ни перезапуск.
DNS-запросы уходят с машины отдельно от остального трафика — это самая частая утечка. Случай, который повторяется чаще прочих: человек разрешает «Локальную сеть», чтобы печатал принтер, домашний роутер тоже локальная сеть, и запросы уходят через него к провайдеру. Отдельный слой правил закрывает этот случай.

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

Все правила стоят в Windows Filtering Platform. Их видно любой программой, которая умеет читать WFP, и они не зависят от того, открыто окно приложения или нет.

Когда сеть режет трафик

В офисных, гостиничных и мобильных сетях UDP часто ограничивают или замедляют. Интернет работает, а туннель не поднимается. Способов соединения поэтому несколько, и приложение перебирает их по очереди.

UDP напрямую
Штатный режим WireGuard, самый быстрый. Работает дома и почти во всех мобильных сетях.
Поверх TCP, порт 443
Тот же туннель внутри TCP-соединения на 443-й порт. Этот порт открыт почти везде: на нём работают обычные сайты.
Через два сервера
Трафик входит на один сервер и выходит с другого. Первый видит ваш адрес, но не видит, куда вы идёте; второй наоборот. Режим доступен, когда серверов больше одного.
Через сеть анонимных узлов
Соединение проходит три узла, и ни один не знает одновременно отправителя и получателя. Медленнее остальных, зато наш сервер в этом маршруте не участвует. Отдельную программу ставить не нужно.

Какой способ прошёл, видно в разделе «Диагностика». Гарантировать соединение в любой сети мы не можем.

Откуда приложение берёт адреса серверов

Список серверов приложению нужно откуда-то получить. Если источник пропадает, подключиться не выйдет, даже когда сами серверы целы. Слабое место любого такого сервиса — здесь.

Поэтому список подписан (Ed25519), а открытый ключ для проверки подписи зашит в приложение при сборке. На сервере этого ключа нет. Подменённый список приложение отбросит. Сам список можно получить несколькими независимыми путями: с основного адреса, с запасных, через защищённые DNS-запросы к публичным резолверам. Достаточно одного рабочего.

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

Что лежит на сервере

Ключ
24 символа из алфавита в 31 знак — без 0, O, 1, I и L, чтобы не спутать, если переписываете от руки. Последний символ контрольный: опечатка отсекается ещё до отправки. На сервере лежит HMAC-SHA256 от ключа, сам ключ нигде не записан.
Устройства
Открытый ключ WireGuard, адрес внутри туннеля, имя из словаря. Настоящее имя компьютера не запрашивается.
Срок
Дата, до которой оплачено. Больше ничего.
Журналы
Серверы не ведут журнал соединений: кто, когда, куда. Хранить нечего.
Смена ключа
Раз в 30 дней ключ можно заменить из кабинета. Устройства, адреса и оплаченные дни остаются, старый ключ перестаёт работать сразу.

Как проверить

Список стоящих правил читается средствами самой Windows; состояние службы показывает «Диагностика» в приложении. Команды и что в них смотреть — на странице «Защита».

Если какой-то пункт выше проверить нечем — это наша недоработка. Напишите.

Проверка на две минуты

Подключитесь. Выдерните кабель или выключите Wi-Fi на пару секунд, потом верните. Интернет появится только вместе с туннелем — не раньше.

Что закрыто, а что нет