diff --git a/Cargo.lock b/Cargo.lock index 48334f9..e222f5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,23 +76,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "aws-lc-rs" version = "1.13.1" @@ -394,21 +377,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "fast-socks5" -version = "1.0.0-rc.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b243b80e73f3596fc64089c4c82ad7196d502c513127c5c8987337d51a5399d" -dependencies = [ - "anyhow", - "async-trait", - "log", - "socket2 0.5.10", - "thiserror 1.0.69", - "tokio", - "tokio-stream", -] - [[package]] name = "fastbloom" version = "0.9.0" @@ -427,12 +395,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - [[package]] name = "generic-array" version = "0.14.7" @@ -751,11 +713,11 @@ version = "0.1.0" dependencies = [ "bcrypt", "clap", - "fast-socks5", "quinn", "rcgen", "rustls", "tokio", + "udp-stream", ] [[package]] @@ -1257,17 +1219,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tracing" version = "0.1.41" @@ -1294,6 +1245,17 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "udp-stream" +version = "0.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf021324a3dc10f5b46ab1c1cf5635e6a81b5559971967b806674673a5f2a18e" +dependencies = [ + "bytes", + "log", + "tokio", +] + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/Cargo.toml b/Cargo.toml index 00fb104..9dab37f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,8 @@ edition = "2024" [dependencies] bcrypt = "0.17.0" clap = { version = "4.5.41", features = ["derive"] } -fast-socks5 = "1.0.0-rc.0" quinn = { version = "0.11.8", features = ["rustls"] } rcgen = "0.14.3" rustls = { version = "0.23.30", features = ["ring"] } tokio = { version = "1.47.0", features = ["rt", "macros", "rt-multi-thread", "net", "io-util"] } +udp-stream = "0.0.12" diff --git a/src/client.rs b/src/client.rs index 5e1485d..151e084 100644 --- a/src/client.rs +++ b/src/client.rs @@ -6,7 +6,8 @@ use rustls::{ client::danger::{HandshakeSignatureValid, ServerCertVerified, ServerCertVerifier}, pki_types::{CertificateDer, ServerName, UnixTime}, }; -use tokio::net::UdpSocket; +use tokio::{io::{AsyncReadExt, AsyncWriteExt}, net::{TcpListener, UdpSocket}}; +use udp_stream::UdpListener; #[derive(Debug)] pub struct NoCertVerify; @@ -60,7 +61,7 @@ impl ServerCertVerifier for NoCertVerify { } } -pub async fn open_connection( +async fn open_connection( host: SocketAddr, ) -> Result<(Endpoint, Connection), Box> { let mut client_crypto = rustls::ClientConfig::builder() @@ -82,7 +83,7 @@ pub async fn open_connection( Ok((endpoint, conn)) } -pub async fn close_connection( +async fn close_connection( endpoint: Endpoint, conn: Connection, ) -> Result<(), Box> { @@ -91,7 +92,7 @@ pub async fn close_connection( Ok(()) } -pub async fn open_request( +async fn open_request( conn: &mut Connection, remote: SocketAddr, password: &str, @@ -112,7 +113,7 @@ pub async fn open_request( Ok((send, recv)) } -pub async fn close_request( +async fn close_request( mut send: SendStream, mut recv: RecvStream ) -> Result<(), Box> { @@ -126,7 +127,13 @@ pub async fn run_udp_socks_server( proxy: SocketAddr, password: &str, ) -> Result<(), Box> { - todo!() + let listener = UdpListener::bind(local).await?; + + while let Ok((stream, addr)) = listener.accept().await { + tokio::spawn(handle_socks_stream(stream, addr, proxy, password.to_string())); + } + + Ok(()) } pub async fn run_tcp_socks_server( @@ -134,5 +141,24 @@ pub async fn run_tcp_socks_server( proxy: SocketAddr, password: &str, ) -> Result<(), Box> { - todo!() + let listener = TcpListener::bind(local).await?; + + while let Ok((stream, addr)) = listener.accept().await { + tokio::spawn(handle_socks_stream(stream, addr, proxy, password.to_string())); + } + + Ok(()) } + +async fn handle_socks_stream( + stream: S, + addr: SocketAddr, + proxy: SocketAddr, + password: String +) +where + S: AsyncReadExt + AsyncWriteExt +{ + +} + diff --git a/src/server.rs b/src/server.rs index dbe32e3..0a7418e 100644 --- a/src/server.rs +++ b/src/server.rs @@ -174,7 +174,7 @@ async fn handle_request( let stream = stream.clone(); async move { loop { - let mut buf = [0; 1024]; + let mut buf = [0; 8192]; let Ok(len) = stream.recv(&mut buf).await else { break; }; if len == 0 { break; }; let Ok(_) = send.write_all(&buf[..len]).await else { break; }; @@ -185,7 +185,7 @@ async fn handle_request( tokio::spawn({ async move { loop { - let mut buf = [0; 1024]; + let mut buf = [0; 8192]; let Ok(Some(mut len)) = recv.read(&mut buf).await else { break; }; if len == 0 { break; }; let mut sent_all = 0; @@ -209,7 +209,7 @@ async fn handle_request( tokio::spawn(async move { loop { - let mut buf = [0; 1024]; + let mut buf = [0; 8192]; let Ok(len) = remote_recv.read(&mut buf).await else { break; }; if len == 0 { break; }; let Ok(_) = send.write_all(&buf[..len]).await else { break; }; @@ -218,7 +218,7 @@ async fn handle_request( tokio::spawn(async move { loop { - let mut buf = [0; 1024]; + let mut buf = [0; 8192]; let Ok(Some(len)) = recv.read(&mut buf).await else { break; }; if len == 0 { break; }; let Ok(_) = remote_send.write_all(&buf[..len]).await else { break; };