Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,15 @@ 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 = []
myip-com = []
my-ip-io = []
seeip-org = []
ipify-org = []
cloudflare = []

[dependencies]
thiserror = "2"
Expand Down
52 changes: 49 additions & 3 deletions src/dns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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},
};
Expand Down Expand Up @@ -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.
Expand All @@ -57,6 +59,7 @@ pub const OPENDNS_V4: &dyn crate::Resolver<'static> = &Resolver::new_static(
],
DEFAULT_DNS_PORT,
QueryMethod::A,
DNSClass::IN,
);

/// OpenDNS IPv6 DNS resolver options.
Expand All @@ -72,6 +75,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
Expand All @@ -92,6 +96,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
Expand All @@ -111,6 +116,42 @@ pub const GOOGLE_V6: &dyn crate::Resolver<'static> = &Resolver::new_static(
],
DEFAULT_DNS_PORT,
QueryMethod::TXT,
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,
);

///////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -172,11 +213,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<N, S>(name: N, servers: S, port: u16, method: QueryMethod) -> Self
pub fn new<N, S>(name: N, servers: S, port: u16, method: QueryMethod, class: DNSClass) -> Self
where
N: Into<Cow<'r, str>>,
S: Into<Cow<'r, [IpAddr]>>,
Expand All @@ -186,6 +228,7 @@ impl<'r> Resolver<'r> {
name: name.into(),
servers: servers.into(),
method,
class,
}
}
}
Expand All @@ -198,12 +241,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,
}
}
}
Expand Down Expand Up @@ -231,7 +276,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,
Expand Down
Loading