diff --git a/Cargo.toml b/Cargo.toml index 4f3534e..99a234f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,10 +16,10 @@ anyhow = "1.0" byteorder = "1.3" clap = { version="2.33", default-features = false, features=["wrap_help", "nightly"] } clockpro-cache = "0.1.8" -coarsetime = "0.1.12" +coarsetime = "0.1.13" daemonize-simple = "0.1.4" -derivative = "1.0.3" -dnsstamps = "0.1.3" +derivative = "2.1.1" +dnsstamps = "0.1.4" env_logger = { version = "0.7.1", default-features = false, features = ["humantime"] } futures = { version = "0.3", features = ["async-await"] } hyper = { version = "0.13", default_features = false, optional = true } @@ -27,21 +27,21 @@ ipext = "0.1" jemallocator = "0.3" libsodium-sys-stable="1.19" log = { version = "0.4.8", features = ["std", "release_max_level_debug"] } -net2 = "0.2.33" +socket2 = "0.3" parking_lot = "0.10" privdrop = "0.3.4" rand = "0.7" rustc-hash = "1" serde = "1.0" serde_derive = "1.0" -serde-big-array = "0.2" +serde-big-array = "0.3.0" siphasher = "0.3" tokio = { version = "0.2.11", features = ["fs", "rt-threaded", "time", "tcp", "udp", "stream", "parking_lot"] } toml = "0.5" [dependencies.prometheus] optional = true -version = "0.7" +version = "0.9.0" default_features = false features = ["process"] diff --git a/src/main.rs b/src/main.rs index b9c2b8d..0cf0e82 100644 --- a/src/main.rs +++ b/src/main.rs @@ -241,11 +241,37 @@ async fn tls_proxy( Some(tls_upstream_addr) => tls_upstream_addr, }; let std_socket = match globals.external_addr { - Some(x @ SocketAddr::V4(_)) => net2::TcpBuilder::new_v4()?.bind(&x)?.to_tcp_stream()?, - Some(x @ SocketAddr::V6(_)) => net2::TcpBuilder::new_v6()?.bind(&x)?.to_tcp_stream()?, + Some(x @ SocketAddr::V4(_)) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv4(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )?; + kindy.bind(&x.into())?; + kindy.into_tcp_stream() + } + Some(x @ SocketAddr::V6(_)) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv6(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )?; + kindy.bind(&x.into())?; + kindy.into_tcp_stream() + } None => match tls_upstream_addr { - SocketAddr::V4(_) => net2::TcpBuilder::new_v4()?.to_tcp_stream()?, - SocketAddr::V6(_) => net2::TcpBuilder::new_v6()?.to_tcp_stream()?, + SocketAddr::V4(_) => socket2::Socket::new( + socket2::Domain::ipv4(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )? + .into_tcp_stream(), + SocketAddr::V6(_) => socket2::Socket::new( + socket2::Domain::ipv6(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )? + .into_tcp_stream(), }, }; let mut ext_socket = TcpStream::connect_std(std_socket, tls_upstream_addr).await?; @@ -397,28 +423,52 @@ fn bind_listeners( let mut sockets = Vec::with_capacity(listen_addrs.len()); for listen_addr in listen_addrs { let tcp_listener = match listen_addr { - SocketAddr::V4(_) => net2::TcpBuilder::new_v4()? - .reuse_address(true)? - .bind(&listen_addr)? - .listen(1024)?, - SocketAddr::V6(_) => net2::TcpBuilder::new_v6()? - .reuse_address(true)? - .only_v6(true)? - .bind(&listen_addr)? - .listen(1024)?, - }; - let std_socket = match listen_addr { - SocketAddr::V4(_) => net2::UdpBuilder::new_v4()? - .reuse_address(true)? - .bind(&listen_addr), - SocketAddr::V6(_) => net2::UdpBuilder::new_v6()? - .reuse_address(true)? - .only_v6(true)? - .bind(&listen_addr), + SocketAddr::V4(_) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv4(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )?; + kindy.set_reuse_address(true)?; + kindy.bind(&(*listen_addr).into())?; + kindy.listen(1024)?; + kindy.into_tcp_listener() + } + SocketAddr::V6(_) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv6(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )?; + kindy.set_reuse_address(true)?; + kindy.set_only_v6(true)?; + kindy.bind(&(*listen_addr).into())?; + kindy.listen(1024)?; + kindy.into_tcp_listener() + } }; - let udp_socket = match std_socket { - Ok(udp_socket) => udp_socket, - Err(e) => bail!("{}/UDP: {}", listen_addr, e), + let udp_socket = match listen_addr { + SocketAddr::V4(_) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv4(), + socket2::Type::dgram(), + Some(socket2::Protocol::udp()), + )?; + kindy.set_reuse_address(true)?; + kindy.bind(&(*listen_addr).into())?; + kindy.into_udp_socket() + } + SocketAddr::V6(_) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv6(), + socket2::Type::dgram(), + Some(socket2::Protocol::udp()), + )?; + kindy.set_reuse_address(true)?; + kindy.set_only_v6(true)?; + kindy.bind(&(*listen_addr).into())?; + kindy.into_udp_socket() + } }; sockets.push((tcp_listener, udp_socket)) } diff --git a/src/metrics.rs b/src/metrics.rs index e470e1d..cfa1228 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -53,15 +53,29 @@ pub async fn prometheus_service( ) -> Result<(), Error> { let path = Arc::new(metrics_config.path); let std_socket = match metrics_config.listen_addr { - SocketAddr::V4(_) => net2::TcpBuilder::new_v4()? - .reuse_address(true)? - .bind(&metrics_config.listen_addr)? - .listen(1024)?, - SocketAddr::V6(_) => net2::TcpBuilder::new_v6()? - .reuse_address(true)? - .only_v6(true)? - .bind(&metrics_config.listen_addr)? - .listen(1024)?, + SocketAddr::V4(_) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv4(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )?; + kindy.set_reuse_address(true)?; + kindy.bind(&metrics_config.listen_addr.into())?; + kindy.listen(1024)?; + kindy.into_tcp_listener() + } + SocketAddr::V6(_) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv6(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )?; + kindy.set_reuse_address(true)?; + kindy.set_only_v6(true)?; + kindy.bind(&metrics_config.listen_addr.into())?; + kindy.listen(1024)?; + kindy.into_tcp_listener() + } }; let mut stream = TcpListener::from_std(std_socket)?; let concurrent_connections = Arc::new(AtomicU32::new(0)); diff --git a/src/resolver.rs b/src/resolver.rs index f0758a9..790e85e 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -7,7 +7,7 @@ use byteorder::{BigEndian, ByteOrder}; use rand::prelude::*; use siphasher::sip128::Hasher128; use std::hash::Hasher; -use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}; +use std::net::{Ipv6Addr, SocketAddr, SocketAddrV6}; use tokio::net::{TcpStream, UdpSocket}; use tokio::prelude::*; @@ -19,14 +19,50 @@ pub async fn resolve_udp( has_cached_response: bool, ) -> Result, Error> { let std_socket = match globals.external_addr { - Some(x @ SocketAddr::V4(_)) => net2::UdpBuilder::new_v4()?.bind(&x)?, - Some(x @ SocketAddr::V6(_)) => net2::UdpBuilder::new_v6()?.bind(&x)?, + Some(x @ SocketAddr::V4(_)) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv4(), + socket2::Type::dgram(), + Some(socket2::Protocol::udp()), + )?; + kindy.bind(&x.into())?; + kindy.into_udp_socket() + } + Some(x @ SocketAddr::V6(_)) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv6(), + socket2::Type::dgram(), + Some(socket2::Protocol::udp()), + )?; + kindy.bind(&x.into())?; + kindy.into_udp_socket() + } None => match globals.upstream_addr { - SocketAddr::V4(_) => net2::UdpBuilder::new_v4()? - .bind(SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 0)))?, - SocketAddr::V6(s) => net2::UdpBuilder::new_v6()?.bind(SocketAddr::V6( - SocketAddrV6::new(Ipv6Addr::UNSPECIFIED, 0, s.flowinfo(), s.scope_id()), - ))?, + SocketAddr::V4(_) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv4(), + socket2::Type::dgram(), + Some(socket2::Protocol::udp()), + )?; + kindy.into_udp_socket() + } + SocketAddr::V6(s) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv6(), + socket2::Type::dgram(), + Some(socket2::Protocol::udp()), + )?; + kindy.bind( + &SocketAddr::V6(SocketAddrV6::new( + Ipv6Addr::UNSPECIFIED, + 0, + s.flowinfo(), + s.scope_id(), + )) + .into(), + )?; + kindy.into_udp_socket() + } }, }; let mut ext_socket = UdpSocket::from_std(std_socket)?; @@ -73,11 +109,37 @@ pub async fn resolve_tcp( tid: u16, ) -> Result, Error> { let std_socket = match globals.external_addr { - Some(x @ SocketAddr::V4(_)) => net2::TcpBuilder::new_v4()?.bind(&x)?.to_tcp_stream()?, - Some(x @ SocketAddr::V6(_)) => net2::TcpBuilder::new_v6()?.bind(&x)?.to_tcp_stream()?, + Some(x @ SocketAddr::V4(_)) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv4(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )?; + kindy.bind(&x.into())?; + kindy.into_tcp_stream() + } + Some(x @ SocketAddr::V6(_)) => { + let kindy = socket2::Socket::new( + socket2::Domain::ipv6(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )?; + kindy.bind(&x.into())?; + kindy.into_tcp_stream() + } None => match globals.upstream_addr { - SocketAddr::V4(_) => net2::TcpBuilder::new_v4()?.to_tcp_stream()?, - SocketAddr::V6(_) => net2::TcpBuilder::new_v6()?.to_tcp_stream()?, + SocketAddr::V4(_) => socket2::Socket::new( + socket2::Domain::ipv4(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )? + .into_tcp_stream(), + SocketAddr::V6(_) => socket2::Socket::new( + socket2::Domain::ipv6(), + socket2::Type::stream(), + Some(socket2::Protocol::tcp()), + )? + .into_tcp_stream(), }, }; let mut ext_socket = TcpStream::connect_std(std_socket, &globals.upstream_addr).await?;