diff --git a/Cargo.lock b/Cargo.lock index 6ec466a..48334f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,6 +76,23 @@ 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" @@ -377,6 +394,21 @@ 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" @@ -395,6 +427,12 @@ 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" @@ -713,6 +751,7 @@ version = "0.1.0" dependencies = [ "bcrypt", "clap", + "fast-socks5", "quinn", "rcgen", "rustls", @@ -1218,6 +1257,17 @@ 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" diff --git a/Cargo.toml b/Cargo.toml index 9dc81fb..00fb104 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ 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"] } diff --git a/src/client.rs b/src/client.rs index 582a6d9..5e1485d 100644 --- a/src/client.rs +++ b/src/client.rs @@ -6,6 +6,7 @@ use rustls::{ client::danger::{HandshakeSignatureValid, ServerCertVerified, ServerCertVerifier}, pki_types::{CertificateDer, ServerName, UnixTime}, }; +use tokio::net::UdpSocket; #[derive(Debug)] pub struct NoCertVerify; @@ -119,3 +120,19 @@ pub async fn close_request( recv.stop(0u32.into())?; Ok(()) } + +pub async fn run_udp_socks_server( + local: SocketAddr, + proxy: SocketAddr, + password: &str, +) -> Result<(), Box> { + todo!() +} + +pub async fn run_tcp_socks_server( + local: SocketAddr, + proxy: SocketAddr, + password: &str, +) -> Result<(), Box> { + todo!() +} diff --git a/src/main.rs b/src/main.rs index 2afba2c..854c8a8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,7 @@ +use std::net::SocketAddr; + use clap::Parser; +use client::{run_tcp_socks_server, run_udp_socks_server}; use server::run_server; mod client; @@ -8,15 +11,15 @@ mod server; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Args { - /// Connect to proxy + /// Connect to quicproxy server () #[arg(short, long)] connect: Option, - /// Bind proxy + /// Bind proxy (socks if connect arg is here or quicproxy otherwise) #[arg(short, long)] bind: Option, - /// Password + /// Password for connections #[arg(short, long, default_value = "nope")] password: String, } @@ -25,13 +28,34 @@ struct Args { async fn main() { let args = Args::parse(); - if let Some(host) = args.bind { + if let Some(host) = args.connect { + let local: SocketAddr = args.bind.unwrap_or("0.0.0.0:1080".to_string()) + .parse().expect("error parsing local host"); + + tokio::spawn({ + let host = host.clone(); + let local = local.clone(); + let password = args.password.clone(); + + async move { + run_udp_socks_server( + local, + host.parse().expect("error parsing host"), + &password + ).await.expect("error running local udp server"); + } + }); + + run_tcp_socks_server( + local, + host.parse().expect("error parsing host"), + &args.password + ).await.expect("error running local tcp server"); + } else if let Some(host) = args.bind { run_server( host.parse().expect("error parsing host"), &args.password ).await.expect("error running server"); - } else if let Some(host) = args.connect { - todo!() } else { println!("choose either --connect or --bind") } diff --git a/src/server.rs b/src/server.rs index 3104f9a..dbe32e3 100644 --- a/src/server.rs +++ b/src/server.rs @@ -183,7 +183,6 @@ async fn handle_request( }); tokio::spawn({ - let stream = stream.clone(); async move { loop { let mut buf = [0; 1024];