MultiOBX

Как устроено

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

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

Основа

Протокол WireGuard

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

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

Служба на Rust

Служба держит туннель и сетевые правила. Она разбирает пакеты из сети и работает с правами администратора, поэтому ошибка с памятью в ней может дать постороннему запустить свой код в системе. В Windows и Chrome на такие ошибки приходится около 70 % уязвимостей. Служба написана на Rust: в обычном коде на Rust компилятор их не пропускает.

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

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

Правила брандмауэра ставятся до того, как появится сетевой адаптер.

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

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

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

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

Слои правил

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

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