Добавить опциональную авторизацию клиента и динамические лимиты трафика

Сервер получает флаги --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>
This commit is contained in:
2026-07-07 00:31:03 +07:00
parent 99a9eee908
commit 40ddb0a0f6
14 changed files with 440 additions and 25 deletions
+29 -1
View File
@@ -10,12 +10,16 @@
// Workaround for rustc 1.94 ICE in check_mod_deathness (dead-code MIR pass).
#![allow(dead_code)]
mod backend_client;
mod diagnostics;
mod network;
use clap::Parser;
use netrunner_core::net::AuthValidator;
use netrunner_logger::Logger;
use std::sync::Arc;
use tokio_util::sync::CancellationToken;
use crate::backend_client::BackendClient;
use crate::network::Network;
/// Аргументы командной строки сервера.
@@ -36,13 +40,37 @@ struct Args {
/// атрибут ноды, можно задавать разный на каждом развёртывании.
#[arg(long, default_value = netrunner_core::net::DEFAULT_DECOY_HOST)]
decoy_host: String,
/// Требовать валидный Bearer-токен (выданный `netrunner-backend`) от
/// каждого клиента и отчитываться о расходе трафика для динамических
/// лимитов. Выключено по умолчанию — включается по инстансу, не меняя
/// поведение уже развёрнутых нод без этого флага.
#[arg(long, default_value_t = false)]
require_auth: bool,
/// URL control-plane бэкенда для проверки токенов/отчётов о трафике.
/// Обязателен, только если передан `--require-auth`.
#[arg(long)]
backend_url: Option<String>,
}
fn main() {
Logger::init("./logs".into(), true);
Logger::global().set_level("info");
let args = Args::parse();
let net = Network::new(args.host, args.port, args.decoy_host);
let auth: Option<Arc<dyn AuthValidator>> = if args.require_auth {
let backend_url = args
.backend_url
.expect("--require-auth требует --backend-url");
let internal_secret = std::env::var("PROXY_INTERNAL_SECRET")
.expect("--require-auth требует переменную окружения PROXY_INTERNAL_SECRET");
Some(Arc::new(BackendClient::new(backend_url, internal_secret)))
} else {
None
};
let net = Network::new(args.host, args.port, args.decoy_host, auth);
let rt = tokio::runtime::Runtime::new().expect("Failed to create Tokio runtime");