Commit Graph

163 Commits

Author SHA1 Message Date
nineap 521d77f0cc Переезд с ghcr.io на встроенный Container Registry Gitea
Build & Push Proxy Image / build (push) Failing after 7m45s
Каждая нода теперь логинится и тянет образ с gitea.netrunner-vpn.com
напрямую (secrets.GITEA_REGISTRY_TOKEN, тот же, что и в build.yml).
2026-07-10 20:44:14 +07:00
nineap 87f9f865ae Fix: smoltcp-зависимость через https, не ssh — CI не может её склонировать
CI-раннер не имеет SSH-ключа для github.com (и не должен — там нет ничего
кроме публичного форка smoltcp). Репозиторий nxrp-smoltcp публичный,
https-клон анонимный и не требует вообще никаких секретов, в отличие от
ssh://, который требует ключ даже для публичных репо.
2026-07-10 20:13:16 +07:00
nineap bf5b914ddc nodes list
Build & Push Proxy Image / build (push) Failing after 5m0s
2026-07-10 20:00:23 +07:00
nineap 84d53c801b nodes list 2026-07-10 20:00:16 +07:00
nineap cfcb1afcec Метрики /metrics для центрального Prometheus + генерация scrape-таргетов
--metrics-port (0.0.0.0, в отличие от --health-port — тот 127.0.0.1-only)
отдаёт netrunner_connections_active/total, netrunner_auth_validate_duration_seconds,
netrunner_auth_failures_total, netrunner_circuit_breaker_open. Тот же
hand-rolled HTTP-паттерн, что и health.rs — без HTTP-фреймворка ради
одного эндпоинта.

scripts/generate-prometheus-targets.mjs генерит список scrape-таргетов
из nodes.json — job update-observability-targets в deploy.yml гоняет
его при каждом деплое нод и заливает на VPS с данными
(netrunner-data/observability/targets/nodes.json), чтобы центральный
Prometheus не терял из виду ноды без ручной правки конфига.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 23:21:26 +07:00
nineap fafd573a28 CI: BACKEND_URL переносит из secrets в vars
Публичный URL control plane сам по себе не секрет.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 16:37:25 +07:00
nineap c4be0174bf Circuit breaker + таймаут для BackendClient
5 подряд неудач (5xx/сетевой сбой, не 4xx-отказ авторизации) открывают
цепь на 10 секунд — fail-fast без похода в HTTP, пока control plane
недоступен. Таймаут запроса — 5 секунд (раньше не было вообще).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 16:37:25 +07:00
nineap 10d357b8ec Graceful shutdown (SIGTERM) + HTTP /health endpoint
Раньше shutdown_signal вообще не существовал — весь механизм graceful
shutdown в network.rs был мёртвым кодом, ничего его не вызывало. main.rs
теперь spawn'ит net.run() и последовательно ждёт сигнал, затем drain
(НЕ tokio::select! — select! убил бы run()-future на середине drain'а в
момент, когда shutdown-future резолвится). /health на 127.0.0.1 отдаёт
активные соединения — для systemd/LB health-check.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 16:37:25 +07:00
nineap d8363667e0 Добавляет .env.example для Makefile-конфига (был только .env, без шаблона)
Локальный dev/деплой-конфиг (rsync/ssh на прод/dev-ноду, ADB, --require-auth
debug-server) существовал только как реальный .env — новому контрибьютору
неоткуда было узнать, какие переменные вообще нужны и в каком формате.
2026-07-09 15:33:41 +07:00
nineap c835ac983a Gitea Actions: сборка образа + деплой на список прокси-нод
- .gitea/workflows/build.yml — cargo build --release + docker build/push в
  ghcr.io/nineap/netrunner-proxy:latest (Dockerfile сам не компилирует Rust,
  ждёт уже готовый target/release/netrunner-server).
- .gitea/workflows/deploy.yml — только вручную (workflow_dispatch), параметр
  target: имя ноды из nodes.json или "all". Job "resolve" фильтрует список,
  job "deploy" — matrix по результату, каждая нода видна в прогоне отдельной
  строкой. Деплой пересоздаёт контейнер (pull+rm+run), не просто restart —
  иначе новый образ не подхватится.
- nodes.json — список нод (name/host/proxy_port/decoy_host), шаблон с
  CHANGE_ME — заполнить реальными IP.

Нужные секреты: GHCR_TOKEN (тот же, что и в остальных репо), PROXY_NODES_SSH_KEY
(общий master-ключ на все ноды), PROXY_INTERNAL_SECRET, BACKEND_URL (те же
значения, что уже настроены у бэкенда).
2026-07-09 15:27:18 +07:00
nineap e44bc4f660 Исправить деплой dev systemd-юнита прокси: rsync грузил файл под неверным именем
server/netrunner-server.dev.service копировался на удалённую машину без
переименования — оседал как netrunner-server.dev.service рядом со старым
netrunner-server.service, а systemctl start netrunner-server продолжал
использовать именно старый (неизменный) юнит. Из-за этого только что
задеплоенные --port=8443 не подхватывались вообще, пока не переименовал файл
руками на сервере.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 18:52:10 +07:00
nineap 72246f986a Переключить дев-инстанс прокси на порт 8443
Локальный debug-server и задеплоенный на DEV_IP systemd-сервис раньше
использовали 4443/443 соответственно — развели их на общий 8443, чтобы не
пересекаться с портами, занятыми другими дев-сервисами (например, Caddy на 443).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 18:17:20 +07:00
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
nineap 99a9eee908 Улучшить TLS-маскировку, ввести версионирование протокола, добавить тесты и нагрузочный инструмент
Маскировка:
- ChangeCipherSpec middlebox-compat запись после ClientHello/ServerHello —
  без неё последовательность типов TLS-записей отличала нас от настоящего
  браузера даже при идеальном JA3/JA4-отпечатке.
- SNI-aware stealth fallback: невалидный клиент проксируется на запрошенный
  им хост, а не всегда на один и тот же decoy — иначе активное зондирование
  с разными SNI на одном IP получало одинаковый ответ. Резолв только в
  публичные IP (защита от SSRF на внутреннюю сеть ноды через подставной SNI).
- Профиль браузера привязан к session_id, а не к номеру попытки реконнекта:
  раньше при нескольких быстрых ретраях с одного IP летели ClientHello
  Chrome→Edge→Firefox подряд — сама по себе аномалия для DPI.
- Бакетный паддинг Data/UdpData кадров вместо полного отсутствия паддинга;
  джиттер перед ServerHello вместо мгновенного детерминированного ответа.

Версионирование:
- PROTOCOL_VERSION в session_id ClientHello — сервер узнаёт версию клиента
  до отправки чего-либо и может включать версионно-зависимое поведение
  (сейчас — CCS) только для тех, кто его понимает. Позволяет катить будущие
  несовместимые изменения протокола без синхронного flag-day релиза.

Тесты (core, было 0):
- Round-trip тесты TLS-записей/hello-сообщений/кадров/кодека.
- Полный цикл хендшейка с реальным выводом ключей на обеих сторонах.
- Вся SSRF-защита (hostname/IP валидация, v4/v6).
- Интеграционные тесты по настоящему TCP: легитимный хендшейк и
  stealth-fallback на мусорный ClientHello.

tools/loadtest — нагрузочный тест поверх настоящего скомпилированного
netrunner-server (реальный процесс, метрики RSS/CPU из /proc) и настоящего
публичного клиентского API. Попутно найден и обойдён гоночный баг:
Connect-кадр в ClientHandler::connect() уходит через try_send ещё до того,
как поднимется хоть одна нога тунеля, и молча теряется при синтетической
нагрузке.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 18:05:10 +07:00
nineap 8d9dfeee41 decoy host into lib 2026-07-02 18:43:26 +07:00
nineap 820d23abd9 update of extensions and connections 2026-07-02 16:50:23 +07:00
nineap 8c9a9c7cc7 dev countour and off logs 2026-07-02 15:15:10 +07:00
Kirill 3b2296a6d9 fix: stabilize tunnel downloads (deadlock, stuck-consumer eviction, real diagnostics)
Downloads were dying and stalling under real network conditions. Root causes
fixed in the muxer's stream-delivery path:

- dispatch_to_local held a DashMap Ref across a nested remove_stream call,
  self-deadlocking the leg's reader task whenever a stream's backlog needed
  eviction — permanently losing a tokio worker thread per occurrence.
- Eviction now runs off the hot path entirely, in a periodic background
  reaper, and only fires when a stream is both over its byte budget AND has
  made no delivery progress for an RTT-adaptive grace window (was a flat
  300ms then 5s, which killed merely-slow-but-alive consumers).
- The server never told the client when a bridge ended normally (only on
  failed connect), leaving the client's virtual TCP socket stuck in
  CloseWait for a full idle timeout and slowing the whole engine loop.
- The client's upload path silently dropped in-flight chunks when all tunnel
  legs were briefly down instead of pausing and retrying like the server
  bridge already did.
- Tried end-to-end credit-based flow control for the download producer;
  reverted the enforcement (kept the dormant frame/API) after it proved
  worse than the pre-existing local channel backpressure — RTT-coupled
  pauses produced burst-then-stall downloads and jitter/ping spikes on the
  shared physical leg.
- Server-side diagnostics snapshot was a stub (always-empty tunnel state,
  misleading placeholder trigger); now aggregates real per-session Muxer
  metrics from the SessionManager.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-02 15:06:00 +07:00
nineap 582ad714ae client log sends to proxy 2026-06-30 19:49:50 +07:00
nineap f7a76353ea docs [AI] 2026-06-30 18:51:09 +07:00
Kirill 18cad76e38 refactor: improve networking layer with enhanced engine, muxer, and diagnostics
- Refactored connection engine with better state management
- Improved muxer with enhanced protocol handling
- Updated connection bridge and diagnostics
- Added new network constants and configuration options
- Enhanced session tracking and error handling
- Updated dependencies in Cargo.toml
2026-06-30 12:34:04 +07:00
nineap 38dfd588c1 warnings fix 2026-06-29 18:07:53 +07:00
nineap 6735c481dc select of download/upload seperated, write timeout, muxer leg kills timeout, pong await fix 2026-06-26 05:48:12 +07:00
nineap 47208853c9 diagnostics, recconections fix and bufferbloat fixes 2026-06-25 17:14:26 +07:00
nineap b6056b2a66 device to smoltcp [AI] 2026-06-25 14:00:00 +07:00
nineap 30a843d8a6 fixes warnings and bufferbloat problems 2026-06-25 13:36:40 +07:00
nineap cab3c10c85 warning fix 2026-06-18 13:44:38 +07:00
nineap 4edf472d1f killswitch in session fix and no console on windows 2026-06-11 19:40:49 +07:00
nineap b83d3b5bf1 killswitch in session 2026-06-11 19:35:35 +07:00
nineap 05696a836a allocation optimization and in place crypt 2026-06-05 00:22:38 +07:00
nineap 6cd4d001ad refactor: update tunnel MTU, optimize Frame parsing, and improve connection stability 2026-06-02 16:26:02 +07:00
nineap 3d26c73ee7 dockerfile for server proxy 2026-05-15 17:45:19 +07:00
nineap ae557b4848 muxer cleaning update, head on line blocking fix 2026-05-03 13:41:46 +07:00
nineap 7fb40f6be1 smoltcp updates breaking changes fix 2026-05-02 21:02:30 +07:00
nineap 738fa8ca9b loggin update 2026-05-02 18:55:37 +07:00
nineap ebb123f4ea connection logic reset 2026-04-30 17:32:24 +07:00
nineap a58e077bea udl update 2026-04-30 14:37:41 +07:00
nineap 9e29104828 AI FULL KILLSWITCH AND EXCEPTIONS 2026-04-30 14:28:15 +07:00
nineap f0b6bf423e legs logs on server 2026-04-16 13:21:37 +07:00
nineap 2d70f33257 bufferbloat fixes, deadlocks and buf sizes change 2026-04-16 13:14:16 +07:00
nineap f5f1d20f54 bufferbloat fixes and reconnect 2026-04-15 13:33:38 +07:00
nineap fac16c5296 backpressures fixes and recieve/send sync 2026-04-14 16:59:36 +07:00
nineap a6ca710954 backpressure, bufferbloat fix and legs reconnects 2026-04-14 16:35:59 +07:00
nineap 6d3bc81a6e real rtt and new fixed smoltcp 2026-04-14 16:05:02 +07:00
nineap 11b810ad65 all unbounded and remove AI hallucinations 2026-04-12 15:14:42 +07:00
nineap 9233641e67 smoltcp update 2026-04-11 23:00:50 +07:00
nineap 732f55c01d updates muxer legs select, buf sizes and constantsa 2026-04-11 22:48:33 +07:00
nineap 6009eca8a7 return buffer list size 64 2026-04-10 21:20:37 +07:00
Трапезников Кирилл Иванович c0c5943da7 buf size changes, update leg select, update client socket, set lowat 2026-04-10 20:52:41 +10:00
Трапезников Кирилл Иванович eb23825bf5 fix donwload error 2026-04-10 15:33:10 +10:00