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