diff --git a/rust/connlib/tunnel/src/io.rs b/rust/connlib/tunnel/src/io.rs index 8febe9e7b..cb4e5ebb0 100644 --- a/rust/connlib/tunnel/src/io.rs +++ b/rust/connlib/tunnel/src/io.rs @@ -149,13 +149,8 @@ impl Io { self.sockets.poll_has_sockets(cx) } - pub fn fastest_nameserver(&self) -> io::Result { - let ns = self - .nameservers - .fastest() - .ok_or(io::Error::other(NoNameserverAvailable))?; - - Ok(ns) + pub fn fastest_nameserver(&self) -> Option { + self.nameservers.fastest() } pub fn poll<'b>( @@ -418,10 +413,6 @@ impl Io { } } -#[derive(Debug, thiserror::Error)] -#[error("No nameserver available to handle DNS query")] -pub struct NoNameserverAvailable; - fn is_max_wg_packet_size(d: &DatagramIn) -> bool { let len = d.packet.len(); if len > MAX_FZ_PAYLOAD { diff --git a/rust/connlib/tunnel/src/lib.rs b/rust/connlib/tunnel/src/lib.rs index 64a303277..afc142c15 100644 --- a/rust/connlib/tunnel/src/lib.rs +++ b/rust/connlib/tunnel/src/lib.rs @@ -70,7 +70,6 @@ pub type ClientTunnel = Tunnel; pub use client::ClientState; pub use gateway::{DnsResourceNatEntry, GatewayState, ResolveDnsRequest}; -pub use io::NoNameserverAvailable; pub use sockets::UdpSocketThreadStopped; pub use utils::turn; @@ -352,7 +351,16 @@ impl GatewayTunnel { continue; } Poll::Ready(io::Input::UdpDnsQuery(query)) => { - let nameserver = self.io.fastest_nameserver()?; + let Some(nameserver) = self.io.fastest_nameserver() else { + tracing::warn!(query = ?query.message, "No nameserver available to handle UDP DNS query"); + + self.io.send_udp_dns_response( + query.source, + dns_types::Response::servfail(&query.message), + )?; + + continue; + }; self.io.send_dns_query(dns::RecursiveQuery::via_udp( query.source, @@ -361,7 +369,16 @@ impl GatewayTunnel { )); } Poll::Ready(io::Input::TcpDnsQuery(query)) => { - let nameserver = self.io.fastest_nameserver()?; + let Some(nameserver) = self.io.fastest_nameserver() else { + tracing::warn!(query = ?query.message, "No nameserver available to handle TCP DNS query"); + + self.io.send_tcp_dns_response( + query.remote, + dns_types::Response::servfail(&query.message), + )?; + + continue; + }; self.io.send_dns_query(dns::RecursiveQuery::via_tcp( query.local, diff --git a/rust/gateway/src/eventloop.rs b/rust/gateway/src/eventloop.rs index 59b029d28..fa6b3d756 100644 --- a/rust/gateway/src/eventloop.rs +++ b/rust/gateway/src/eventloop.rs @@ -122,12 +122,6 @@ impl Eventloop { continue; } - if e.root_cause() - .is::() - { - return Poll::Ready(Err(e)); - } - if e.root_cause() .is::() {