Skip to content

Commit ab9bf61

Browse files
committed
[#190] Supports UDP transparent proxy on Linux, BSD-like untested
1 parent 8ec7633 commit ab9bf61

File tree

6 files changed

+712
-21
lines changed

6 files changed

+712
-21
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ socket2 = "0.3"
8383
cfg-if = "0.1"
8484
bloomfilter = "^1.0.2"
8585
spin = "0.5"
86+
mio = "0.6"
8687

8788
[target.'cfg(windows)'.dependencies]
8889
winapi = { version = "0.3", features = ["mswsock", "winsock2"] }

src/relay/tcprelay/redir_local.rs

+5-16
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ cfg_if! {
3030
use std::{
3131
io::Error,
3232
mem,
33-
net::{SocketAddrV4, SocketAddrV6},
3433
os::unix::io::AsRawFd,
3534
};
35+
use crate::relay::utils::sockaddr_to_std;
36+
3637
let fd = s.as_raw_fd();
3738
unsafe {
3839
let mut target_addr: libc::sockaddr_storage = mem::zeroed();
@@ -71,21 +72,9 @@ cfg_if! {
7172
return Err(Error::last_os_error());
7273
}
7374
}
75+
7476
// Convert sockaddr_storage to SocketAddr
75-
match target_addr.ss_family as libc::c_int {
76-
libc::AF_INET => {
77-
let addr: SocketAddrV4 = mem::transmute_copy(&target_addr);
78-
Ok(SocketAddr::V4(addr))
79-
}
80-
libc::AF_INET6 => {
81-
let addr: SocketAddrV6 = mem::transmute_copy(&target_addr);
82-
Ok(SocketAddr::V6(addr))
83-
}
84-
_ => {
85-
let err = Error::new(ErrorKind::InvalidData, "family must be either AF_INET or AF_INET6");
86-
return Err(err);
87-
}
88-
}
77+
sockaddr_to_std(&target_addr)
8978
}
9079
}
9180
} else if #[cfg(any(target_os = "macos", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonfly"))] {
@@ -96,7 +85,7 @@ cfg_if! {
9685
}
9786
} else {
9887
fn get_original_destination_addr(_: &mut TcpStream) -> io::Result<SocketAddr> {
99-
unimplemented!("Transparent Proxy (redir) doesn't work on this platform");
88+
unimplemented!("TCP Transparent Proxy (redir) is not supported on this platform");
10089
}
10190
}
10291
}

src/relay/udprelay/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ pub mod local;
5454
mod redir_local;
5555
pub mod server;
5656
mod socks5_local;
57+
mod tproxy_socket;
5758
mod tunnel_local;
5859
mod utils;
5960

0 commit comments

Comments
 (0)