Files
netrunner-proxy/core/src/net
nineap 40ddb0a0f6 Добавить опциональную авторизацию клиента и динамические лимиты трафика
Сервер получает флаги --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>
2026-07-07 00:31:03 +07:00
..
2026-07-02 16:50:23 +07:00

Блок 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 (вход с локальной стороны клиента).