37个版本
0.23.2 | 2023年10月23日 |
---|---|
0.23.0 | 2023年8月22日 |
0.23.0-alpha.4 | 2023年6月11日 |
0.22.0 | 2022年9月2日 |
0.18.0-alpha.1 | 2019年10月27日 |
#2054 in 网络编程
42,447 每月下载量
在 少于 33 个 包中使用
2MB
29K SLoC
注意 该项目已更名为Hickory DNS,并已转移到 https://github.com/hickory-dns/hickory-dns 组织和仓库,此包/二进制文件已转移到 hickory-client,从 0.24
版本开始。
概览
Trust-DNS是一个实现了DNS协议和客户端功能的库。
该库包含DNS记录序列化和通信的基本实现。它能够执行查询
、更新
和通知
操作。更新
已被证明与BIND9
和SIG0
签名的更新记录兼容。它建立在tokio异步I/O项目之上,这使得它可以集成到使用tokio和futures库的其他系统中。Trust-DNS 项目包含其他DNS库:一个用于查找的解析库、一个用于托管区域的服务器库,以及基于rustls和native-tls的TLS实现变体。
功能
客户端
能够进行DNSSEC验证,并提供用于执行DNS操作的高级函数
- SyncDnssecClient - DNSSEC验证
- create - 使用认证请求原子地创建记录
- append - 验证记录是否存在并将其附加到它
- compare_and_swap - 原子比较和交换(取决于服务器)
- delete_by_rdata - 删除特定记录
- delete_rrset - 删除整个记录集
- delete_all - 删除给定名称的所有记录集
- notify - 通知服务器它应该重新加载区域
示例
use std::net::Ipv4Addr;
use std::str::FromStr;
use trust_dns_client::client::{Client, SyncClient};
use trust_dns_client::udp::UdpClientConnection;
use trust_dns_client::op::DnsResponse;
use trust_dns_client::rr::{DNSClass, Name, RData, Record, RecordType};
let address = "8.8.8.8:53".parse().unwrap();
let conn = UdpClientConnection::new(address).unwrap();
let client = SyncClient::new(conn);
// Specify the name, note the final '.' which specifies it's an FQDN
let name = Name::from_str("www.example.com.").unwrap();
// NOTE: see 'Setup a connection' example above
// Send the query and get a message response, see RecordType for all supported options
let response: DnsResponse = client.query(&name, DNSClass::IN, RecordType::A).unwrap();
// Messages are the packets sent between client and server in DNS, DnsResonse's can be
// dereferenced to a Message. There are many fields to a Message, It's beyond the scope
// of these examples to explain them. See trust_dns::op::message::Message for more details.
// generally we will be interested in the Message::answers
let answers: &[Record] = response.answers();
// Records are generic objects which can contain any data.
// In order to access it we need to first check what type of record it is
// In this case we are interested in A, IPv4 address
if let Some(RData::A(ref ip)) = answers[0].data() {
assert_eq!(*ip, Ipv4Addr::new(93, 184, 216, 34))
} else {
assert!(false, "unexpected result")
}
DNS-over-TLS 和 DNS-over-HTTPS
支持 DoT 和 DoH。这是通过使用 native-tls
、openssl
或 rustls
(目前仅支持 rustls
用于 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。
DNSSEC 状态
当前根密钥被硬编码到系统中。这允许将 DNSKEY 和 DS 记录的验证回溯到根。实现了 NSEC,但没有实现 NSEC3。由于尚未启用缓存,已经注意到一些 DNS 服务器似乎对连接进行速率限制,验证 RRSIG 记录回溯到根可能需要针对这些记录进行大量额外的查询。
区域将在通过动态 DNS 的任何记录更新时自动重新签名。要启用 DNSSEC,必须启用以下功能之一:dnssec-openssl
或 dnssec-ring
。
最低 Rust 版本
此项目当前最低的 rustc 版本是 1.64
版本控制
Trust-DNS 尽力遵循 semver。Trust-DNS 将在公开的 API 稳定后提升到 1.0。这并不意味着 Trust-DNS 在 0.x 更新之间升级时一定会破坏。尽可能,旧 API 将会过时,并附上有关替代这些过时 API 的说明。Trust-DNS 将尽力确保不会因为 API 变更而破坏依赖它的软件,尽管这不能保证。过时的接口将在它们被弃用后至少维护一个主要版本(如果可能),但升级到 1.0 的除外,其中所有过时接口都计划被移除。
依赖项
~5–20MB
~316K SLoC