1 个不稳定版本
0.0.0 | 2020年4月10日 |
---|
2KB
Hickory DNS
一个基于Rust的DNS客户端、服务器和解析器,从头到尾设计为安全可靠。
本仓库包含多个crate
注意 此项目已从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-tls
、openssl
或rustls
(目前仅支持rustls
用于DoH)。解析器只需要在系统中注册有效的DoT或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
。
实现的RFC
- RFC 8499:不再有主/从关系,以纪念Juneteenth
基本操作
- 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-rustls
、dns-over-native-tls
或dns-over-openssl
) - RFC DoH:DNS over HTTPS,DoH(功能:
dns-over-https-rustls
)
进行中或尚未实施的 RFC
基本操作
- RFC 2317:无类 IN-ADDR.ARPA 委托
更新操作
安全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 目录运行,例如
client
或server
,然后运行cargo test
just default
-
默认功能测试
Hickory DNS 有许多功能,要快速测试它们,有三种支持的目标,
default
、no-default-features
和all-features
just all-features
-
单独的功能测试
Hickory DNS 有许多功能,每个单独的功能都可以独立测试,请参阅各个 crate 了解所有功能,以下是一个不一定是最新的列表:
dns-over-rustls
、dns-over-https-rustls
、dns-over-native-tls
、dns-over-openssl
、dns-dnssec-openssl
、dns-dnssec-openssl
、dns-dnssec-ring
、mdns
。每个功能都可以作为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版,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- 麻省理工学院许可证(LICENSE-MIT 或 https://opensource.org/licenses/MIT)
根据您的选择。
贡献
除非您明确表示,否则根据 Apache-2.0 许可证定义,您有意提交以包含在工作中的任何贡献,将按上述方式双重许可,不附加任何额外条款或条件。