Как устроено
Из чего собран MultiOBX
На чём это работает и почему сделано так. Только то, что есть в коде.
Основа
Протокол WireGuard
Туннель работает по WireGuard. Набор шифров у него фиксированный — ChaCha20-Poly1305 для трафика, Curve25519 для обмена ключами — и настроек, которыми можно случайно ослабить защиту, нет. Код протокола небольшой, его рукопожатие прошло формальную проверку.
Рукопожатие укладывается в один обмен пакетами. Поэтому соединение поднимается за доли секунды и переживает смену сети: переключились с Wi-Fi на мобильный интернет — туннель продолжил с того же места.
Служба на Rust
Служба держит туннель и сетевые правила. Она разбирает пакеты из сети и работает с правами администратора, поэтому ошибка с памятью в ней может дать постороннему запустить свой код в системе. В Windows и Chrome на такие ошибки приходится около 70 % уязвимостей. Служба написана на Rust: в обычном коде на Rust компилятор их не пропускает.
Окно приложения — отдельная программа без прав администратора. Команды службе оно передаёт через именованный канал Windows. Страница, открытая в браузере, к такому каналу обратиться не может.
Заслон раньше туннеля
Правила брандмауэра ставятся до того, как появится сетевой адаптер.
Всё, что описано в этом разделе, работает при включённом брандмауэре. По умолчанию он выключен — намеренно: пока вы не знаете программу, её ошибка не должна оставить вас без сети. Включается в приложении: «Настройки» → «Защита».
С включённым брандмауэром обрыв связи, недоступный сервер и перезапуск туннеля сеть не открывают. Открывает её только кнопка «Отключить». С выключенным брандмауэром при обрыве трафик пойдёт напрямую, и приложение покажет это красной меткой.
Есть ещё режим «замок»: с ним интернет без туннеля не работает совсем, даже после ручного отключения. Пригодится на ноутбуке, который просыпается в кафе или в гостинице.
Слои правил
- 1Программы
- Браузер, почта, игры. Ни одна из них не знает, что стоит ниже, и настраивать в них ничего не нужно.
- 2Слой DNS
- Запросы имён разбираются отдельно от всего остального. Наружу пропускаются только резолвер внутри туннеля и 127.0.0.1 — даже если вы разрешили локальную сеть. На это есть отдельный тест.
- 3Туннель
- Всё, что не DNS, уходит внутрь WireGuard.
- 4Правила WFP
- Стоят раньше, чем появится сетевой адаптер. Снимает их только кнопка «Отключить» — ни сбой, ни падение туннеля, ни перезапуск.
Правило, которое разрешает соединение с нашим сервером, привязано к исполняемому файлу службы. Другая программа отправить пакет на адрес сервера мимо туннеля не сможет.
Все правила стоят в 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 на пару секунд, потом верните. Интернет вернётся только вместе с туннелем.