Files
netrunner-proxy/client/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-06-30 18:51:09 +07:00
2026-06-30 18:51:09 +07:00
2026-06-30 18:51:09 +07:00
2026-06-30 18:51:09 +07:00
2026-06-30 18:51:09 +07:00
2026-06-30 18:51:09 +07:00
2026-06-30 18:51:09 +07:00

Блок client/net — userspace TCP/IP-стек и мост в туннель

«Локальная» половина клиента: то, что превращает перехваченные IP-пакеты приложений в логические соединения и кормит ими ядро (netrunner_core). Построено поверх форка smoltcp (userspace-стек) + tokio.

Детали — в rustdoc крейта netrunner-client, модуль net.

Файлы

Файл Роль
engine.rs Главный poll-цикл стека + сборка (EngineBuilder).
connection_manager.rs Перехват L3-пакетов, реестр сокетов, диспетчеризация.
connection.rs Виртуальные TCP/UDP-соединения + ICMP-ответчик.
session_tracker.rs NAT-таблица сокетов, idle/LRU-уборка.
socket_factory.rs Создание smoltcp-сокетов под профиль трафика.
dns.rs Локальный DNS: фейковые IP (CGNAT) + блок-лист.

Поток данных

TUN ─пакеты→ engine ─push_rx→ smoltcp ─→ connection_manager
     ─перехват SYN/датаграмм→ TcpConnection/UdpConnection ─RawCastFrame→ туннель
туннель ─RawCastFrame→ engine ─route_download→ smoltcp ─→ TUN ─→ приложение

Ключевые механики

  • Перехват (connection_manager): на TCP-SYN и первую UDP-датаграмму заводится smoltcp-сокет и виртуальное соединение; служебный трафик (DNS:53, NetBIOS) пропускается.
  • Фейковый DNS (dns): каждому имени выдаётся стабильный IP из 100.64.0.0/10, по нему потом восстанавливается хост при установке туннельного соединения.
  • Профили трафика (socket_factory): bulk/interactive/dns → разные размеры буферов; TCP с BBR, без Nagle.
  • Анти-bufferbloat / анти-HOL: download раздаётся пер-сокетно (pending_download в engine), upload — с tx_congested-паузой (connection); один застрявший сокет не морозит остальных.
  • Уборка (session_tracker): idle-выметание + LRU-эвикт при лимите сокетов, с защитой системных/слушающих.

Связи

Кормит ядро через канал RawCastFrame (rawcast); сам туннель поднимает ClientHandler::connect из ядра. Ввод/вывод и маршруты — в соседнем блоке tun.