diff --git a/client/litep2p/src/lib.rs b/client/litep2p/src/lib.rs index 4ed87ed1..9358c98e 100644 --- a/client/litep2p/src/lib.rs +++ b/client/litep2p/src/lib.rs @@ -50,7 +50,10 @@ use crate::{ #[cfg(feature = "websocket")] use crate::transport::websocket::WebSocketTransport; -use hickory_resolver::TokioResolver; +use hickory_resolver::{ + config::{ResolverConfig, GOOGLE}, + TokioResolver, +}; use multiaddr::{Multiaddr, Protocol}; use transport::Endpoint; use types::ConnectionId; @@ -155,8 +158,20 @@ impl Litep2p { let mut listen_addresses = vec![]; let (resolver_config, resolver_opts) = if litep2p_config.use_system_dns_config { - hickory_resolver::system_conf::read_system_conf() - .map_err(|e| Error::CannotReadSystemDnsConfig(e.into()))? + // `ResolverConfig::default()` has no nameservers since hickory 0.26, so on a + // failed system read fall back to public DNS rather than leave the node unable + // to resolve `/dns/` peers. + match hickory_resolver::system_conf::read_system_conf() { + Ok(conf) => conf, + Err(error) => { + tracing::error!( + target: LOG_TARGET, + ?error, + "failed to read system DNS config; falling back to public DNS", + ); + (ResolverConfig::udp_and_tcp(&GOOGLE), Default::default()) + }, + } } else { (Default::default(), Default::default()) };