#dns #dnssec #bind #dns-records #client-server #dig #named

trust-dns-client

Trust-DNS是一个安全可靠的DNS库。这是带有DNSSEC支持的客户端库。支持DNSSEC和NSEC验证的负记录,功能齐全。客户端支持动态DNS,采用SIG0进行认证请求,实现了易于使用的高级功能。Trust-DNS基于Tokio和Futures库,这意味着它可以轻松地集成到其他使用这些库的软件中。

37个版本

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.18.0-alpha.12019年10月27日

#2054 in 网络编程

Download history 13157/week @ 2024-03-14 13096/week @ 2024-03-21 11288/week @ 2024-03-28 12495/week @ 2024-04-04 13022/week @ 2024-04-11 13637/week @ 2024-04-18 13062/week @ 2024-04-25 12676/week @ 2024-05-02 13629/week @ 2024-05-09 12931/week @ 2024-05-16 11794/week @ 2024-05-23 10873/week @ 2024-05-30 10417/week @ 2024-06-06 10510/week @ 2024-06-13 11490/week @ 2024-06-20 8086/week @ 2024-06-27

42,447 每月下载量
少于 33 个 包中使用

MIT/Apache

2MB
29K SLoC

注意 该项目已更名为Hickory DNS,并已转移到 https://github.com/hickory-dns/hickory-dns 组织和仓库,此包/二进制文件已转移到 hickory-client,从 0.24 版本开始。

概览

Trust-DNS是一个实现了DNS协议和客户端功能的库。

该库包含DNS记录序列化和通信的基本实现。它能够执行查询更新通知操作。更新已被证明与BIND9SIG0签名的更新记录兼容。它建立在tokio异步I/O项目之上,这使得它可以集成到使用tokio和futures库的其他系统中。Trust-DNS 项目包含其他DNS库:一个用于查找的解析库、一个用于托管区域的服务器库,以及基于rustlsnative-tls的TLS实现变体。

功能

客户端能够进行DNSSEC验证,并提供用于执行DNS操作的高级函数

示例

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-tlsopensslrustls(目前仅支持 rustls 用于 DoH)来实现的。

要使用与 Client 一起使用,应使用 TlsClientConnectionHttpsClientConnection。同样,要使用与 tokio AsyncClient 一起使用,应使用 TlsClientStreamHttpsClientStream。目前不支持 ClientAuth、mTLS,还有一些问题仍在解决中。TLS 用于服务器身份验证和连接隐私。

要启用 DoT,必须启用以下功能之一:dns-over-native-tlsdns-over-openssldns-over-rustlsdns-over-https-rustls 用于 DoH。

DNSSEC 状态

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

区域将在通过动态 DNS 的任何记录更新时自动重新签名。要启用 DNSSEC,必须启用以下功能之一:dnssec-openssldnssec-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