diff options
| author | Sebastian Holmin <sebastian.holmin@mullvad.net> | 2024-11-05 14:16:19 +0100 |
|---|---|---|
| committer | Sebastian Holmin <sebastian.holmin@mullvad.net> | 2024-11-05 14:16:19 +0100 |
| commit | 30a6489587af96bc1d5bbea40143eaa03badc178 (patch) | |
| tree | 8508cfbc84da5a4250e090ab8f135c8cd8043d3c | |
| parent | 9bdbc0a2232aa689a061da560d04b4274037a609 (diff) | |
| parent | 9f885878b9064036600ee96275e17608b7708449 (diff) | |
| download | mullvadvpn-30a6489587af96bc1d5bbea40143eaa03badc178.tar.xz mullvadvpn-30a6489587af96bc1d5bbea40143eaa03badc178.zip | |
Merge branch 'shadowsocks-ipv6'
| -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)?; |
