From 5d2b6ac7ce5b36acf8bab2aa923a145a33fcdd86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Christian=20Gr=C3=BCnhage?= Date: Sun, 15 Jan 2023 11:59:12 +0100 Subject: [PATCH 1/2] explicit DNS class specification for resolvers Signed-off-by: avitex --- src/dns.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/dns.rs b/src/dns.rs index 69132cb..021d6b8 100644 --- a/src/dns.rs +++ b/src/dns.rs @@ -9,7 +9,7 @@ use futures_util::{StreamExt, future, ready, stream}; use hickory_proto::{ ProtoError, ProtoErrorKind, op::Query, - rr::{Name, RData, RecordType}, + rr::{DNSClass, Name, RData, RecordType}, udp::UdpClientStream, xfer::{DnsHandle, DnsRequestOptions, DnsResponse}, }; @@ -57,6 +57,7 @@ pub const OPENDNS_V4: &dyn crate::Resolver<'static> = &Resolver::new_static( ], DEFAULT_DNS_PORT, QueryMethod::A, + DNSClass::IN, ); /// OpenDNS IPv6 DNS resolver options. @@ -72,6 +73,7 @@ pub const OPENDNS_V6: &dyn crate::Resolver<'static> = &Resolver::new_static( ], DEFAULT_DNS_PORT, QueryMethod::AAAA, + DNSClass::IN, ); /// Combined Google DNS IPv4 and IPv6 options @@ -92,6 +94,7 @@ pub const GOOGLE_V4: &dyn crate::Resolver<'static> = &Resolver::new_static( ], DEFAULT_DNS_PORT, QueryMethod::TXT, + DNSClass::IN, ); /// Google DNS IPv6 DNS resolver options @@ -111,6 +114,7 @@ pub const GOOGLE_V6: &dyn crate::Resolver<'static> = &Resolver::new_static( ], DEFAULT_DNS_PORT, QueryMethod::TXT, + DNSClass::IN, ); /////////////////////////////////////////////////////////////////////////////// @@ -172,11 +176,12 @@ pub struct Resolver<'r> { name: Cow<'r, str>, servers: Cow<'r, [IpAddr]>, method: QueryMethod, + class: DNSClass, } impl<'r> Resolver<'r> { /// Create a new DNS resolver. - pub fn new(name: N, servers: S, port: u16, method: QueryMethod) -> Self + pub fn new(name: N, servers: S, port: u16, method: QueryMethod, class: DNSClass) -> Self where N: Into>, S: Into>, @@ -186,6 +191,7 @@ impl<'r> Resolver<'r> { name: name.into(), servers: servers.into(), method, + class, } } } @@ -198,12 +204,14 @@ impl Resolver<'static> { servers: &'static [IpAddr], port: u16, method: QueryMethod, + class: DNSClass, ) -> Self { Self { port, name: Cow::Borrowed(name), servers: Cow::Borrowed(servers), method, + class, } } } @@ -231,7 +239,8 @@ impl<'r> crate::Resolver<'r> for Resolver<'r> { QueryMethod::TXT => RecordType::TXT, }; let span = trace_span!("dns resolver", ?version, ?method, %name, %port); - let query = Query::query(name, record_type); + let mut query = Query::query(name, record_type); + query.set_query_class(self.class); let stream = resolve(first_server, port, query.clone(), method); let resolutions = DnsResolutions { port, From 5e4af05c2b572340fab6a84cff047d4389c249f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Christian=20Gr=C3=BCnhage?= Date: Sun, 15 Jan 2023 11:59:59 +0100 Subject: [PATCH 2/2] provide cloudflare DNS resolver Signed-off-by: avitex --- Cargo.toml | 3 ++- src/dns.rs | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index fd28b6b..b0f0e83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ https-openssl = ["hyper-openssl", "openssl", "tower-layer"] https-rustls-webpki = ["hyper-rustls/webpki-roots"] https-rustls-native = ["hyper-rustls/rustls-native-certs"] -all-providers = ["google", "opendns", "ipify-org", "my-ip-io", "myip-com", "seeip-org"] +all-providers = ["google", "opendns", "ipify-org", "my-ip-io", "myip-com", "seeip-org", "cloudflare"] google = [] opendns = [] @@ -32,6 +32,7 @@ myip-com = [] my-ip-io = [] seeip-org = [] ipify-org = [] +cloudflare = [] [dependencies] thiserror = "2" diff --git a/src/dns.rs b/src/dns.rs index 021d6b8..f082c37 100644 --- a/src/dns.rs +++ b/src/dns.rs @@ -37,6 +37,8 @@ pub const ALL: &dyn crate::Resolver<'static> = &&[ OPENDNS, #[cfg(feature = "google")] GOOGLE, + #[cfg(feature = "cloudflare")] + CLOUDFLARE, ]; /// Combined OpenDNS IPv4 and IPv6 options. @@ -117,6 +119,41 @@ pub const GOOGLE_V6: &dyn crate::Resolver<'static> = &Resolver::new_static( DNSClass::IN, ); +/// Combined Cloudflare DNS IPv4 and IPv6 options. +#[cfg(feature = "cloudflare")] +#[cfg_attr(docsrs, doc(cfg(feature = "cloudflare")))] +pub const CLOUDFLARE: &dyn crate::Resolver<'static> = &&[CLOUDFLARE_V4, CLOUDFLARE_V6]; + +/// Cloudflare DNS IPv4 DNS resolver options. +#[cfg(feature = "cloudflare")] +#[cfg_attr(docsrs, doc(cfg(feature = "cloudflare")))] +pub const CLOUDFLARE_V4: &dyn crate::Resolver<'static> = &Resolver::new_static( + "whoami.cloudflare", + &[ + IpAddr::V4(Ipv4Addr::new(1, 1, 1, 1)), + IpAddr::V4(Ipv4Addr::new(1, 0, 0, 1)), + ], + DEFAULT_DNS_PORT, + QueryMethod::TXT, + DNSClass::CH, +); + +/// Cloudflare DNS IPv6 DNS resolver options. +#[cfg(feature = "cloudflare")] +#[cfg_attr(docsrs, doc(cfg(feature = "cloudflare")))] +pub const CLOUDFLARE_V6: &dyn crate::Resolver<'static> = &Resolver::new_static( + "whoami.cloudflare", + &[ + // 2606:4700:4700::1111 + IpAddr::V6(Ipv6Addr::new(9734, 18176, 18176, 0, 0, 0, 0, 4369)), + // 2606:4700:4700::1001 + IpAddr::V6(Ipv6Addr::new(9734, 18176, 18176, 0, 0, 0, 0, 4097)), + ], + DEFAULT_DNS_PORT, + QueryMethod::TXT, + DNSClass::CH, +); + /////////////////////////////////////////////////////////////////////////////// // Error