Files
netrunner-proxy/client/src/main.rs
T
2026-06-30 18:51:09 +07:00

87 lines
2.9 KiB
Rust

//! Бинарь клиента для Linux-десктопа (отладка/локальный запуск).
//!
//! Поднимает TUN-интерфейс `netr0` (10.0.0.1/24), инициализирует движок
//! ([`EngineBuilder`]) на захардкоженный адрес прокси и крутит его до Ctrl+C,
//! после чего восстанавливает системную маршрутизацию. Мобильная сборка идёт не
//! отсюда, а через FFI в [`lib.rs`](crate) (uniffi) — здесь же удобная точка
//! входа для запуска под Linux без Android.
// Workaround for rustc 1.94 ICE in check_mod_deathness (dead-code MIR pass).
#![allow(dead_code)]
use netrunner_logger::{error, info};
mod net;
mod tun;
use crate::tun::{routing::reset_platform_routing, tun::Tun};
use net::engine::{EngineBuilder, EngineConfig};
use netrunner_core::net::NetworkConfig;
use tokio_util::sync::CancellationToken;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
netrunner_logger::Logger::init(None, false);
netrunner_logger::Logger::global().set_level("error");
info!("Initializing NetRunner Stack...");
let remote_address = "147.45.43.70:443".to_string();
let cancel_token = CancellationToken::new();
let config = EngineConfig::new(&remote_address)
.with_cache_path(".")
.with_mtu(1380);
NetworkConfig::init_global(config.mtu);
let tun_device = Tun::create(|tun_cfg| {
tun_cfg
.tun_name("netr0")
.address((10, 0, 0, 1))
.netmask((255, 255, 255, 0))
.destination((10, 0, 0, 2))
.mtu(config.mtu as u16)
.up();
})
.expect("Failed to initialize TUN device");
info!("TUN interface is UP: 10.0.0.1/24 (MTU: {})", config.mtu);
let builder_result = EngineBuilder::new(config)
.with_tun(tun_device)
.build()
.await;
match builder_result {
Ok((mut engine, tun)) => {
info!("Engine starting process loop...");
tokio::select! {
_res = engine.run(tun) => {
info!("Engine loop finished");
},
_ = tokio::signal::ctrl_c() => {
info!("Ctrl+C received, shutting down...");
cancel_token.cancel();
}
}
}
Err(e) => {
error!("Failed to build VPN Engine: {}", e);
cancel_token.cancel();
}
}
info!("Restoring system routing...");
let addr: std::net::SocketAddr = remote_address.parse().expect("Invalid address format");
let p_ip = addr.ip().to_string();
if let Err(e) = reset_platform_routing(Some(&p_ip), false) {
error!("Failed to restore routing: {}", e);
} else {
info!("System routing restored successfully.");
}
Ok(())
}