22 个不稳定版本 (4 个破坏性更新)

0.5.0 2022年5月14日
0.4.0 2022年3月30日
0.2.4 2021年8月28日
0.2.3 2021年7月28日

#1896 in 网络编程

BSD-3-Clause

120KB
2.5K SLoC

ZeroNS:围绕 ZeroTier Central API 的命名服务

ZeroNS 提供了 ZeroTier Central 配置的 网络 中的名称;一旦提供了具有 IPv4 功能的网络,它

  • 将监听连接到该网络的本地接口——您将为每个 ZeroTier 网络启动一个 ZeroNS。
  • 提供通用的 DNS 服务,通过将所有查询转发到不匹配 TLD 的 /etc/resolv.conf 解析器,类似于 dnsmasq
  • 告诉中央将所有具有“管理 DNS”设置开启的客户端指向它进行解析。
  • 提供 UDP、TCP 和 DNS-over-TLS 支持(如果配置了证书)。
  • 最后,设置提供的 TLD(默认为 .home.arpa,由 IANA 推荐),以及配置 A(IPv4)和 AAAA(IPv6)记录
    • 成员 ID:zt-<memberid>.<tld> 将解析为它们的 IPv4 和 IPv6 地址。
    • 名称:如果名称与 DNS 名称兼容,则将它们转换为这样的形式:到 <name>.<tld>
      • 请注意,可能存在冲突,并且防止冲突的责任在于管理员。
    • 此外,还包括成员的 PTR 记录,除了 6plane 之外的所有场景。
    • 通配符一切模式:此模式(通过传递 -w 标志启用)为 TLD 下的所有名称启用通配符;例如 my-site.zt-<memberid>.<tld> 将解析为成员的 IP,命名主机以相同方式工作。

安装

在继续之前,请记住 zeronsd 是 测试版软件。话虽如此,如果您想快速开始使用 zeronsd,请点击此处获取用户友好的指南

软件包

  • Linux/Windows:发布版包含 Linux 的 *.deb*.rpm 和 Windows 的 MSI 格式的软件包。注意:Windows MSI 将为端口 53 安装防火墙例外,以便 zeronsd 可以通信。
  • Mac OS X:brew tap zerotier/homebrew-tap && brew install zerotier/homebrew-tap/zeronsd
  • Docker:docker pull zerotier/zeronsd(有关 Docker 的更多信息,请参阅下文)

其他方法

从 Cargo 获取发布版

请先获取一个可工作的 rust 环境

cargo install zeronsd

从 Git(通过 Cargo)

cargo install --git https://github.com/zerotier/zeronsd --branch main

Docker

在存储库中存在一个 Dockerfile,您可以使用它来构建镜像,而不是我们的一些 官方镜像

有一些控制行为的构建参数

  • IS_LOCAL:如果设置,则使用本地源代码树,并尝试获取。
  • VERSION:这是要获取的分支或标签。
  • IS_TAG:如果非零,告诉 cargo 获取标签而不是分支。

示例

docker build . # builds latest master
docker build --build-arg VERSION=somebranch # builds branch `somebranch`
docker build --build-arg IS_TAG=1 --build-arg VERSION=v0.1.0 # builds version 0.1.0 from tag v0.1.0

构建完成后,镜像会自动运行 zeronsd。默认子命令是 help

Docker(alpine 版本)

请参阅 Dockerfile.alpine

用法

必须在环境(或提供指向包含此值的文件的 -t 标志)中设置 ZEROTIER_CENTRAL_TOKEN。您必须能够管理 ZeroTier 网络,才能使用 zeronsd。此外,作为 root 运行是必需的,因为 许多客户端解析器仅在端口 53 上工作。您的 zeronsd 实例将监听 udptcp,端口 53

裸命令行

提示:运行 sudo?通过传递 -E 标志来导入您当前 shell 的环境,使其更容易添加 ZEROTIER_CENTRAL_TOKEN,或使用 -t 标志来完全避免环境。

zeronsd start <network id>

配置

zeronsd 0.3 版本开始,通过 -c 标志接收配置文件,该标志与所有命令行选项相关联。 --config-type 对应配置文件的格式:默认为 yaml,也支持 jsontoml

配置指令如下

  • domain: (字符串) 为您的记录设置顶级域名(TLD);默认为 home.arpa
  • log_level: (字符串) 调整使用的日志级别。默认为 info,但提供 [off, trace, debug, error, warn, info] 选项。请注意,在较低的日志级别下,可能会有大量输出!
  • hosts: (字符串) 将解析 /etc/hosts 格式的文件并将其追加到您的记录中。
  • secret: (字符串) authtoken.secret 文件的路径,该文件是本地主机与 ZeroTier 通信所需的。您可以使用此参数提供此文件,但它在包括 Linux、OS X 和 Windows 在内的多个平台上自动检测。
  • token: (字符串) 包含您的 ZeroTier Central 令牌 的文件的路径。
  • wildcard: (布尔值) 启用通配符模式,所有成员名称都将获得一个如下格式的通配符:*.<name>.<tld>;它指向成员的 IP 地址。

作为服务运行

目前,此行为仅支持 Linux 和 Mac OS X;我们将接受其他平台上的补丁。

使用 zeronsd supervisezeronsd unsupervise 命令可以操作与您的网络相关的 systemd 单元文件。对于 supervise 的情况,只需传递您通常传递给 start 的参数,它将根据这些参数生成一个单元。

示例

# to enable
zeronsd supervise -t ~/.token -f /etc/hosts -d mydomain 36579ad8f6a82ad3
# generates systemd unit file named /lib/systemd/system/zeronsd-36579ad8f6a82ad3.service
systemctl daemon-reload
systemctl enable zeronsd-36579ad8f6a82ad3.service && systemctl start zeronsd-36579ad8f6a82ad3.service

# to disable
systemctl disable zeronsd-36579ad8f6a82ad3.service && systemctl stop zeronsd-36579ad8f6a82ad3.service
zeronsd unsupervise 36579ad8f6a82ad3
systemctl daemon-reload

日志记录

根据 env_logger 规范,设置 ZERONSD_LOGRUST_LOG 为各种日志级别或其他参数。

Docker

在 docker 中运行稍微复杂一些。您必须能够拥有一个可以导入(加入网络)的网络接口,并且必须能够访问主机上的 localhost:9999。目前,为了简洁起见,我们建议使用 --net=host 运行,直到我们有更多时间调查一个可能更安全的解决方案。

您还需要挂载您的 authtoken.secret 文件,这是我们用来与 zerotier-one 通信的。

docker run --net host -it \
  -v /var/lib/zerotier-one/authtoken.secret:/authtoken.secret \
  -v <token file>:/token.txt \
  zeronsd:alpine start -s /authtoken.secret -t /token.txt \
  <network id>

其他注意事项

您必须已经加入了一个网络,并且显然,zerotier-one 应该正在运行!

它应该在与您的 zerotier-one 实例通信后打印一些诊断信息,以确定要监听的 IP 地址。之后,它应该与中央 API 进行通信并自动设置其他一切。

startsupervise 子命令的标志

  • -d <tld> 将为您的记录设置 TLD;默认为 home.arpa
  • -f <hosts 文件> 将解析 /etc/hosts 格式的文件并将其追加到您的记录中。
  • -s <秘密文件> 指向 authtoken.secret 的路径,这是在与本地主机的 ZeroTier 通信时所需的。您可以通过此参数提供此文件,但它在包括 Linux、OS X 和 Windows 在内的多个平台上自动检测。
  • -t <中心令牌文件> 指向包含您的 ZeroTier Central 令牌 的文件。
  • -w 启用通配符模式,其中所有成员名称都获得以下格式的通配符: *.<名称>.<顶级域名>;这指向成员的 IP 地址。
  • -v 启用详细日志。重复使用以增加详细程度。
  • -V 打印版本。

生存时间(TTL)

当前记录具有 60 秒的生存时间,并通过 API 每 30 秒刷新一次 Central 的记录。我觉得这比让超时发生更安全。

每个接口的 DNS 解析

OS X 和 Windows 用户默认获得此功能,因此不需要它。请注意,但在此刻,PTR 解析在这两个平台上都不能正确工作。这是 ZeroTier 的一个缺陷,应该很快得到纠正。

强烈建议 Linux 用户使用 systemd-networkdsystemd-resolved 来获取可以隔离到您想要使用的域的每个接口解析器。如果您想尝试一些可以帮助您快速开始的东西,请查看 zerotier-systemd-manager 存储库

BSD 系统仍需要一点工作;如果我们了解您选择的 BSD 的环境,我们可以真正使用您的帮助来完成这项工作。如果您对此感兴趣,请设置一个问题。

致谢

ZeroNS 对 trust-dns 工具包要求很高,我个人非常感激这样一个库套件的存在。它使我的工作变得非常简单。

许可证

BSD 3 条款

作者

Erik Hollensbe [email protected]

依赖关系

~20–36MB
~586K SLoC