Skip to main content

ip_discovery/dns/
providers.rs

1//! Built-in DNS providers
2
3use super::protocol::DnsClass;
4use super::{DnsProvider, DnsRecordType};
5use crate::provider::BoxedBlockingProvider;
6#[cfg(feature = "tokio")]
7use crate::provider::BoxedProvider;
8use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
9
10/// Google DNS o-o.myaddr
11/// Query: o-o.myaddr.l.google.com TXT record via ns1.google.com
12pub fn google() -> DnsProvider {
13    DnsProvider::new(
14        "Google DNS",
15        "o-o.myaddr.l.google.com",
16        SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(216, 239, 32, 10), 53)), // ns1.google.com
17        DnsRecordType::Txt,
18    )
19    .with_v6_resolver(SocketAddr::V6(SocketAddrV6::new(
20        Ipv6Addr::new(0x2001, 0x4860, 0x4802, 0x0032, 0, 0, 0, 0x000a),
21        53,
22        0,
23        0,
24    )))
25}
26
27/// Cloudflare whoami
28/// Query: whoami.cloudflare TXT/CH via 1.1.1.1
29/// Note: This uses DNS class CHAOS (CH), not IN
30pub fn cloudflare() -> DnsProvider {
31    DnsProvider::new(
32        "Cloudflare DNS",
33        "whoami.cloudflare",
34        SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(1, 1, 1, 1), 53)),
35        DnsRecordType::Txt,
36    )
37    .with_class(DnsClass::Ch)
38    .with_v6_resolver(SocketAddr::V6(SocketAddrV6::new(
39        Ipv6Addr::new(0x2606, 0x4700, 0x4700, 0, 0, 0, 0, 0x1111),
40        53,
41        0,
42        0,
43    )))
44}
45
46/// OpenDNS myip service
47/// Query: myip.opendns.com A record via resolver1.opendns.com
48pub fn opendns() -> DnsProvider {
49    DnsProvider::new(
50        "OpenDNS",
51        "myip.opendns.com",
52        SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(208, 67, 222, 222), 53)),
53        DnsRecordType::Address,
54    )
55}
56
57/// List all available DNS provider names
58pub fn provider_names() -> &'static [&'static str] {
59    &["Google DNS", "Cloudflare DNS", "OpenDNS"]
60}
61
62/// Get default blocking DNS providers
63pub fn default_blocking_providers() -> Vec<BoxedBlockingProvider> {
64    vec![
65        Box::new(cloudflare()),
66        Box::new(google()),
67        Box::new(opendns()),
68    ]
69}
70
71/// Get default async DNS providers
72#[cfg(feature = "tokio")]
73pub fn default_providers() -> Vec<BoxedProvider> {
74    vec![
75        Box::new(cloudflare()),
76        Box::new(google()),
77        Box::new(opendns()),
78    ]
79}