// документ: WP-0.6.0

Технический документ

Протокол безопасной передачи данных с шифрованием Double Ratchet, согласованием ключей X3DH и нулевой поверхностью управления.

ВЕРСИЯ 0.6.0 ДАТА Сентябрь 2026 СТАТУС Техническая спецификация
01

Транспорт, который прячется на виду.

rVPN работает поверх WebSocket/TLS на порту 443 — том же порту и протоколе, что и обычный HTTPS. Для наблюдателей в сети туннель выглядит как обычный просмотр веб-страниц.

Он заменяет статический обмен ключами на алгоритм Double Ratchet, обеспечивая прямую секретность и безопасность после компрометации. Весь трафик мультиплексируется через небольшой набор WebSocket-соединений на порту 443.

Десктопные, CLI- и Android-клиенты используют BoringSSL, чтобы имитировать отпечаток ClientHello TLS 1.3 от Chrome, что помогает обходить глубокую проверку пакетов. Клиенты iOS используют rustls на чистом Rust: песочница Network Extension от Apple ограничивает модель памяти BoringSSL, поэтому iOS жертвует имитацией отпечатка ради стабильности. Сервер также использует rustls для входящих WebSocket-соединений и сам получает и продлевает сертификат Let’s Encrypt через ACME TLS-ALPN-01 на том же слушателе :443 — без внешних инструментов и таймеров продления.

tls_mimicry.rs
// TLS 1.3 Chrome fingerprint
fn build_chrome_connector() {
    let mut builder = SslConnector::builder();
    builder.set_min_proto_version(TLS1_3);
    builder.set_cipher_list(
        "TLS_AES_128_GCM_SHA256:
         TLS_AES_256_GCM_SHA384:
         TLS_CHACHA20_POLY1305"
    );
    builder.set_alpn_protos(b"\x08http/1.1");
    builder.build()
}
02

Маленькая, стабильная форма соединения.

Начиная с v1.3.5, CLI- и десктопные клиенты мультиплексируют все прокси-потоки через пул долгоживущих WebSocket/TLS-соединений вместо открытия нового соединения на каждый поток. Мобильный режим прямого TUN всегда мультиплексировал всё через одно соединение; пул приносит то же свойство в режим SOCKS5/HTTP, не жертвуя параллелизмом.

2.1. Зачем нужен пул соединений

Соединение на каждый поток оплачивает полное рукопожатие TCP, TLS 1.3, WebSocket и X3DH для каждого потока. Под нагрузкой клиент держит сотни параллельных TLS-сессий к одному серверу: они долго устанавливаются, а форма соединения выделяется при анализе трафика. Пул (по умолчанию 4 соединения на выходной сервер, настраивается) сохраняет форму маленькой и постоянной независимо от числа активных потоков.

2.2. Кредитное управление потоком

У каждого потока есть окно байтовых кредитов на каждое направление (изначально 256 КиБ). Отправитель тратит один кредит на каждый байт полезной нагрузки и прекращает чтение при нуле, поэтому обычное противодавление TCP притормаживает производителя; получатель выдаёт дельта-кредиты по мере обработки. Поток, простоявший с нулевыми кредитами 60 секунд, закрывается: это защитный клапан, а не обычный путь. Управляющие кадры идут по отдельному приоритетному каналу, поэтому массовые данные никогда не задерживают сообщения жизненного цикла потоков.

2.3. Порядок в канале — это криптографический порядок

Double Ratchet нумерует сообщения в момент шифрования и отбрасывает кадры, пришедшие не по порядку, поэтому общее соединение не должно переупорядочивать кадры между параллельными потоками. Блокировка отправки на каждое соединение сериализует весь интервал «шифрование→постановка в очередь», сохраняя порядок в канале идентичным порядку ratchet даже при конкуренции. Сама блокировка ratchet освобождается до любого ожидания отправки, поэтому соединение под противодавлением никогда не останавливает дешифрование.

2.4. Возобновление и предварительный прогрев

Каждое соединение кэширует сессионные билеты TLS 1.3, поэтому переподключение завершается за один круговой обход без передачи сертификата, а пул в фоне заранее прогревает запасные соединения при разрыве. Каждое новое соединение по-прежнему выполняет свежее рукопожатие X3DH с закреплённым идентификатором сервера (§4.4); возобновление никогда не ослабляет аутентификацию.

03

От чего защищает rVPN.

Каждая строка связывает угрозу с механизмом, который её нейтрализует.

Уровень угрозы Возможности противника Мера защиты rVPN
Пассивный наблюдатель Анализ трафика, тайминги потоков Дополнение кадров 0–64 байтами, инъекция с постоянной скоростью
Сетевой анализ Фингерпринтинг протоколов WebSocket поверх TLS 1.3, имитация ClientHello от Chrome (BoringSSL на десктопе/CLI/Android; rustls на iOS)
Сетевые ограничения Запросы на проверку соединения Маскировка под сайт-прикрытие: HTTP 200 OK на неаутентифицированные проверки
Скомпрометированные ключи Будущая компрометация ключей Безопасность после компрометации через Double Ratchet
Квантовый противник Атаки «сохрани сейчас — расшифруй потом» Планируемый гибридный PQC-режим: ML-KEM + X25519 (текущий релиз использует X25519/Ed25519)
04

Динамическое, самовосстанавливающееся криптографическое состояние.

rVPN не использует статические рукопожатия, как OpenVPN или WireGuard. Его криптографическое состояние эволюционирует на протяжении всей сессии.

4.1. Согласование ключей X3DH

Начальные рукопожатия используют расширенный тройной Диффи-Хеллман. Клиент получает подписанный предварительный ключ сервера, вычисляет четыре общих секрета DH и выводит корневой ключ через HKDF-SHA256.

4.2. Double Ratchet

После рукопожатия соединением управляет алгоритм Double Ratchet. Симметричный ratchet эволюционирует цепочечные ключи для каждого сообщения ради прямой секретности, а DH-ratchet ротирует асимметричные ключи ради безопасности после компрометации.

4.3. Обработка неупорядоченных сообщений

Потоки TCP могут доставлять сообщения не по порядку. Состояние Double Ratchet хранит пропущенные ключи сообщений, так что запоздавшие или переупорядоченные кадры можно расшифровать без продвижения цепочки — соединение остаётся целым без отдельного буфера переупорядочивания.

4.4. Проверка идентификатора сервера (TOFU)

Само по себе согласование ключей ничего не доказывает о том, кто ими владеет. При первом подключении клиент закрепляет отпечаток идентификатора Ed25519 сервера (каноническая форма ik:1:<base32>) — доверие при первом использовании в стиле SSH. Каждое последующее рукопожатие должно совпадать с закреплённым отпечатком, причём проверка независима от цепочки сертификатов TLS: скомпрометированный CA или принудительный перевыпуск сертификата не смогут выдать себя за закреплённый сервер. Несовпадение отклоняет соединение; ротация ключа идентификатора сервера требует явного перезакрепления — в точности как смена host-ключа SSH. Мультисерверные профили закрепляют каждый выходной сервер отдельно.

05

Встроенный продвинутый движок маршрутизации.

Клиент включает движок маршрутизации, который решает, какой трафик попадает в туннель, какой остаётся локальным, а какой блокируется.

Совпадение по самому длинному префиксу

Поиск по IP CIDR

Таблицы IP-сетей разрешают маршруты CIDR за логарифмическое время для обхода туннеля и сетей принудительного туннелирования.

Совпадение по суффиксу домена

Доменные правила

Иерархическое сопоставление для списков доменов туннеля, обхода и принудительного туннелирования.

Блоклисты на хеш-множествах

Списки рекламы и трекеров

Быстрый точный поиск и поиск по родительскому домену по встроенным и пользовательским спискам рекламы и трекеров.

Пул FakeIP

Отложенный DNS

Нулевые утечки DNS при почти нулевой задержке первого соединения.

Мультисерверная маршрутизация

Профиль может включать дополнительные выходные серверы, каждый со своими доменами маршрутизации (совпадение по суффиксу: google.com покрывает *.google.com) и IP/CIDR маршрутизации. Подходящий трафик выходит через этот сервер и никогда молча не откатывается на сервер по умолчанию. На мобильных устройствах резолвер работает внутри самого расширения туннеля: каждый выходной сервер разрешает имена через собственный канал DNS-over-HTTPS, а каждый ответ записывается в общую карту маршрутов с TTL этого ответа, так что последующие соединения к этим IP автоматически идут через тот же выход. Выходные серверы подключаются лениво при первом использовании и переподключаются независимо, каждый со своим закреплённым идентификатором TOFU.

06

Быстрая загрузка правил при запуске.

Клиент загружает в память при запуске встроенные списки маршрутизации и блокировки, а также необязательные пользовательские списки. Благодаря этому поиск для каждого соединения остаётся быстрым.

Встроенные списки скомпилированы Поставляются с двоичным файлом; внешний разбор не требуется
Пользовательские списки загрузка при старте Файлы доменов или CIDR, предоставленные пользователем, читаются при запуске
Множества времени выполнения поиск за O(1) Множества на хешах и таблицы IP-сетей, используемые для решений о маршрутизации

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

Домены сопоставляются в коллекциях HashSet с проверкой родительских доменов. Диапазоны IP хранятся в таблице совпадения по самому длинному префиксу. Всё загружается в память при запуске; сериализация без копирования и дельта-обновления запланированы для очень больших корпоративных наборов правил.

07

Нет интерфейса управления — нечего взламывать.

Открытие HTTP/REST API управления, RPC-интерфейсов или административных сокетов создаёт поверхность атаки для кражи учётных данных, повышения привилегий и эксплойтов нулевого дня.

У rVPN нет интерфейса управления. Все параметры, правила маршрутизации и соответствия ключей задаются в статических TOML-файлах, читаемых при запуске. Ни административных API, ни панелей, ни управляющих сокетов не существует, поэтому противник не может изменить состояние во время выполнения.

Нет API управления

Ни HTTP-эндпоинтов, ни RPC-интерфейсов, ни административных сокетов. Во время выполнения взламывать нечего.

Статическая конфигурация (TOML)

Все параметры определены при запуске. Неизменяемы во время выполнения, без какой-либо поверхности динамической переконфигурации.