blacklist for mobiles

This commit is contained in:
2026-03-18 19:59:27 +07:00
parent 530568d27a
commit c4c45564d3
12 changed files with 336 additions and 249 deletions
+67 -71
View File
@@ -1,5 +1,3 @@
use std::net::Ipv4Addr;
use netrunner_client::{
connections::dns::DnsHandler,
tun::{
@@ -11,94 +9,92 @@ use netrunner_client::{
use netrunner_core::proxy::{connection::connection::ConnectionRole, network::Network};
use netrunner_logger::{error, info};
use smoltcp::{iface::Config, phy::DeviceCapabilities};
use std::net::Ipv4Addr;
use tokio_util::sync::CancellationToken;
// Убираем макрос #[tokio::main]
fn main() -> anyhow::Result<()> {
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 1. Инициализация логгера (теперь он внутри асинхронного контекста)
netrunner_logger::Logger::init();
info!("Initializing NetRunner Stack...");
// 1. СИНХРОННАЯ ЧАСТЬ
// Здесь reqwest::blocking может спокойно создавать и удалять свои ресурсы
let mut dns_handler = DnsHandler::new();
if let Err(e) = dns_handler.init() {
// 2. Инициализация DNS асинхронно
// Передаем пустую строку или путь к кэшу (на десктопе можно ".")
let mut dns_handler = DnsHandler::new(".");
if let Err(e) = dns_handler.init().await {
error!("Failed to initialize DNS blocklist: {}", e);
}
// 2. АСИНХРОННАЯ ЧАСТЬ
// Создаем рантайм вручную
let rt = tokio::runtime::Runtime::new()?;
// 3. Настройка TUN устройства
let tun_device = Tun::create(|config| {
config
.tun_name("netr0")
.address((10, 0, 0, 1))
.netmask((255, 255, 255, 0))
.destination((10, 0, 0, 2))
.up();
})
.expect("Failed to initialize TUN device");
// Передаем управление в асинхронный блок
rt.block_on(async move {
let tun_device = Tun::create(|config| {
config
.tun_name("netr0")
.address((10, 0, 0, 1))
.netmask((255, 255, 255, 0))
.destination((10, 0, 0, 2))
.up();
})
.expect("Failed to initialize TUN device");
let remote_address: String = "62.60.244.156:443".into();
setup_platform_routing(&remote_address);
let remote_address: String = "62.60.244.156:443".into();
setup_platform_routing(&remote_address);
info!("TUN interface is UP: 10.0.0.1/24");
info!("TUN interface is UP: 10.0.0.1/24");
// 4. Конфигурация стека протоколов (MTU 1280 для стабильности)
let config = Config::new(smoltcp::wire::HardwareAddress::Ip);
let mut caps = DeviceCapabilities::default();
caps.max_transmission_unit = 1280;
caps.medium = smoltcp::phy::Medium::Ip;
let config = Config::new(smoltcp::wire::HardwareAddress::Ip);
let mut caps = DeviceCapabilities::default();
caps.max_transmission_unit = 1280;
caps.medium = smoltcp::phy::Medium::Ip;
let network = Network::new(
"0.0.0.0".into(),
8080,
ConnectionRole::Client,
Some(remote_address.clone()),
);
let network = Network::new(
"0.0.0.0".into(),
8080,
ConnectionRole::Client,
Some(remote_address.clone()),
);
let proxy_ip = network.get_self_local_address();
let proxy_ip = network.get_self_local_address();
// 5. Запуск сетевого прокси в отдельной задаче
let network_token = CancellationToken::new();
let net_token_for_spawn = network_token.clone();
tokio::spawn(async move {
info!("Network thread started");
network.run(net_token_for_spawn).await;
});
// Запускаем сетевой поток
let network_token = CancellationToken::new();
tokio::spawn(async move {
info!("Network thread started");
network.run(network_token).await;
});
// 6. Инициализация Engine
let mut engine = Engine::new(config, caps, proxy_ip, dns_handler);
engine.set_any_ip(true);
engine.set_transparent_mode();
engine.set_default_gateway(Ipv4Addr::new(10, 0, 0, 2));
engine.activate();
// Создаем Engine и передаем уже готовый dns_handler
let mut engine = Engine::new(config, caps, proxy_ip, dns_handler);
engine.set_any_ip(true);
engine.set_transparent_mode();
engine.set_default_gateway(Ipv4Addr::new(10, 0, 0, 2));
engine.activate();
info!("Stack IP initialized: 10.0.0.2");
info!("Engine starting process loop...");
info!("Stack IP initialized: 10.0.0.2");
info!("Engine starting process loop...");
let ctrl_c = tokio::signal::ctrl_c();
tokio::select! {
res = engine.run(tun_device) => {
error!("Engine loop error: {:?}", res);
},
_ = ctrl_c => {
info!("Ctrl+C received, shutting down...");
}
let ctrl_c = tokio::signal::ctrl_c();
tokio::select! {
res = engine.run(tun_device) => {
error!("Engine loop error: {:?}", res);
},
_ = ctrl_c => {
info!("Ctrl+C received, shutting down...");
}
}
// Очистка при выходе
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)) {
error!("Failed to reset routing: {}", e);
} else {
info!("System routing restored successfully.");
}
// 8. Очистка ресурсов
network_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();
Ok::<(), anyhow::Error>(())
})?;
if let Err(e) = reset_platform_routing(Some(&p_ip)) {
error!("Failed to restore routing: {}", e);
} else {
info!("System routing restored successfully.");
}
Ok(())
}