Set TCP source address for outgoing connections

pull/5/head
Frank Denis 5 years ago
parent e1bd1f52dc
commit 58c5452084

@ -16,9 +16,11 @@ futures-preview = { version = "=0.3.0-alpha.18", features = ["compat", "async-aw
jemallocator = "0.3.2" jemallocator = "0.3.2"
libsodium-sys="0.2.4" libsodium-sys="0.2.4"
log = "0.4.8" log = "0.4.8"
net2 = "0.2.33"
parking_lot = "0.9.0" parking_lot = "0.9.0"
rand = "0.7.0" rand = "0.7.2"
tokio = "=0.2.0-alpha.4" tokio = "=0.2.0-alpha.4"
tokio-net = "=0.2.0-alpha.4"
[profile.release] [profile.release]
lto = true lto = true

@ -46,8 +46,9 @@ use std::sync::Arc;
use std::time::Duration; use std::time::Duration;
use tokio::net::{TcpListener, TcpStream, UdpSocket}; use tokio::net::{TcpListener, TcpStream, UdpSocket};
use tokio::prelude::*; use tokio::prelude::*;
use tokio::runtime::{current_thread::Handle, Runtime}; use tokio::runtime::Runtime;
use tokio::sync::oneshot; use tokio::sync::oneshot;
use tokio_net::driver::Handle;
const DNSCRYPT_QUERY_MIN_SIZE: usize = 12; const DNSCRYPT_QUERY_MIN_SIZE: usize = 12;
const DNSCRYPT_QUERY_MAX_SIZE: usize = 512; const DNSCRYPT_QUERY_MAX_SIZE: usize = 512;
@ -112,7 +113,7 @@ async fn handle_client_query(
let mut ext_socket = UdpSocket::bind(&globals.external_addr).await?; let mut ext_socket = UdpSocket::bind(&globals.external_addr).await?;
ext_socket.connect(&globals.upstream_addr).await?; ext_socket.connect(&globals.upstream_addr).await?;
set_edns_max_payload_size(&mut packet, DNS_MAX_PACKET_SIZE as u16)?; set_edns_max_payload_size(&mut packet, DNS_MAX_PACKET_SIZE as u16)?;
ext_socket.send(&packet).await.unwrap(); ext_socket.send(&packet).await?;
let mut response; let mut response;
loop { loop {
response = vec![0u8; DNS_MAX_PACKET_SIZE]; response = vec![0u8; DNS_MAX_PACKET_SIZE];
@ -128,7 +129,14 @@ async fn handle_client_query(
dbg!("Response collision"); dbg!("Response collision");
} }
if dns::is_truncated(&response) { if dns::is_truncated(&response) {
let mut ext_socket = TcpStream::connect(&globals.upstream_addr).await?; let std_socket = match globals.external_addr {
SocketAddr::V4(_) => net2::TcpBuilder::new_v4(),
SocketAddr::V6(_) => net2::TcpBuilder::new_v6(),
}?
.bind(&globals.external_addr)?
.to_tcp_stream()?;
let mut ext_socket =
TcpStream::connect_std(std_socket, &globals.upstream_addr, &Handle::default()).await?;
ext_socket.set_nodelay(true)?; ext_socket.set_nodelay(true)?;
let mut binlen = [0u8, 0]; let mut binlen = [0u8, 0];
BigEndian::write_u16(&mut binlen[..], packet.len() as u16); BigEndian::write_u16(&mut binlen[..], packet.len() as u16);

Loading…
Cancel
Save