start remake local proxy
This commit is contained in:
+56
-14
@@ -2,25 +2,60 @@ 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::proxy::connection::connection::ConnectionRole;
|
||||
use netrunner_core::proxy::network::Network;
|
||||
use tokio_util::sync::CancellationToken;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> anyhow::Result<()> {
|
||||
netrunner_logger::Logger::init();
|
||||
info!("Initializing NetRunner Stack...");
|
||||
|
||||
let remote_address = "147.45.43.70:443";
|
||||
let remote_address = "147.45.43.70:443".to_string();
|
||||
let local_proxy_host = "127.0.0.1".to_string();
|
||||
let local_proxy_port = 8080; // Локальный порт прокси
|
||||
|
||||
// 1. Создаем конфигурацию движка
|
||||
// Здесь мы можем гибко настроить параметры, которые раньше были захардкожены
|
||||
let config = EngineConfig::new(remote_address)
|
||||
// Токен для управления жизненным циклом фоновых задач
|
||||
let cancel_token = CancellationToken::new();
|
||||
|
||||
// ==================================================
|
||||
// 1. ЗАПУСК ЛОКАЛЬНОГО ПРОКСИ (NETWORK)
|
||||
// ==================================================
|
||||
let proxy_token = cancel_token.clone();
|
||||
let remote_addr_clone = remote_address.clone();
|
||||
|
||||
tokio::spawn(async move {
|
||||
info!(
|
||||
"Starting Local Proxy (Network) on {}:{}",
|
||||
local_proxy_host, local_proxy_port
|
||||
);
|
||||
let network = Network::new(
|
||||
local_proxy_host,
|
||||
local_proxy_port,
|
||||
ConnectionRole::Client,
|
||||
Some(remote_addr_clone),
|
||||
);
|
||||
|
||||
// Эта функция заблокирует поток, пока не сработает proxy_token
|
||||
network.run(proxy_token).await;
|
||||
info!("Local Proxy (Network) task stopped.");
|
||||
});
|
||||
|
||||
// Даем локальному прокси немного времени на бинд порта и установку соединения
|
||||
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
|
||||
|
||||
// ==================================================
|
||||
// 2. ИНИЦИАЛИЗАЦИЯ ДВИЖКА И TUN
|
||||
// ==================================================
|
||||
let config = EngineConfig::new(&remote_address)
|
||||
.with_cache_path(".")
|
||||
.with_mtu(1350); // Указываем MTU здесь, чтобы использовать его и для TUN, и для стека
|
||||
.with_mtu(1350);
|
||||
|
||||
// 2. Создаем TUN интерфейс
|
||||
// Используем значение MTU из конфига, чтобы данные были синхронизированы
|
||||
let tun_device = Tun::create(|tun_cfg| {
|
||||
tun_cfg
|
||||
.tun_name("netr0")
|
||||
@@ -34,34 +69,38 @@ async fn main() -> anyhow::Result<()> {
|
||||
|
||||
info!("TUN interface is UP: 10.0.0.1/24 (MTU: {})", config.mtu);
|
||||
|
||||
// 3. Собираем движок, передавая объект конфигурации
|
||||
let builder_result = EngineBuilder::new(config)
|
||||
.with_tun(tun_device)
|
||||
.build()
|
||||
.await;
|
||||
|
||||
// 4. Обрабатываем результат и запускаем цикл
|
||||
// ==================================================
|
||||
// 3. ГЛАВНЫЙ ЦИКЛ ENGINE
|
||||
// ==================================================
|
||||
match builder_result {
|
||||
Ok((mut engine, tun)) => {
|
||||
info!("Engine starting process loop...");
|
||||
|
||||
let ctrl_c = tokio::signal::ctrl_c();
|
||||
|
||||
tokio::select! {
|
||||
_res = engine.run(tun) => {
|
||||
info!("Engine loop finished");
|
||||
},
|
||||
_ = ctrl_c => {
|
||||
_ = tokio::signal::ctrl_c() => {
|
||||
info!("Ctrl+C received, shutting down...");
|
||||
// Отменяем токен, чтобы Network.run завершился
|
||||
cancel_token.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Failed to build VPN Engine: {}", e);
|
||||
cancel_token.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
// 5. Очистка системных роутов
|
||||
// ==================================================
|
||||
// 4. ОЧИСТКА РОУТИНГА
|
||||
// ==================================================
|
||||
info!("Restoring system routing...");
|
||||
let addr: std::net::SocketAddr = remote_address.parse().expect("Invalid address format");
|
||||
let p_ip = addr.ip().to_string();
|
||||
@@ -72,5 +111,8 @@ async fn main() -> anyhow::Result<()> {
|
||||
info!("System routing restored successfully.");
|
||||
}
|
||||
|
||||
// Даем таске Network время на graceful shutdown (чтобы сокеты успели закрыться)
|
||||
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user