From 069cd27d5e22d96ee8c070505e4e3b7a8adc67d1 Mon Sep 17 00:00:00 2001 From: iHsin Date: Thu, 28 Mar 2024 17:58:33 +0800 Subject: [PATCH] refactor: deliver mark field --- clash_lib/src/config/internal/config.rs | 4 ++++ clash_lib/src/proxy/direct/mod.rs | 10 +++------- clash_lib/src/proxy/tuic/mod.rs | 1 - clash_lib/src/proxy/tun/inbound.rs | 24 ++++++++++++++++++++++-- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/clash_lib/src/config/internal/config.rs b/clash_lib/src/config/internal/config.rs index 5e159682d..770267ac0 100644 --- a/clash_lib/src/config/internal/config.rs +++ b/clash_lib/src/config/internal/config.rs @@ -254,6 +254,10 @@ pub struct TunConfig { /// default: 198.18.0.0/16 pub network: Option, pub gateway: Option, + /// auto manage route + pub auto_route: Option, + /// fwmark for preveting loop + pub mark: Option, } #[derive(Clone, Default)] diff --git a/clash_lib/src/proxy/direct/mod.rs b/clash_lib/src/proxy/direct/mod.rs index fdb028422..d33e20393 100644 --- a/clash_lib/src/proxy/direct/mod.rs +++ b/clash_lib/src/proxy/direct/mod.rs @@ -76,13 +76,9 @@ impl OutboundHandler for Handler { sess: &Session, resolver: ThreadSafeDNSResolver, ) -> std::io::Result { - let d = new_udp_socket( - None, - sess.iface.as_ref(), - sess.packet_mark, - ) - .await - .map(|x| OutboundDatagramImpl::new(x, resolver))?; + let d = new_udp_socket(None, sess.iface.as_ref(), sess.packet_mark) + .await + .map(|x| OutboundDatagramImpl::new(x, resolver))?; let d = ChainedDatagramWrapper::new(d); d.append_to_chain(self.name()).await; diff --git a/clash_lib/src/proxy/tuic/mod.rs b/clash_lib/src/proxy/tuic/mod.rs index 53159a5da..6151379ca 100644 --- a/clash_lib/src/proxy/tuic/mod.rs +++ b/clash_lib/src/proxy/tuic/mod.rs @@ -44,7 +44,6 @@ use rustls::client::ClientConfig as TlsConfig; use self::types::{CongestionControl, TuicConnection, UdpSession}; - use super::{ datagram::UdpPacket, AnyOutboundDatagram, AnyOutboundHandler, AnyStream, OutboundHandler, OutboundType, diff --git a/clash_lib/src/proxy/tun/inbound.rs b/clash_lib/src/proxy/tun/inbound.rs index 7e1a33393..0912053f1 100644 --- a/clash_lib/src/proxy/tun/inbound.rs +++ b/clash_lib/src/proxy/tun/inbound.rs @@ -20,12 +20,14 @@ async fn handle_inbound_stream( local_addr: SocketAddr, remote_addr: SocketAddr, dispatcher: Arc, + packet_mark: Option, ) { let sess = Session { network: Network::Tcp, typ: Type::Tun, source: local_addr, destination: remote_addr.into(), + packet_mark, ..Default::default() }; @@ -36,6 +38,7 @@ async fn handle_inbound_datagram( socket: Box, dispatcher: Arc, resolver: ThreadSafeDNSResolver, + packet_mark: Option, ) { let local_addr = socket.local_addr(); // tun i/o @@ -56,6 +59,7 @@ async fn handle_inbound_datagram( let sess = Session { network: Network::Udp, typ: Type::Tun, + packet_mark, ..Default::default() }; @@ -118,7 +122,7 @@ async fn handle_inbound_datagram( } pub fn get_runner( - cfg: TunConfig, + mut cfg: TunConfig, dispatcher: Arc, resolver: ThreadSafeDNSResolver, ) -> Result, Error> { @@ -126,6 +130,13 @@ pub fn get_runner( trace!("tun is disabled"); return Ok(None); } + if cfg.auto_route.unwrap_or(false) + && cfg.mark.is_none() + && cfg!(any(target_os = "android", target_os = "linux")) + { + cfg.mark = Some(6969); + tracing::info!("tun.mark not set, using default {}", cfg.mark.unwrap()); + } let device_id = cfg.device_id; @@ -215,6 +226,14 @@ pub fn get_runner( })); let dsp = dispatcher.clone(); + + let mark = if cfg.auto_route.unwrap_or(false) + && cfg!(any(target_os = "android", target_os = "linux")) + { + cfg.mark + } else { + None + }; futs.push(Box::pin(async move { while let Some((stream, local_addr, remote_addr)) = tcp_listener.next().await { tokio::spawn(handle_inbound_stream( @@ -222,6 +241,7 @@ pub fn get_runner( local_addr, remote_addr, dsp.clone(), + mark, )); } @@ -229,7 +249,7 @@ pub fn get_runner( })); futs.push(Box::pin(async move { - handle_inbound_datagram(udp_socket, dispatcher, resolver).await; + handle_inbound_datagram(udp_socket, dispatcher, resolver, mark).await; Err(Error::Operation("tun stopped unexpectedly 3".to_string())) }));