only tcp and udp local servers are unwritted

This commit is contained in:
MeexReay 2025-07-28 22:40:25 +03:00
parent 270ef5cf84
commit c0658239a7
5 changed files with 98 additions and 7 deletions

50
Cargo.lock generated
View file

@ -76,6 +76,23 @@ dependencies = [
"windows-sys 0.59.0", "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]] [[package]]
name = "aws-lc-rs" name = "aws-lc-rs"
version = "1.13.1" version = "1.13.1"
@ -377,6 +394,21 @@ dependencies = [
"windows-sys 0.59.0", "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]] [[package]]
name = "fastbloom" name = "fastbloom"
version = "0.9.0" version = "0.9.0"
@ -395,6 +427,12 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
[[package]]
name = "futures-core"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.7" version = "0.14.7"
@ -713,6 +751,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"bcrypt", "bcrypt",
"clap", "clap",
"fast-socks5",
"quinn", "quinn",
"rcgen", "rcgen",
"rustls", "rustls",
@ -1218,6 +1257,17 @@ dependencies = [
"syn", "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]] [[package]]
name = "tracing" name = "tracing"
version = "0.1.41" version = "0.1.41"

View file

@ -6,6 +6,7 @@ edition = "2024"
[dependencies] [dependencies]
bcrypt = "0.17.0" bcrypt = "0.17.0"
clap = { version = "4.5.41", features = ["derive"] } clap = { version = "4.5.41", features = ["derive"] }
fast-socks5 = "1.0.0-rc.0"
quinn = { version = "0.11.8", features = ["rustls"] } quinn = { version = "0.11.8", features = ["rustls"] }
rcgen = "0.14.3" rcgen = "0.14.3"
rustls = { version = "0.23.30", features = ["ring"] } rustls = { version = "0.23.30", features = ["ring"] }

View file

@ -6,6 +6,7 @@ use rustls::{
client::danger::{HandshakeSignatureValid, ServerCertVerified, ServerCertVerifier}, client::danger::{HandshakeSignatureValid, ServerCertVerified, ServerCertVerifier},
pki_types::{CertificateDer, ServerName, UnixTime}, pki_types::{CertificateDer, ServerName, UnixTime},
}; };
use tokio::net::UdpSocket;
#[derive(Debug)] #[derive(Debug)]
pub struct NoCertVerify; pub struct NoCertVerify;
@ -119,3 +120,19 @@ pub async fn close_request(
recv.stop(0u32.into())?; recv.stop(0u32.into())?;
Ok(()) Ok(())
} }
pub async fn run_udp_socks_server(
local: SocketAddr,
proxy: SocketAddr,
password: &str,
) -> Result<(), Box<dyn Error>> {
todo!()
}
pub async fn run_tcp_socks_server(
local: SocketAddr,
proxy: SocketAddr,
password: &str,
) -> Result<(), Box<dyn Error>> {
todo!()
}

View file

@ -1,4 +1,7 @@
use std::net::SocketAddr;
use clap::Parser; use clap::Parser;
use client::{run_tcp_socks_server, run_udp_socks_server};
use server::run_server; use server::run_server;
mod client; mod client;
@ -8,15 +11,15 @@ mod server;
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
#[command(version, about, long_about = None)] #[command(version, about, long_about = None)]
struct Args { struct Args {
/// Connect to proxy /// Connect to quicproxy server ()
#[arg(short, long)] #[arg(short, long)]
connect: Option<String>, connect: Option<String>,
/// Bind proxy /// Bind proxy (socks if connect arg is here or quicproxy otherwise)
#[arg(short, long)] #[arg(short, long)]
bind: Option<String>, bind: Option<String>,
/// Password /// Password for connections
#[arg(short, long, default_value = "nope")] #[arg(short, long, default_value = "nope")]
password: String, password: String,
} }
@ -25,13 +28,34 @@ struct Args {
async fn main() { async fn main() {
let args = Args::parse(); 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( run_server(
host.parse().expect("error parsing host"), host.parse().expect("error parsing host"),
&args.password &args.password
).await.expect("error running server"); ).await.expect("error running server");
} else if let Some(host) = args.connect {
todo!()
} else { } else {
println!("choose either --connect or --bind") println!("choose either --connect or --bind")
} }

View file

@ -183,7 +183,6 @@ async fn handle_request(
}); });
tokio::spawn({ tokio::spawn({
let stream = stream.clone();
async move { async move {
loop { loop {
let mut buf = [0; 1024]; let mut buf = [0; 1024];