5个不稳定版本
0.25.0-alpha.2 | 2024年8月6日 |
---|---|
0.25.0-alpha.1 | 2024年6月16日 |
0.24.1 | 2024年4月18日 |
0.24.0 | 2023年10月14日 |
0.1.0 | 2023年9月26日 |
#66 in 网络编程
18,684每月下载量
用于19个crate(14个直接使用)
2MB
31K SLoC
概述
Hickory DNS是一个实现DNS协议和客户端功能的库。
该库包含DNS记录序列化和通信的基本实现。它能够执行query
、update
和notify
操作。《update》操作已被证明与《BIND9》和《SIG0》签名记录兼容。《update》操作。它建立在tokio异步I/O项目之上,这使得它能够集成到使用tokio和futures库的其他系统中。Hickory DNS 项目还包含其他DNS库:一个用于查找的解析库、一个用于托管区域的服务器库,以及基于rustls和native-tls的TLS实现变体。
注意 此项目从Trust-DNS更改为Hickory DNS,并已移动到https://github.com/hickory-dns/hickory-dns组织和个人仓库,该crate/二进制文件已从版本0.24及以后移动到hickory-client,有关先前版本请参阅trust-dns-client。
特性
客户端支持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 hickory_client::client::{Client, SyncClient};
use hickory_client::udp::UdpClientConnection;
use hickory_client::op::DnsResponse;
use hickory_client::rr::{rdata::A, 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 hickory_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(A(ref ip))) = answers[0].data() {
assert_eq!(*ip, Ipv4Addr::new(93, 184, 215, 14))
} 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》,用于DoH的
dns-over-https-rustls
。
DNSSEC状态
当前将根密钥硬编码到系统中。这为DNSKEY和DS记录提供了对根的验证。实现了NSEC,但没有实现NSEC3。由于尚未启用缓存,已注意到一些DNS服务器似乎对连接实施速率限制,验证返回根的RRSIG记录可能需要对这些记录进行大量额外的查询。
通过动态DNS对任何记录更新自动重新签名区域。要启用DNSSEC,必须启用以下功能之一:dnssec-openssl
或dnssec-ring
。
最低Rust版本
此项目的当前最低rustc版本为1.70
版本控制
Hickory DNS尽力遵循semver。当公开的API稳定时,Hickory DNS将被提升到1.0版本。这并不意味着Hickory DNS在0.x更新之间的升级过程中一定会破坏。尽可能,旧API将带注释弃用,说明什么替代了这些弃用。Hickory DNS将尽力确保由于API更改而不会破坏依赖于它的软件,尽管这不能保证。弃用的接口将在弃用后至少维护一个主要版本(尽可能),但在升级到1.0时,所有弃用的接口都将计划移除。
依赖关系
~6–19MB
~303K SLoC