use udp-stream to make one handle_socks_stream function
This commit is contained in:
parent
c0658239a7
commit
c142154fa1
4 changed files with 50 additions and 62 deletions
62
Cargo.lock
generated
62
Cargo.lock
generated
|
@ -76,23 +76,6 @@ 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"
|
||||||
|
@ -394,21 +377,6 @@ 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"
|
||||||
|
@ -427,12 +395,6 @@ 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"
|
||||||
|
@ -751,11 +713,11 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bcrypt",
|
"bcrypt",
|
||||||
"clap",
|
"clap",
|
||||||
"fast-socks5",
|
|
||||||
"quinn",
|
"quinn",
|
||||||
"rcgen",
|
"rcgen",
|
||||||
"rustls",
|
"rustls",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"udp-stream",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1257,17 +1219,6 @@ 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"
|
||||||
|
@ -1294,6 +1245,17 @@ version = "1.18.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
|
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]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.18"
|
version = "1.0.18"
|
||||||
|
|
|
@ -6,8 +6,8 @@ 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"] }
|
||||||
tokio = { version = "1.47.0", features = ["rt", "macros", "rt-multi-thread", "net", "io-util"] }
|
tokio = { version = "1.47.0", features = ["rt", "macros", "rt-multi-thread", "net", "io-util"] }
|
||||||
|
udp-stream = "0.0.12"
|
||||||
|
|
|
@ -6,7 +6,8 @@ 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;
|
use tokio::{io::{AsyncReadExt, AsyncWriteExt}, net::{TcpListener, UdpSocket}};
|
||||||
|
use udp_stream::UdpListener;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct NoCertVerify;
|
pub struct NoCertVerify;
|
||||||
|
@ -60,7 +61,7 @@ impl ServerCertVerifier for NoCertVerify {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn open_connection(
|
async fn open_connection(
|
||||||
host: SocketAddr,
|
host: SocketAddr,
|
||||||
) -> Result<(Endpoint, Connection), Box<dyn Error>> {
|
) -> Result<(Endpoint, Connection), Box<dyn Error>> {
|
||||||
let mut client_crypto = rustls::ClientConfig::builder()
|
let mut client_crypto = rustls::ClientConfig::builder()
|
||||||
|
@ -82,7 +83,7 @@ pub async fn open_connection(
|
||||||
Ok((endpoint, conn))
|
Ok((endpoint, conn))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn close_connection(
|
async fn close_connection(
|
||||||
endpoint: Endpoint,
|
endpoint: Endpoint,
|
||||||
conn: Connection,
|
conn: Connection,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
|
@ -91,7 +92,7 @@ pub async fn close_connection(
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn open_request(
|
async fn open_request(
|
||||||
conn: &mut Connection,
|
conn: &mut Connection,
|
||||||
remote: SocketAddr,
|
remote: SocketAddr,
|
||||||
password: &str,
|
password: &str,
|
||||||
|
@ -112,7 +113,7 @@ pub async fn open_request(
|
||||||
Ok((send, recv))
|
Ok((send, recv))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn close_request(
|
async fn close_request(
|
||||||
mut send: SendStream,
|
mut send: SendStream,
|
||||||
mut recv: RecvStream
|
mut recv: RecvStream
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
|
@ -126,7 +127,13 @@ pub async fn run_udp_socks_server(
|
||||||
proxy: SocketAddr,
|
proxy: SocketAddr,
|
||||||
password: &str,
|
password: &str,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
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(
|
pub async fn run_tcp_socks_server(
|
||||||
|
@ -134,5 +141,24 @@ pub async fn run_tcp_socks_server(
|
||||||
proxy: SocketAddr,
|
proxy: SocketAddr,
|
||||||
password: &str,
|
password: &str,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
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<S>(
|
||||||
|
stream: S,
|
||||||
|
addr: SocketAddr,
|
||||||
|
proxy: SocketAddr,
|
||||||
|
password: String
|
||||||
|
)
|
||||||
|
where
|
||||||
|
S: AsyncReadExt + AsyncWriteExt
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -174,7 +174,7 @@ async fn handle_request(
|
||||||
let stream = stream.clone();
|
let stream = stream.clone();
|
||||||
async move {
|
async move {
|
||||||
loop {
|
loop {
|
||||||
let mut buf = [0; 1024];
|
let mut buf = [0; 8192];
|
||||||
let Ok(len) = stream.recv(&mut buf).await else { break; };
|
let Ok(len) = stream.recv(&mut buf).await else { break; };
|
||||||
if len == 0 { break; };
|
if len == 0 { break; };
|
||||||
let Ok(_) = send.write_all(&buf[..len]).await else { break; };
|
let Ok(_) = send.write_all(&buf[..len]).await else { break; };
|
||||||
|
@ -185,7 +185,7 @@ async fn handle_request(
|
||||||
tokio::spawn({
|
tokio::spawn({
|
||||||
async move {
|
async move {
|
||||||
loop {
|
loop {
|
||||||
let mut buf = [0; 1024];
|
let mut buf = [0; 8192];
|
||||||
let Ok(Some(mut len)) = recv.read(&mut buf).await else { break; };
|
let Ok(Some(mut len)) = recv.read(&mut buf).await else { break; };
|
||||||
if len == 0 { break; };
|
if len == 0 { break; };
|
||||||
let mut sent_all = 0;
|
let mut sent_all = 0;
|
||||||
|
@ -209,7 +209,7 @@ async fn handle_request(
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
loop {
|
loop {
|
||||||
let mut buf = [0; 1024];
|
let mut buf = [0; 8192];
|
||||||
let Ok(len) = remote_recv.read(&mut buf).await else { break; };
|
let Ok(len) = remote_recv.read(&mut buf).await else { break; };
|
||||||
if len == 0 { break; };
|
if len == 0 { break; };
|
||||||
let Ok(_) = send.write_all(&buf[..len]).await else { break; };
|
let Ok(_) = send.write_all(&buf[..len]).await else { break; };
|
||||||
|
@ -218,7 +218,7 @@ async fn handle_request(
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
loop {
|
loop {
|
||||||
let mut buf = [0; 1024];
|
let mut buf = [0; 8192];
|
||||||
let Ok(Some(len)) = recv.read(&mut buf).await else { break; };
|
let Ok(Some(len)) = recv.read(&mut buf).await else { break; };
|
||||||
if len == 0 { break; };
|
if len == 0 { break; };
|
||||||
let Ok(_) = remote_send.write_all(&buf[..len]).await else { break; };
|
let Ok(_) = remote_send.write_all(&buf[..len]).await else { break; };
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue