#dns-resolver #dns #dns-client #dns-resolution #dns-server #dns-queries #dns-query

trust-dns-resolver

Trust-DNS是一个安全可靠的DNS库。此Resolver库使用Client库执行所有DNS查询。Resolver旨在成为任何DNS记录解析的高级库(参见Resolver和AsyncResolver以获取支持的解析类型)。Client可用于其他查询。

61个版本

0.23.2 2023年10月23日
0.23.0 2023年8月22日
0.23.0-alpha.42023年6月11日
0.22.0 2022年9月2日
0.2.0 2017年7月7日

#985 in 网络编程

Download history 241141/week @ 2024-04-29 217737/week @ 2024-05-06 257302/week @ 2024-05-13 274245/week @ 2024-05-20 259228/week @ 2024-05-27 271683/week @ 2024-06-03 277881/week @ 2024-06-10 244840/week @ 2024-06-17 256130/week @ 2024-06-24 218841/week @ 2024-07-01 250693/week @ 2024-07-08 246533/week @ 2024-07-15 248167/week @ 2024-07-22 237948/week @ 2024-07-29 245606/week @ 2024-08-05 282925/week @ 2024-08-12

1,021,595每月下载量
用于1,077个crate(178直接)

MIT/Apache

2MB
34K SLoC

注意 此项目已更名为Hickory DNS,并已移动到 https://github.com/hickory-dns/hickory-dns 组织和仓库,此crate/二进制文件已移动到 hickory-resolver,从 0.24 版本起。

概述

Trust-DNS Resolver是一个库,它使用Trust-DNS Proto库实现DNS解析器。

此库包含IPv4(A)和IPv6(AAAA)解析的实现,更多功能正在开发中。它建立在tokio异步I/O项目之上,这使得它可以通过tokio和futures库集成到其他系统中。Trust-DNS 项目包含其他DNS库:用于原始协议使用的客户端库,用于托管区域的服务器库,以及基于rustlsnative-tls的TLS实现。

功能

  • 各种IPv4和IPv6查找策略
  • 基于Unix/Posix系统的/etc/resolv.conf配置
  • 基于性能的优先级使用的NameServer池
  • 查询结果的缓存
  • NxDomain/NoData缓存(负缓存)
  • DNSSEC验证
  • 通用记录类型查找
  • CNAME链解析
  • 实验性 mDNS支持(使用mdns功能启用)
  • DNS over TLS(利用native-tlsrustlsopenssl;建议使用native-tlsrustls
  • DNS over HTTPS(目前仅支持rustls

示例

use std::net::*;
use trust_dns_resolver::Resolver;
use trust_dns_resolver::config::*;

// Construct a new Resolver with default configuration options
let mut resolver = Resolver::new(ResolverConfig::default(), ResolverOpts::default()).unwrap();

// On Unix/Posix systems, this will read the /etc/resolv.conf
// let mut resolver = Resolver::from_system_conf().unwrap();

// Lookup the IP addresses associated with a name.
let mut response = resolver.lookup_ip("www.example.com.").unwrap();

// There can be many addresses associated with the name,
//  this can return IPv4 and/or IPv6 addresses
let address = response.iter().next().expect("no addresses returned!");
if address.is_ipv4() {
    assert_eq!(address, IpAddr::V4(Ipv4Addr::new(93, 184, 216, 34)));
} else {
    assert_eq!(address, IpAddr::V6(Ipv6Addr::new(0x2606, 0x2800, 0x220, 0x1, 0x248, 0x1893, 0x25c8, 0x1946)));
}

DNS-over-TLS 和 DNS-over-HTTPS

支持DoT和DoH。这是通过使用以下之一实现的:`native-tls`、`openssl` 或 `rustls`(目前仅支持 `rustls` 用于DoH)。解析器只需要注册有效的DoT或DoH解析器才能使用。

要与 `Client` 一起使用,应使用 `TlsClientConnection` 或 `HttpsClientConnection`。同样,要使用tokio的 `AsyncClient`,应使用 `TlsClientStream` 或 `HttpsClientStream`。目前不支持ClientAuth、mTLS,还有一些问题正在解决中。TLS对于服务器身份验证和连接隐私很有用。

要启用DoT,必须启用以下功能之一:`dns-over-native-tls`、`dns-over-openssl` 或 `dns-over-rustls`,`dns-over-https-rustls` 用于DoH。

示例

通过依赖 `trust-dns-resolver` 启用TLS库

trust-dns-resolver = { version = "*", features = ["dns-over-rustls"] }

为Cloudflare的DNS服务(包括Quad9)提供默认TLS配置的版本是 1.1.11

// Construct a new Resolver with default configuration options
let mut resolver = Resolver::new(ResolverConfig::cloudflare_tls(), ResolverOpts::default()).unwrap();

/// see example above...

DNSSEC状态

当前根密钥是硬编码到系统中的。这为DNSKEY和DS记录的验证提供了回根的验证。实现了NSEC,但没有实现NSEC3。由于尚未启用缓存,已注意到一些DNS服务器似乎限制了连接速率,验证RRSIG记录回根可能需要对这些记录进行大量的额外查询。

通过动态DNS对任何记录更新进行重新签名。要启用DNSSEC,必须启用以下功能之一:`dnssec-openssl` 或 `dnssec-ring`。

通过resolve CLI测试解析器

用于通过独立的CLI测试trust-dns-resolver及其功能。

cargo install --bin resolve trust-dns-util

示例

$ resolve www.example.com.
Querying for www.example.com. A from udp:8.8.8.8:53, tcp:8.8.8.8:53, udp:8.8.4.4:53, tcp:8.8.4.4:53, udp:[2001:4860:4860::8888]:53, tcp:[2001:4860:4860::8888]:53, udp:[2001:4860:4860::8844]:53, tcp:[2001:4860:4860::8844]:53
Success for query name: www.example.com. type: A class: IN
        www.example.com. 21063 IN A 93.184.216.34

最小Rust版本

此项目的当前最小rustc版本是 1.64

版本控制

Trust-DNS尽最大努力遵循semver。在公开的API稳定后,Trust-DNS将升级到1.0。这并不意味着Trust-DNS在0.x更新之间升级时一定会破坏。尽可能情况下,旧API将弃用,并注明替换了哪些弃用。Trust-DNS将尽力确保由于API更改而不会破坏依赖于它的软件,尽管不能保证。弃用的接口将在弃用后的至少一个主要版本中保持(尽可能),1.0升级除外,其中所有弃用的接口都将计划删除。

依赖项

~3–19MB
~295K SLoC