1 个不稳定版本

0.0.0 2020年4月10日

MIT/Apache

2KB

minimum rustc: 1.67 Build Status codecov License: MIT License: Apache 2.0 Discord

Hickory DNS

Hickory DNS

一个基于Rust的DNS客户端、服务器和解析器,从头到尾设计为安全可靠。

本仓库包含多个crate

描述
Hickory DNS 运行DNS权威服务器的二进制文件。
协议 hickory-proto 原始DNS库,暴露了不稳定的API,仅适用于其他Hickory DNS库,不面向最终用户使用。
客户端 hickory-client 用于直接向DNS服务器发送 queryupdatenotify 消息。
服务器 hickory-server 用于托管DNS记录,此版本还包含一个 hickory-dns 二进制文件,用于以守护进程形式运行。
解析器 hickory-resolver 利用客户端库执行DNS解析。可替代标准操作系统解析工具。

注意 此项目已从Trust-DNS更名至Hickory DNS,并已迁移到 https://github.com/hickory-dns/hickory-dns 组织和仓库。

目标

  • 构建具有现代功能的可靠和安全DNS服务器和客户端。
  • 无恐慌,所有代码受保护
  • 仅使用安全的Rust,并通过适当的错误处理避免所有恐慌
  • 仅使用稳定的Rust
  • 保护免受DDOS攻击(在一定程度上)
  • 支持全球负载均衡功能选项
  • 使其操作极为简单

状态

解析器

赫克托里DNS解析器是Rust应用程序中本地stub解析的Rust实现。解析器支持许多常见的查询模式,所有这些模式都可以在创建解析器时进行配置。它能够在Unix和Windows上使用系统配置。在Windows上,有一个已知问题,即注册了大量的接口以供使用,因此可能需要忽略系统配置。

解析器将正确地跟随CNAME链以及SRV记录的查找。有一个长期计划使解析器能够执行完全递归查询,但目前尚不可行。

客户端

赫克托里DNS客户端旨在直接针对DNS服务器进行操作。它可以用于验证记录或更新支持SIG0和动态更新的服务器上的记录。客户端还可以验证DNSSEC。截至目前,尚不支持NSEC3验证,尽管支持NSEC。有两个接口可以使用,一个是与async/await兼容的AsyncClient,另一个是用于易用的阻塞式Client。今天,需要Tokio作为执行器Runtime。

独特的客户端实现

这些都是DNS协议支持的标准。客户端将它们实现为高级接口,这在一定程度上较为罕见。

功能 描述
SyncDnssecClient DNSSEC验证
创建 带认证请求的原子记录创建
追加 验证记录的存在并将其追加到记录中
compare_and_swap 原子(取决于服务器)compare and swap
delete_by_rdata 删除特定记录
delete_rrset 删除整个记录集
delete_all 删除具有给定名称的所有记录集
通知 通知服务器应重新加载区域

服务器

服务器代码已完成,守护程序支持IPv4和IPv6,UDP和TCP。目前尚无法限制TCP和AXFR操作,因此不建议将其投入生产,因为TCP可用于对服务进行DOS攻击。区域文件解析已完成并受支持。目前没有分叉选项,服务器尚未线程化(尽管它使用异步IO实现,因此线程可能不是巨大的好处)。在将服务器与外部安全地结合使用之前,还有大量工作要做。在私有网络上在防火墙后面运行它是安全的。

区域签名支持已完成,要插入密钥存储,请将pem编码的rsa文件放在初始区域文件的同一目录中,并具有.key后缀。 注意:这必须只能由当前用户读取。如果不存在,则将创建并写入正确位置。这也作为动态更新SIG(0)验证的初始密钥。要获取公钥,可以查询区域的DNSKEY记录。这需要提供给其他上游服务器以创建DS密钥。动态DNS也已完成,如果启用,则与区域文件并列的日记文件将存储带有jrnl后缀的文件。 注意:如果密钥已更改或更新,目前操作员负责从区域中删除唯一的公钥,这允许DNSKEY在密钥旋转期间存在一段时间。目前无法在线旋转密钥,需要重启服务器进程。

服务器上的DNS-over-TLS和DNS-over-HTTPS

服务器上的TLS通过pkcs12 der文件管理。文档记录在示例测试配置文件中,example.toml。已注册的证书可以与客户端的add_ca()方法固定。或者,因为客户端使用rust-native-tls库,所以它应该可以与由任何标准CA签名的证书一起使用。

DNS-over-TLS和DNS-over-HTTPS

支持DoT和DoH。这是通过使用以下之一实现的:native-tlsopensslrustls(目前仅支持rustls用于DoH)。解析器只需要在系统中注册有效的DoT或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

实现的RFC

基本操作

  • RFC 1035:基本DNS规范(参见解析器的缓存)
  • RFC 2308:DNS查询的负缓存(参见解析器)
  • RFC 2782:服务位置
  • RFC 3596:IPv6
  • RFC 6891:DNS扩展机制
  • RFC 6761:特殊用途域名(解析器)
  • RFC 6762:mDNS多播DNS(实验性功能:mdns
  • RFC 6763:DNS-SD服务发现(实验性功能:mdns
  • RFC ANAME:地址特定的DNS别名(ANAME

更新操作

安全DNS操作

  • RFC 3007:安全动态更新
  • RFC 4034:DNSSEC资源记录
  • RFC 4035:DNSSEC的协议修改
  • RFC 4509:DNSSEC委托签名者中的SHA-256
  • RFC 5702:DNSKEY和RRSIG中的RSA SHA-2算法用于DNSSEC
  • RFC 6844:DNS认证授权机构(CAA)资源记录
  • RFC 6698:基于DNS的命名实体身份验证(DANE)传输层安全性(TLS)协议:TLSA
  • RFC 6840:DNSSEC的澄清和实施说明
  • RFC 6844:DNS 认证机构授权资源记录
  • RFC 6944:DNSKEY 算法实现状态
  • RFC 6975:信号加密算法理解
  • RFC 7858:DNS over TLS(功能:dns-over-rustlsdns-over-native-tlsdns-over-openssl
  • RFC DoH:DNS over HTTPS,DoH(功能:dns-over-https-rustls

进行中或尚未实施的 RFC

基本操作

更新操作

安全DNS操作

用法

这假设您已安装 Rust 稳定版。这些假设 hickory-dns 仓库已同步到本地系统

git clone https://github.com/hickory-dns/hickory-dns.git
cd hickory-dns

先决条件

最小 Rust 版本

  • 此项目当前的最小 rustc 版本是 1.67
  • OpenSSL 开发库(客户端和解析器中为可选,最小版本 1.0.2)

Mac OS X:使用 homebrew

  brew install openssl
  export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include
  export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib

基于 Debian 的(包括 Ubuntu 和 Raspbian):使用 apt-get

  # note for openssl that a minimum version of 1.0.2 is required for TLS,
  #  if this is an issue, TLS can be disabled (on the client), see below.
  $ apt-get install openssl
  $ apt-get install libssl-dev pkg-config

测试

Hickory DNS 使用 just 进行构建工作流程管理。在项目根目录运行 cargo test 将会起作用,但这并不全面。请使用 cargo install just 安装 just

  • 默认测试

    这些适用于在本地系统上运行。它们将为本地测试创建套接字,但不会尝试访问远程系统。测试也可以从 crate 目录运行,例如 clientserver,然后运行 cargo test

just default
  • 默认功能测试

    Hickory DNS 有许多功能,要快速测试它们,有三种支持的目标,defaultno-default-featuresall-features

just all-features
  • 单独的功能测试

    Hickory DNS 有许多功能,每个单独的功能都可以独立测试,请参阅各个 crate 了解所有功能,以下是一个不一定是最新的列表:dns-over-rustlsdns-over-https-rustlsdns-over-native-tlsdns-over-openssldns-dnssec-openssldns-dnssec-openssldns-dnssec-ringmdns。每个功能都可以作为 just 的任务目标进行测试

just dns-over-https-rustls
  • 基准测试

    等待基准测试在主线 Rust 中稳定。

构建

  • 生产构建,从 hickory-dns 基础目录开始,要获取所有功能,只需传递 --all-features 标志。
cargo build --release -p hickory-dns

运行中

警告:Hickory DNS仍处于开发阶段,不建议在生产环境中运行。服务器目前仅单线程,它是非阻塞的,因此应该能够处理大多数内部负载。

  • 验证版本
./target/release/hickory-dns --version
  • 获取帮助
./target/release/hickory-dns --help
  • 使用测试配置启动hickory-dns服务器

您可能不需要传递-p参数,这将在默认DNS端口上运行。对于TLS功能,也有相应的端口选项,请参阅hickory-dns --help

./target/release/hickory-dns -c ./tests/test-data/test_configs/example.toml -z ./tests/test-data/test_configs/ -p 24141
  • 使用dig查询刚刚启动的服务器
dig @127.0.0.1 -p 24141 www.example.com

使用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.216.34

作为依赖项和使用自定义功能

客户端有一些功能,当嵌入到其他软件中时,可能因不同原因而被禁用。

  • dnssec-openssl 这是一个默认功能,因此需要将默认功能设置为false(这将禁用hickory-dns中的所有其他默认功能)。由于目前没有其他加密库得到支持,这还将禁用DNSSEC验证。函数仍然存在,但在验证时总是返回错误。下面的示例行将禁用所有默认功能并启用OpenSSL,移除"openssl"以移除对OpenSSL的依赖。

  • dnssec-ring 环支持可用于RSA和ED25519 DNSSEC验证。

  • dns-over-native-tls 使用native-tls进行DNS-over-TLS实现,仅在客户端和解析器中支持,不支持服务器。

  • dns-over-openssl 使用openssl进行DNS-over-TLS实现,在服务器和客户端中支持,解析器没有默认CA链。

  • dns-over-rustls 使用rustls进行DNS-over-TLS实现,仅在客户端和解析器中支持,不支持服务器。这是在需要纯Rust工具链时的最佳选项。在客户端、解析器和服务器中支持。

  • dns-over-https-rustls 使用rustls进行DNS-over-HTTPS(DNS-over-TLS也将启用)实现,仅在客户端、解析器和服务器中支持。这是在需要纯Rust工具链时的最佳选项。

  • mdns 实验性 启用实验性mDNS功能以及DNS-SD。目前存在已知问题。

在依赖项中使用自定义功能

[dependencies]
  ...
hickory-dns = { version = "*", default-features = false, features = ["dnssec-openssl"] }

在构建期间使用自定义功能

$> cargo build --release --features dns-over-rustls
...

常见问题解答

  • 为什么你们要构建另一个DNS服务器?

    Because of all the security advisories out there for BIND.
    

    使用Rust语义,应该能够开发出高性能且安全的DNS服务器,它对攻击具有更强的抵抗力。

  • MSRV(最低稳定Rust版本)策略是什么?

    Hickory DNS will work to support backward compatibility with three Rust versions.
    

    例如,如果当前版本是1.50,则MSRV将是1.47。版本只有在必要时才会增加,因此MSRV可能比本策略中所述的更老。此外,由于在依赖项上强制执行此策略是一个棘手的问题,因此MSRV仅支持no-default-features构建。

社区

有关超出此存储库的实时讨论,请参阅此Discord

许可证

许可协议为以下之一

根据您的选择。

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义,您有意提交以包含在工作中的任何贡献,将按上述方式双重许可,不附加任何额外条款或条件。

无运行时依赖