diff options
| -rw-r--r-- | tunnel-obfuscation/src/shadowsocks.rs | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/tunnel-obfuscation/src/shadowsocks.rs b/tunnel-obfuscation/src/shadowsocks.rs index fc0f466029..f838f96e6e 100644 --- a/tunnel-obfuscation/src/shadowsocks.rs +++ b/tunnel-obfuscation/src/shadowsocks.rs @@ -84,6 +84,7 @@ impl Shadowsocks { let (shutdown_tx, shutdown_rx) = oneshot::channel(); let remote_socket = create_shadowsocks_socket( + settings.shadowsocks_endpoint.is_ipv4(), #[cfg(target_os = "linux")] settings.fwmark, ) @@ -122,7 +123,7 @@ async fn run_forwarding( .await .map_err(Error::WaitForUdpClient)?; - let shadowsocks = connect_shadowsocks(remote_socket, shadowsocks_endpoint)?; + let shadowsocks = connect_shadowsocks(remote_socket, shadowsocks_endpoint); let shadowsocks = Arc::new(shadowsocks); let local_udp = Arc::new(local_udp_socket); @@ -156,31 +157,28 @@ async fn run_forwarding( Ok(()) } -fn connect_shadowsocks( - remote_socket: UdpSocket, - shadowsocks_endpoint: SocketAddr, -) -> std::result::Result<ProxySocket, Error> { +fn connect_shadowsocks(remote_socket: UdpSocket, shadowsocks_endpoint: SocketAddr) -> ProxySocket { let ss_context = Context::new_shared(ServerType::Local); let ss_config: ServerConfig = ServerConfig::new( shadowsocks_endpoint, SHADOWSOCKS_PASSWORD, SHADOWSOCKS_CIPHER, ); - Ok(ProxySocket::from_socket( - UdpSocketType::Client, - ss_context, - &ss_config, - remote_socket, - )) + ProxySocket::from_socket(UdpSocketType::Client, ss_context, &ss_config, remote_socket) } async fn create_shadowsocks_socket( + ipv4: bool, #[cfg(target_os = "linux")] fwmark: Option<u32>, ) -> std::result::Result<UdpSocket, Error> { - let socket = UdpSocket::bind("0.0.0.0:0") + let random_bind_addr = if ipv4 { + SocketAddr::new("0.0.0.0".parse().unwrap(), 0) + } else { + SocketAddr::new("::".parse().unwrap(), 0) + }; + let socket = UdpSocket::bind(random_bind_addr) .await .map_err(Error::BindRemoteUdp)?; - #[cfg(target_os = "linux")] if let Some(fwmark) = fwmark { setsockopt(socket.as_raw_fd(), sockopt::Mark, &fwmark).map_err(Error::SetFwmark)?; |
