hickory-dns/hickory-dns
GitHub: hickory-dns/hickory-dns
Hickory DNS 是一个基于 Rust 编写的 DNS 客户端、服务器及解析器库,致力于提供安全、高性能且符合现代标准的 DNS 服务。
Stars: 5126 | Forks: 573
[](https://github.com/hickory-dns/hickory-dns/actions?query=workflow%3Atest)
[](https://codecov.io/gh/hickory-dns/hickory-dns)
[](LICENSE-MIT)
[](LICENSE-APACHE)
[](https://discord.gg/89nxE4n)
)
- MIT license ([LICENSE-MIT](LICENSE-MIT) 或 )
由您选择。
### 贡献
除非您明确说明,否则您按照 Apache-2.0 许可证定义有意提交
以包含在本作品中的任何贡献,均将按上述方式双重许可,而不附加任何额外条款或
条件。

# Hickory DNS
一个基于 Rust 的 DNS 客户端、服务器和解析器,从底层开始构建,
致力于安全可靠。
此代码仓库由多个 crate 组成:
| 库 | 描述 |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [**Hickory DNS**](bin/) | [](https://crates.io/crates/hickory-dns) 提供 `hickory-dns` 二进制文件用于运行 DNS 服务器。 |
| [**Proto**](crates/proto/) | [](https://crates.io/crates/hickory-proto) [](https://docs.rs/hickory-proto) 底层 DNS 库,包括消息编码/解码和 DNS 传输。 |
| [**Client**](crates/client/) | [](https://crates.io/crates/hickory-client) [](https://docs.rs/hickory-client) 用于直接向 DNS 服务器发送 `query`、`update` 和 `notify` 消息。 |
| [**Server**](crates/server/) | [](https://crates.io/crates/hickory-server) [](https://docs.rs/hickory-server) 用于构建 DNS 服务器。`hickory-dns` 二进制文件使用了此库。 |
| [**Resolver**](crates/resolver/) | [](https://crates.io/crates/hickory-resolver) [](https://docs.rs/hickory-resolver) 利用客户端库执行 DNS 解析。可用作标准操作系统解析设施的替代方案。 |
| [**Recursor**](crates/recursor/) | [](https://crates.io/crates/hickory-recursor) [](https://docs.rs/hickory-recursor) 执行递归 DNS 解析,从权威名称服务器查找记录。 |
**注意** 本项目已从 Trust-DNS 品牌重塑为 Hickory DNS,并已迁移至 https://github.com/hickory-dns/hickory-dns 组织和仓库。
# 目标
- 构建一个具有现代功能的安全可靠的 DNS 服务器和客户端。
- 没有崩溃(panic),所有代码都受到保护。
- 仅使用安全的 Rust,并通过适当的错误处理避免所有崩溃。
- 仅使用稳定版本的 Rust。
- 防护 DDOS 攻击(在一定程度上)。
- 支持全局负载均衡功能的选项。
- 使其操作极其简单。
# 密码学提供者
`hickory-dns` 应用程序和底层库 crate 支持在两个密码学提供者之间进行选择,
用于需要密码学的协议(DNSSEC, DNS-over-TLS 等):
1. [aws-lc-rs]
2. [ring]
需要密码学的功能标志以后缀形式标明所选的提供者。例如,
对于 DNS-over-TLS,该功能根据您希望使用
`aws-lc-rs` 还是 `ring`,分别提供为 `tls-aws-lc-rs` 或 `tls-ring`。
# 状态
## DNSSEC 状态
当前根密钥已打包到系统中,并默认使用。这提供了
对 DNSKEY 和 DS 记录回溯到根的验证。NSEC 和 NSEC3 已
实现。
通过动态 DNS 更新记录时,Zone 将自动重新签名。要启用 DNSSEC,请启用 `dnssec-ring` 功能。
目前不支持记录/Zone 的离线签名。
## 已实现的 RFC
- [RFC 8499](https://tools.ietf.org/html/rfc8499): 不再使用主/从(master/slave)术语,以纪念 [Juneteenth](https://en.wikipedia.org/wiki/Juneteenth)
### 基本操作
- [RFC 1035](https://tools.ietf.org/html/rfc1035): 基础 DNS 规范(请参阅 Resolver 以了解缓存)
- [RFC 2308](https://tools.ietf.org/html/rfc2308): DNS 查询的否定缓存(请参阅 Resolver)
- [RFC 2782](https://tools.ietf.org/html/rfc2782): 服务位置
- [RFC 3596](https://tools.ietf.org/html/rfc3596): IPv6
- [RFC 6891](https://tools.ietf.org/html/rfc6891): DNS 扩展机制
- [RFC 6761](https://tools.ietf.org/html/rfc6761): 特殊用途域名(resolver)
- [RFC 6762](https://tools.ietf.org/html/rfc6762): mDNS 多播 DNS(实验性功能:`mdns`)
- [RFC 6763](https://tools.ietf.org/html/rfc6763): DNS-SD 服务发现(实验性功能:`mdns`)
- [draft-ietf-dnsop-aname](https://tools.ietf.org/html/draft-ietf-dnsop-aname-04): 地址特定的 DNS 别名(`ANAME`)
### 更新操作
- [RFC 2136](https://tools.ietf.org/html/rfc2136): 动态更新
- [RFC 7477](https://tools.ietf.org/html/rfc7477): DNS 中的从子到父同步
### 安全 DNS 操作
- [RFC 2931](https://datatracker.ietf.org/doc/html/rfc2931): SIG(0)
- [RFC 3007](https://tools.ietf.org/html/rfc3007): 安全动态更新
- [RFC 4034](https://tools.ietf.org/html/rfc4034): DNSSEC 资源记录
- [RFC 4035](https://tools.ietf.org/html/rfc4035): DNSSEC 的协议修改
- [RFC 4509](https://tools.ietf.org/html/rfc4509): DNSSEC 委派签名者中的 SHA-256
- [RFC 5155](https://tools.ietf.org/html/rfc5155): DNSSEC 哈希认证拒绝存在
- [RFC 5702](https://tools.ietf.org/html/rfc5702): DNSSEC 中 DNSKEY 和 RRSIG 使用 RSA 的 SHA-2 算法
- [RFC 6844](https://tools.ietf.org/html/rfc6844): DNS 证书颁发机构授权 (CAA) 资源记录
- [RFC 6698](https://tools.ietf.org/html/rfc6698): 基于 DNS 的命名实体认证 (DANE) 传输层安全 (TLS) 协议:TLSA
- [RFC 6840](https://tools.ietf.org/html/rfc6840): DNSSEC 的说明和实现注意事项
- [RFC 6844](https://tools.ietf.org/html/rfc6844): DNS 证书颁发机构授权资源记录
- [RFC 6944](https://tools.ietf.org/html/rfc6944): DNSKEY 算法实现状态
- [RFC 6975](https://tools.ietf.org/html/rfc6975): 密码算法理解信令
- [RFC 7858](https://tools.ietf.org/html/rfc7858): DNS over TLS(功能:`tls-aws-lc-rs`/`tls-ring`)
- [RFC 8162](https://tools.ietf.org/html/rfc8162): 使用安全 DNS 将证书与 S/MIME 的域名关联
- [RFC 8484](https://tools.ietf.org/html/rfc8484): DNS over HTTPS,DoH(功能:`https-aws-lc-rs`/`https-ring`)
## 进行中或尚未实现的 RFC
### 基本操作
- [RFC 2317](https://tools.ietf.org/html/rfc2317): 无类别 IN-ADDR.ARPA 委派
### 更新操作
- [RFC 1995](https://tools.ietf.org/html/rfc1995): 增量区域传输
- [RFC 1996](https://tools.ietf.org/html/rfc1996): 通知辅助服务器更新
- [更新租约](https://tools.ietf.org/html/draft-sekar-dns-ul-01): 动态 DNS 更新租约
- [RFC 8764](https://tools.ietf.org/html/rfc8764): 带通知的 Notify with bells
### 安全 DNS 操作
- [DNSCrypt](https://dnscrypt.org): 受信任的 DNS 查询
- [RFC 8162](https://tools.ietf.org/html/rfc8162): S/MIME 的域名
## 测试
Hickory DNS 使用 `just` 进行构建工作流管理。虽然在项目根目录运行 `cargo test` 可以工作,但这并不全面。通过 `cargo install just` 安装 `just`。一些 `just` 配方需要安装 [`cargo-workspaces`](https://github.com/pksunkara/cargo-workspaces),这是一个优化 cargo 工作区工作流的插件。通过 `cargo install cargo-workspaces` 安装该插件。
- 默认测试
这些适合在本地系统上运行。它们将为本地测试创建套接字,但不会尝试访问远程系统。测试也可以从 crate 目录运行,例如 `client` 或 `server` 以及 `cargo test`
```
just default
```
- 默认功能测试
Hickory DNS 有很多功能,为了快速测试有这些功能或没有这些功能,支持三个目标,`default`、`no-default-features`、`all-features`:
```
just all-features
```
- 单个功能测试
Hickory DNS 有很多功能,每个单独的功能都可以独立测试。有关所有功能,请参阅各个 crate。
每个功能都可以通过 `just` 的任务目标与自身一起测试:
```
just tls-aws-lc-rs
```
- 基准测试
等待基准测试在 Rust 主线中稳定。
## 构建
- 生产构建,从 `hickory-dns` 基础目录,要获取所有功能,只需传递 `--all-features` 标志。
```
cargo build --release -p hickory-dns
```
## 使用 hickory-resolver CLI
在 `0.20` 版本中可用
```
cargo install --bin resolve hickory-util
```
或者从源码,在 hickory-dns 目录中
```
cargo install --bin resolve --path 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.215.14
```
## Docker 使用
包含预编译版本的 `hickory-dns` 的 Docker 镜像可在 https://github.com/hickory-dns/docker 获取。
## FAQ
- **为什么要构建另一个 DNS 服务器?**
为了提供用内存安全语言编写的 DNS 服务器。
使用 Rust 语义,应该可以开发出高性能且安全的 DNS 服务器,使其更能抵御攻击。
- **MSRV(最低稳定 Rust 版本)策略是什么?**
Hickory DNS 将致力于支持向后兼容三个 Rust 版本。
例如,如果 `1.50` 是当前版本,那么 MSRV 将是 `1.47`。该版本仅在必要时增加,因此 MSRV 可能比此策略规定的更旧。此外,由于在依赖项上强制执行此策略是一个棘手的问题,因此 MSRV 仅支持 `no-default-features` 构建。
## 社区
如需超出此仓库范围的实时讨论,请参阅此 [Discord](https://discord.gg/89nxE4n)。
## 许可证
在以下任一许可下许可
- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) 或 标签:Apache协议, DNS, DNS协议, DNS客户端, DNS服务端, DNS解析, Hickory DNS, MIT协议, Rust, SYN扫描, 可视化界面, 域名解析, 开源项目, 网络安全, 网络流量审计, 网络编程, 解析器, 请求拦截, 通知系统, 隐私保护