From 446b180e7288785cf444d6bcac8dcaaa11bad7bf Mon Sep 17 00:00:00 2001 From: zonyitoo Date: Sun, 12 Oct 2025 14:26:24 +0800 Subject: [PATCH] feat(shadowsocks-service): AutoProxyClientStream prevent mapping fake-ips twice (#2028) --- .../src/local/net/tcp/auto_proxy_stream.rs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/crates/shadowsocks-service/src/local/net/tcp/auto_proxy_stream.rs b/crates/shadowsocks-service/src/local/net/tcp/auto_proxy_stream.rs index c30ca644..892c4ce0 100644 --- a/crates/shadowsocks-service/src/local/net/tcp/auto_proxy_stream.rs +++ b/crates/shadowsocks-service/src/local/net/tcp/auto_proxy_stream.rs @@ -58,10 +58,10 @@ impl AutoProxyClientStream { } if context.check_target_bypassed(&addr).await { trace!("Bypassing target address {addr}"); - Self::connect_bypassed_with_opts(context, addr, opts).await + Self::connect_bypassed_with_opts_inner(context, addr, opts).await } else { trace!("Proxying target address {addr}"); - Self::connect_proxied_with_opts(context, server, addr, opts).await + Self::connect_proxied_with_opts_inner(context, server, addr, opts).await } } @@ -89,6 +89,18 @@ impl AutoProxyClientStream { if let Some(mapped_addr) = context.try_map_fake_address(&addr).await { addr = mapped_addr; } + Self::connect_bypassed_with_opts_inner(context, addr, connect_opts).await + } + + async fn connect_bypassed_with_opts_inner( + context: Arc, + addr: A, + connect_opts: &ConnectOpts, + ) -> io::Result + where + A: Into
, + { + let addr = addr.into(); let stream = TcpStream::connect_remote_with_opts(context.context_ref(), &addr, connect_opts).await?; Ok(Self::Bypassed(stream)) } @@ -117,6 +129,18 @@ impl AutoProxyClientStream { if let Some(mapped_addr) = context.try_map_fake_address(&addr).await { addr = mapped_addr; } + Self::connect_proxied_with_opts_inner(context, server, addr, connect_opts).await + } + + async fn connect_proxied_with_opts_inner( + context: Arc, + server: &ServerIdent, + addr: A, + connect_opts: &ConnectOpts, + ) -> io::Result + where + A: Into
, + { let flow_stat = context.flow_stat(); let stream = match ProxyClientStream::connect_with_opts_map( context.context(),