Сервер получает флаги --require-auth/--backend-url (по умолчанию выключено, поведение уже развёрнутых нод не меняется). Auth-кадр хендшейка расширен с "session_id:leg_id" до "session_id:leg_id:token"; при включённом --require-auth сервер валидирует токен через новый AuthValidator (BackendClient к netrunner-backend, с кешем на 60с). Muxer теперь ведёт монотонный учёт трафика сессии (переживает реконнект ног — раньше total_bytes мог занижаться после переподключения) и раз в ~30с отчитывается бэкенду; при превышении лимита сессия разрывается. Токен клиента прокидывается через EngineConfig/TunnelConfig до Tauri-плагина (desktop.rs + Android Kotlin-плагин). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Блок net — сетевое ядро и оркестровка туннеля
Самый верхний блок крейта: здесь синхронный разбор протокола (nrxp) и
асинхронная сеть tokio соединяются в работающий мультиплексированный туннель.
Всё, что ниже — крипта, кадры, маскировка — лишь «кирпичи», а этот блок строит из
них дом: слушает соединения, держит ноги туннеля, балансирует потоки и проксирует
трафик к целям.
Детали — в rustdoc, модуль
net.
Файлы
| Файл/подмодуль | Что внутри |
|---|---|
config.rs |
NetworkConfig — MTU-зависимые размеры буферов и каналов. |
constants.rs |
Тайм-ауты, лимиты, порты, анти-bufferbloat тюнинг. |
diagnostics.rs |
События, метрики, снапшоты состояния туннеля. |
connection/ |
Ядро: соединения, мультиплексор, движок, мосты, хендлеры. |
Подмодуль connection/
| Файл | Роль |
|---|---|
muxer.rs |
Мультиплексор: реестр потоков/ног, балансировка, failover. |
engine.rs |
TunnelEngine: reader/writer-задачи одной ноги, heartbeat, реконнект. |
connection.rs |
Точки входа: ClientHandler, ServerHandler, SessionManager. |
handler.rs |
Диспетчеризация входящих кадров по типу/stream_id. |
bridge.rs |
Проксирование TCP/UDP между потоком туннеля и целью. |
Ключевая идея
Одно TCP-соединение (нога) = много логических потоков (stream_id). Ради
устойчивости ног несколько (MAX_TUNNEL_LEGS); поток «прилипает» к ноге, а при её
падении бесшовно переезжает на соседнюю.
Сквозной поток данных
Клиент: браузер → SOCKS/rawcast → ClientHandler → Muxer → TunnelEngine → шифр TCP
Сервер: шифр TCP → TunnelEngine → StreamHandler → bridge → TCP/UDP цель
... и обратно тем же путём
Что делает этот блок устойчивым (мотивация констант)
- Anti-domino failover (
muxer::send_to_network) — падение ноги не закрывает поток: дохлая нога эвиктится, кадр переотправляется на соседнюю. - Graceful pause (
bridge::run_tcp_bridgeна сервере, тот же паттерн вClientHandler::connectна клиенте) — если легли все ноги, TCP-чанк держится и ретраится (STREAM_PAUSE_BUDGET), а не рвёт/теряет данные аплоада. - Anti-bufferbloat — маленькая ёмкость каналов, адаптивные по RTT таймауты и
размер батча, неблокирующая раздача
dispatch_to_local. - Stealth-fallback (
ServerHandler) — «не наш» клиент прозрачно проксируется наdecoy_host:443, маскируясь под обычный TLS.decoy_host— атрибут ноды (--decoy-hostу сервера, [DEFAULT_DECOY_HOST] по умолчанию), не константа.
Почти каждая константа в constants.rs снабжена /// с объяснением почему
именно это число — читайте обоснование рядом, прежде чем менять.
Связи
Использует nrxp (кадры/кодек), tlseng (хендшейк),
crypto (косвенно через кодек) и rawcast (вход с
локальной стороны клиента).