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

hickory-client

Hickory DNS是一个安全可靠的DNS库。这是支持DNSSEC的客户端库。支持带有NSEC验证的负记录的DNSSEC,功能完善。客户端支持使用SIG0进行身份验证的动态DNS请求,实现了易于使用的高级功能。Hickory DNS基于Tokio和Futures库,这意味着它应该很容易集成到使用这些库的其他软件中。

5个不稳定版本

0.25.0-alpha.22024年8月6日
0.25.0-alpha.12024年6月16日
0.24.1 2024年4月18日
0.24.0 2023年10月14日
0.1.0 2023年9月26日

#66 in 网络编程

Download history 3006/week @ 2024-05-03 4017/week @ 2024-05-10 2209/week @ 2024-05-17 3379/week @ 2024-05-24 2886/week @ 2024-05-31 2930/week @ 2024-06-07 3131/week @ 2024-06-14 3415/week @ 2024-06-21 2542/week @ 2024-06-28 2693/week @ 2024-07-05 3146/week @ 2024-07-12 4701/week @ 2024-07-19 4552/week @ 2024-07-26 3135/week @ 2024-08-02 3330/week @ 2024-08-09 6471/week @ 2024-08-16

18,684每月下载量
用于19个crate(14个直接使用)

MIT/Apache

2MB
31K SLoC

概述

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

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

注意 此项目从Trust-DNS更改为Hickory DNS,并已移动到https://github.com/hickory-dns/hickory-dns组织和个人仓库,该crate/二进制文件已从版本0.24及以后移动到hickory-client,有关先前版本请参阅trust-dns-client

特性

客户端支持DNSSEC验证,并提供执行DNS操作的高级函数。

示例

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

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

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

DNSSEC状态

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

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