1 个不稳定版本

0.0.5 2019年10月11日

#23#dns-client

GPL-3.0-or-later

64KB
1.5K SLoC

tdns

一个 DNS 客户端命令行工具,有希望成为成长后的瑞士军刀。

tdns 希望成长为 nsupdatedig 命令的替代品,这些命令作为 ISC bind 套件的一部分分发,增加了更新传播检查等特性,并提供了一个更方便(更“标准”)的命令行界面。

tdns 使用 Rust 实现,利用了出色的 trust-dns DNS 客户端库,并使用单线程、非阻塞的运行时。用开发者的话来说,这意味着 tdns-udpate 应该非常轻量,即使是面对不合理的巨大任务(如监视由数百个权威域名服务器提供服务的区域中的记录)也能应对自如。

请注意,tdns 目前处于初始开发阶段。常规警告适用。如果您仍然感兴趣,请继续阅读有关当前工作内容和计划的信息。

安装

由于 tdns 使用 Rust 编写,您需要一个 Rust 工具链。需要 Rust 1.37 或更高版本。要从 crates.io 获取最新版本,请使用

cargo install tdns-cli

或者,您可以直接从源代码检出运行

cargo run -- --help

要从本地检出的源安装,请使用 cargo install --path .,这将最终将可执行文件安装到 ~/.cargo/bin/tdns,如果您遵循了 Rust 工具链安装说明,它应该已经存在于您的 PATH 环境变量中。

静态构建

对于部署到 Linux 目标,创建使用 Rust 的 MUSL 目标静态链接的二进制文件是一个不错的选择。这将生成一个完全独立的二进制文件,它只依赖于 Linux 内核的系统调用 ABI。

# If you haven't installed the MUSL target already, let's do that now:
rustup target add x86_64-unknown-linux-musl
# Build against the MUSL libc target
cargo build --target x86_64-unknown-linux-musl --release
# Let's check it's really a static binary
file target/x86_64-unknown-linux-musl/release/tdns \
  | grep -q 'statically linked' || echo "nope"

文档

tdns 及其子命令的文档以 Unix man 页面的形式提供,由 markdown 源文件渲染而成,可以使用 pandoc 转换为 troff 格式,并通过 man 命令查看。请注意,markdown 源文件是为通过 pandoc 生成良好输出而优化的,在 github 或类似平台上渲染效果不佳,也不适合直接阅读。

您可以使用包含的 Makefile 生成 man 页面,并使用 Unix 的 man 命令查看 man 页面

make man
man -l tdns.1
man -l tnds-query.1
man -l tnds-update.1

在运行 make 时也会创建 man 页面的 HTML 渲染版本,这些内容也在线上可用

可用子命令

tdns query

此子命令可以作为 dig +short 的部分替代;计划扩展其功能。

tdns update

一个动态 DNS 更新器和更新检查器,使用 RFC 2136 中描述的机制。

tdns update 更新和/或监控 DNS 区域中的条目。当前更新功能是 ISC BIND 的 nsupdate 工具提供的功能子集,但在单个本地可执行文件中提供更新和监控是新颖的,至少作者认为是如此。毫无疑问,有许多提供类似功能的 shell 脚本,复杂程度各异。《tdns update》旨在正确高效地完成其工作,不采取任何捷径。

使用单个 tnds update 调用,您可以执行 DNS 更新操作,并等待区域中所有权威域名服务器提供更新记录。

缺失的功能

没有这些功能,tdns update 无法可靠地工作,或者可以认为没有正确完成工作

  • 如果没有提供 --resolver 选项,将使用 /etc/resolv.conf 中指定的所有解析器,而不仅仅是第一个。
  • 探测 NS 条目解析的所有地址。
  • IPv6 支持;代码对 IP 地址族大体上是不可知的,但尚未积极开发 IPv6 支持。

计划中的功能

  • 为了成为 nsupdate 的完全替代品,需要一个更详细的描述更新的方式,类似于 nsupdate 的 "脚本";不适应命令行界面更适合更复杂的更新操作。
  • 一旦添加了描述更新的某种类型 DSL 的机制,就很容易在单个运行中允许同时更新多个区域。这种功能在实践中可能不太有用,但谁知道呢...
  • 增加测试套件的测试覆盖率;基础设施和一些基本测试已经存在,但当前的覆盖率相当有限。

示例用例

这是促使开发 tdns update 的场景。

当使用DNS-01 协议从 letsencrypt 获取 TLS 证书时,有必要确保在可以可靠检索后,letsencrypt 才被通知验证挑战。对于辅助 DNS 服务器,可能需要一段时间才能将更新完全部署到所有服务器。tdns update可以作为钩子脚本来部署 letsencrypt 挑战到 DNS。

许可证

版权所有 © 2019 Andreas Rottmann

本程序是自由软件;您可以在自由软件基金会发布的 GNU 通用公共许可证的条款下重新分发和/或修改它;许可证的第3版或(根据您的选择)任何更高版本。

本程序分发时希望它有用,但不提供任何保证;甚至不提供关于适销性适用于特定目的的暗示性保证。有关详细信息,请参阅 GNU 通用公共许可证。

您应该已经随本程序收到一份 GNU 通用公共许可证副本;如果没有,请见https://gnu.ac.cn/licenses

GNU GPL 版本 3 第 7 节的附加许可

如果您通过链接或结合本程序(或任何受保护的作业)与 OpenSSL(或该库的修改版本)来修改本程序或任何受保护的作业,其中包含受 OpenSSL 许可证条款约束的部分,本程序的许可商授予您额外的许可,允许您传达由此产生的工作。此类组合的非源形式的对应源代码应包括用于 OpenSSL 的源代码以及受保护的作业的源代码。

贡献

除非明确指出否则,任何有意提交以包含在本软件包中的贡献

  • 将根据 GNU GPL 版本 3.0 或更高版本以及上述附加许可进行许可。
  • 贡献者还授予软件包维护者重新许可软件包的部分或全部代码(包括贡献)的权利,包括双重 MIT/Apache-2.0 许可。这项规定适用于软件包的某些代码部分可能具有通用实用价值的情况,这样它将受益于分离开来并获得更自由的非 Copyleft 许可。

依赖项

~16MB
~287K SLoC