summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSebastian Holmin <sebastian.holmin@mullvad.net>2024-11-05 14:16:19 +0100
committerSebastian Holmin <sebastian.holmin@mullvad.net>2024-11-05 14:16:19 +0100
commit30a6489587af96bc1d5bbea40143eaa03badc178 (patch)
tree8508cfbc84da5a4250e090ab8f135c8cd8043d3c
parent9bdbc0a2232aa689a061da560d04b4274037a609 (diff)
parent9f885878b9064036600ee96275e17608b7708449 (diff)
downloadmullvadvpn-30a6489587af96bc1d5bbea40143eaa03badc178.tar.xz
mullvadvpn-30a6489587af96bc1d5bbea40143eaa03badc178.zip
Merge branch 'shadowsocks-ipv6'
-rw-r--r--tunnel-obfuscation/src/shadowsocks.rs24
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)?;