socks5 and port forwarding (#1118)

This commit is contained in:
Sijie.Sun
2025-07-17 10:09:25 +08:00
committed by GitHub
parent 3f6c7ba1d2
commit 940238f158
2 changed files with 45 additions and 17 deletions
+1 -1
View File
@@ -127,7 +127,7 @@ mod tests {
#[tokio::test] #[tokio::test]
async fn test_socket_addrs() { async fn test_socket_addrs() {
let url = url::Url::parse("tcp://public.easytier.cn:80").unwrap(); let url = url::Url::parse("tcp://github-ci-test.easytier.cn:80").unwrap();
let addrs = socket_addrs(&url, || Some(80)).await.unwrap(); let addrs = socket_addrs(&url, || Some(80)).await.unwrap();
assert_eq!(2, addrs.len(), "addrs: {:?}", addrs); assert_eq!(2, addrs.len(), "addrs: {:?}", addrs);
println!("addrs: {:?}", addrs); println!("addrs: {:?}", addrs);
+44 -16
View File
@@ -10,7 +10,7 @@ use kcp_sys::{endpoint::KcpEndpoint, stream::KcpStream};
use crate::{ use crate::{
common::{ common::{
config::PortForwardConfig, global_ctx::GlobalCtxEvent, join_joinset_background, config::PortForwardConfig, global_ctx::GlobalCtxEvent, join_joinset_background,
scoped_task::ScopedTask, netns::NetNS, scoped_task::ScopedTask,
}, },
gateway::{ gateway::{
fast_socks5::{ fast_socks5::{
@@ -23,7 +23,10 @@ use crate::{
kcp_proxy::NatDstKcpConnector, kcp_proxy::NatDstKcpConnector,
tokio_smoltcp::{channel_device, BufferSize, Net, NetConfig}, tokio_smoltcp::{channel_device, BufferSize, Net, NetConfig},
}, },
tunnel::packet_def::{PacketType, ZCPacket}, tunnel::{
common::setup_sokcet2,
packet_def::{PacketType, ZCPacket},
},
}; };
use anyhow::Context; use anyhow::Context;
use dashmap::DashMap; use dashmap::DashMap;
@@ -32,8 +35,7 @@ use pnet::packet::{
}; };
use tokio::{ use tokio::{
io::{AsyncRead, AsyncWrite}, io::{AsyncRead, AsyncWrite},
net::TcpListener, net::{TcpListener, TcpSocket, UdpSocket},
net::UdpSocket,
select, select,
sync::{mpsc, Mutex}, sync::{mpsc, Mutex},
task::JoinSet, task::JoinSet,
@@ -250,6 +252,38 @@ impl AsyncTcpConnector for Socks5KcpConnector {
} }
} }
fn bind_tcp_socket(addr: SocketAddr, net_ns: NetNS) -> Result<TcpListener, Error> {
let _g = net_ns.guard();
let socket2_socket = socket2::Socket::new(
socket2::Domain::for_address(addr),
socket2::Type::STREAM,
Some(socket2::Protocol::TCP),
)?;
setup_sokcet2(&socket2_socket, &addr)?;
let socket = TcpSocket::from_std_stream(socket2_socket.into());
if let Err(e) = socket.set_nodelay(true) {
tracing::warn!(?e, "set_nodelay fail in listen");
}
Ok(socket.listen(1024)?)
}
fn bind_udp_socket(addr: SocketAddr, net_ns: NetNS) -> Result<UdpSocket, Error> {
let _g = net_ns.guard();
let socket2_socket = socket2::Socket::new(
socket2::Domain::for_address(addr),
socket2::Type::DGRAM,
Some(socket2::Protocol::UDP),
)?;
setup_sokcet2(&socket2_socket, &addr)?;
Ok(UdpSocket::from_std(socket2_socket.into())?)
}
struct Socks5ServerNet { struct Socks5ServerNet {
ipv4_addr: cidr::Ipv4Inet, ipv4_addr: cidr::Ipv4Inet,
auth: Option<SimpleUserPassword>, auth: Option<SimpleUserPassword>,
@@ -555,10 +589,10 @@ impl Socks5Server {
proxy_url.port().unwrap() proxy_url.port().unwrap()
); );
let listener = { let listener = bind_tcp_socket(
let _g = self.global_ctx.net_ns.guard(); bind_addr.parse::<SocketAddr>().unwrap(),
TcpListener::bind(bind_addr.parse::<SocketAddr>().unwrap()).await? self.global_ctx.net_ns.clone(),
}; )?;
let net = self.net.clone(); let net = self.net.clone();
self.tasks.lock().unwrap().spawn(async move { self.tasks.lock().unwrap().spawn(async move {
@@ -651,10 +685,7 @@ impl Socks5Server {
bind_addr: SocketAddr, bind_addr: SocketAddr,
dst_addr: SocketAddr, dst_addr: SocketAddr,
) -> Result<(), Error> { ) -> Result<(), Error> {
let listener = { let listener = bind_tcp_socket(bind_addr, self.global_ctx.net_ns.clone())?;
let _g = self.global_ctx.net_ns.guard();
TcpListener::bind(bind_addr).await?
};
let net = self.net.clone(); let net = self.net.clone();
let entries = self.entries.clone(); let entries = self.entries.clone();
@@ -721,10 +752,7 @@ impl Socks5Server {
bind_addr: SocketAddr, bind_addr: SocketAddr,
dst_addr: SocketAddr, dst_addr: SocketAddr,
) -> Result<(), Error> { ) -> Result<(), Error> {
let socket = { let socket = Arc::new(bind_udp_socket(bind_addr, self.global_ctx.net_ns.clone())?);
let _g = self.global_ctx.net_ns.guard();
Arc::new(UdpSocket::bind(bind_addr).await?)
};
let entries = self.entries.clone(); let entries = self.entries.clone();
let net_ns = self.global_ctx.net_ns.clone(); let net_ns = self.global_ctx.net_ns.clone();