本文档是为软件开发人员读者编写的。有关使用 ZeroTier 的信息,请参阅:网站、文档站点和论坛。
ZeroTier 是一款适用于地球的智能可编程以太网交换机。它允许所有联网设备、虚拟机、容器和应用程序进行通信,就好像它们都驻留在同一物理数据中心或云区域中一样。
这是通过将加密寻址且安全的对等网络(称为 VL1)与有点类似于 VXLAN(称为 VL2)的以太网仿真层相结合来实现的。我们的 VL2 以太网虚拟化层包括先进的企业 SDN 功能,例如用于网络微分段和安全监控的细粒度访问控制规则。
所有 ZeroTier 流量均使用只有您控制的密钥进行端到端加密。尽管我们为无法建立点对点连接的用户提供免费(但速度较慢)的中继,但大多数流量都是点对点流动的。
ZeroTier 的目标和设计原则的灵感来源于 Google BeyondCorp 的原始论文和 Jericho 论坛的“去边界化”概念。
访问 ZeroTier 网站以获取更多信息和预构建的二进制包。适用于 Android 和 iOS 的应用程序可在 Google Play 和 Apple 应用商店中免费获取。
ZeroTier 根据 BSL 1.1 版获得许可。有关详细信息,请参阅 LICENSE.txt 和 ZeroTier 定价页面。 ZeroTier 可在企业和学术机构内部免费使用,也可用于非商业目的。某些类型的商业用途(例如基于 ZeroTier 构建闭源应用程序和设备或将 ZeroTier 网络控制器和网络管理作为 SaaS 服务提供)需要商业许可证。
ZeroTier 中还包含少量第三方代码,不受我们的 BSL 许可证的约束。请参阅 AUTHORS.md 以获取第三方代码的列表、其中包含的代码以及适用于它的许可证。 ZeroTier 中的所有第三方代码均获得自由许可(MIT、BSD、Apache、公共领域等)。
ZeroTier 世界中的一切都由两种类型的标识符控制:40 位/10 位ZeroTier 地址和 64 位/16 位网络 ID 。这些标识符可以通过其长度轻松区分。 ZeroTier 地址标识节点或“设备”(笔记本电脑、电话、服务器、虚拟机、应用程序等),而网络 ID 标识可以由设备加入的虚拟以太网。
ZeroTier 地址可以被视为支持 VLAN 的庞大全球企业以太网智能交换机上的端口号。网络 ID 是这些端口可以分配到的 VLAN ID。一个端口可以分配给多个 VLAN。
ZeroTier 地址类似于8056c2e21c
,网络 ID 类似于8056c2e21c000001
。网络 ID 由该网络主控制器的 ZeroTier 地址和标识该控制器上的网络的任意 24 位 ID 组成。网络控制器大致类似于 OpenFlow 等 SDN 协议中的 SDN 控制器,尽管与 VXLAN 和 VL2 之间的类比一样,这不应被解读为暗示协议或设计相同。您可以在 my.zerotier.com 使用我们方便且廉价的 SaaS 托管控制器,或者运行您自己的控制器(如果您不介意摆弄 JSON 配置文件或编写脚本来执行此操作)。
基本路径包含 ZeroTier One 服务主入口点 ( one.cpp
)、自测试代码、makefile 等。
artwork/
:图标、徽标等。attic/
:我们希望保留以供参考的旧东西和实验代码。controller/
:参考网络控制器实现,默认情况下在桌面和服务器构建目标上构建并包含该实现。debian/
:用于在 Linux 上构建 Debian 软件包的文件。doc/
:手册页和其他文档。ext/
:第三方库、我们为方便在某些平台(Mac 和 Windows)上发布的二进制文件以及安装支持文件。include/
:包含 ZeroTier 核心的文件。java/
:与我们的 Android 移动应用程序一起使用的 JNI 包装器。 (整个 Android 应用程序不是开源的,但将来可能会开源。)node/
:ZeroTier 虚拟以太网交换机核心,其设计与其余代码完全分离,并且能够构建为独立于操作系统的独立库。开发人员请注意:不要在此处使用 C++11 功能,因为我们希望它构建在缺乏 C++11 支持的旧嵌入式平台上。 C++11 可以在其他地方使用。osdep/
:支持操作系统并与操作系统集成的代码,包括仅为某些目标构建的特定于平台的内容。rule-compiler/
:用于定义网络级规则的 JavaScript 规则语言编译器。service/
:ZeroTier One 服务,它封装了 ZeroTier 核心,并为台式机、笔记本电脑、服务器、虚拟机和容器的虚拟网络提供类似于 VPN 的连接。windows/
:Visual Studio 解决方案文件、Windows 服务代码和 Windows 任务栏应用 UI。zeroidc/
:ZeroTier 服务使用 OIDC 实现来登录支持 SSO 的网络。 (这部分是用 Rust 编写的,将来会有更多 Rust 出现在这个存储库中。)请从dev
分支中提取请求。
发布是通过将dev
合并到main
中,然后标记并进行构建来完成的。
要在 Mac 和 Linux 上构建,只需输入make
。在 FreeBSD 和 OpenBSD 上,需要gmake
(GNU make),并且可以从软件包或 ports 安装。对于 Windows,在windows/
中有一个 Visual Studio 解决方案。
gmake
进行构建。binutils
。键入pkg install binutils
进行安装。/dev/tap0
到/dev/tap3
)。gmake
进行构建。输入make selftest
将构建一个Zerotier-selftest二进制文件,该二进制文件测试各种内部结构并报告构建环境的几个方面。在新颖的平台或架构上尝试这一点是个好主意。
使用-h
选项运行Zerotier-one将显示帮助。
在 Linux 和 BSD 上,如果您从源代码构建,则可以使用以下命令启动服务:
sudo ./zerotier-one -d
在大多数发行版、macOS 和 Windows 上,安装程序将启动该服务并将其设置为在启动时启动。
将自动创建系统的主文件夹。
该服务通过 JSON API 进行控制,默认情况下可在127.0.0.1:9993
处使用。它还侦听0.0.0.0:9993
,只有在local.conf
中正确配置了allowManagementFrom
时才可用。我们包含一个Zerotier-cli命令行实用程序,用于为加入和离开网络等标准事物进行 API 调用。主文件夹中的authtoken.secret文件包含用于访问此 API 的秘密令牌。有关 API 文档,请参阅 service/README.md。
这是每个操作系统上主文件夹的位置(默认情况下):
/var/lib/zerotier-one
/var/db/zerotier-one
/Library/Application Support/ZeroTier/One
ProgramDataZeroTierOne
(这是默认值。如果使用非标准驱动器盘符分配或布局安装 Windows,基本“共享应用程序数据”文件夹可能会有所不同。)对于大多数用户来说,它只是有效的。
如果您正在运行本地系统防火墙,我们建议添加允许 Zerotier 的规则。如果您安装了 Windows 的二进制文件,这应该会自动完成。其他平台可能需要手动编辑本地防火墙规则,具体取决于您的配置。
请参阅文档站点以获取更多信息。
Mac 防火墙可以在系统偏好设置的“安全”下找到。 Linux有多种防火墙配置系统和工具。
在 CentOS 上,检查/etc/sysconfig/iptables
中的 IPTables 规则。对于其他发行版,请参阅您的发行版的文档。您还必须检查商业第三方防火墙应用程序的 UI 或文档,例如 Little Snitch (Mac)、McAfee Firewall Enterprise (Windows) 等(如果您正在运行这些应用程序)。某些企业环境可能具有集中管理的防火墙软件,因此您可能还需要联系 IT 部门。
如果 UDP 端口 9993 入站打开, ZeroTier One 对等点将自动相互定位并通过本地有线 LAN 直接通信。如果该端口被过滤,他们将无法看到彼此的 LAN 公告数据包。如果同一物理网络上的设备之间的性能较差,请检查其防火墙设置。如果没有 LAN 自动定位,对等方必须尝试“环回”NAT 遍历,这有时会失败,并且在任何情况下都要求每个数据包都经过外部路由器两次。
某些类型的防火墙和“对称”NAT 设备后面的用户可能根本无法直接连接到外部对等点。 ZeroTier 对端口预测的支持有限,并且会尝试遍历对称 NAT,但这并不总是有效。如果 P2P 连接失败,您将从我们的中继服务器上退回 UDP 数据包,从而导致性能下降。某些 NAT 路由器具有可配置的 NAT 模式,将其设置为“全锥”将消除此问题。如果您这样做,您还可能会看到 VoIP 电话、Skype、BitTorrent、WebRTC、某些游戏等的神奇改进,因为所有这些都使用与我们类似的 NAT 穿越技术。
如果您和互联网之间的防火墙阻止了 ZeroTier 的 UDP 流量,您将退回到通过端口 443 到根服务器的 TCP 隧道(https 模拟)的最后手段。这几乎可以在任何地方工作,但与 UDP 或直接点对点连接相比速度非常慢。
您可以在我们的知识库中找到更多帮助。
Prometheus Metrics 可在/metrics
API 端点获取。该端点受到存储在metricstoken.secret
中的API密钥的保护,以防止不必要的信息泄露。可以从指标中收集的信息包括已加入的网络以及您的实例正在与之通信的对等点。
访问控制是通过 ZeroTier 控制接口本身和metricstoken.secret
进行的。这可以通过X-ZT1-Auth
HTTP 标头字段作为承载身份验证令牌发送,或作为?auth=<token>
附加到 URL。您可以使用以下命令通过cURL
查看当前指标:
// Linux
curl -H "X-ZT1-Auth: $(sudo cat /var/lib/zerotier-one/metricstoken.secret)" http://localhost:9993/metrics
// macOS
curl -H "X-ZT1-Auth: $(sudo cat /Library/Application Support/ZeroTier/One/metricstoken.secret)" http://localhost:9993/metrics
// Windows PowerShell (Admin)
Invoke-RestMethod -Headers @{'X-ZT1-Auth' = "$(Get-Content C:ProgramDataZeroTierOnemetricstoken.secret)"; } -Uri http://localhost:9993/metrics
要在运行 ZeroTier 的机器上的 Prometheus 中配置抓取作业,请将其添加到 Prometheus scrape_config
中:
- job_name: zerotier-one
honor_labels: true
scrape_interval: 15s
metrics_path: /metrics
static_configs:
- targets:
- 127.0.0.1:9993
labels:
group: zerotier-one
node_id: $YOUR_10_CHARACTER_NODE_ID
authorization:
credentials: $YOUR_METRICS_TOKEN_SECRET
如果这些方法都不理想,则可能可以通过 Prometheus Proxy 或其他工具分发指标。注意:我们尚未对此进行内部测试,但可能会使用正确的配置。
指标也可以在磁盘上的 ZeroTier 工作目录中找到:
// Linux /var/lib/zerotier-one/metrics.prom
// macOS /Library/Application Support/ZeroTier/One/metrics.prom
//Windows C:ProgramDataZeroTierOnemetrics.prom
指标名称 | 标签 | 公制类型 | 描述 |
---|---|---|---|
zt_数据包 | 数据包类型、方向 | 柜台 | ZeroTier 数据包类型计数 |
zt_数据包_错误 | 错误类型,方向 | 柜台 | ZeroTier 数据包错误 |
zt_数据 | 协议、方向 | 柜台 | ZeroTier 已发送或接收的字节数 |
zt_num_网络 | 测量 | 此实例加入的网络数量 | |
zt_network_multicast_groups_subscribed | 网络号 | 测量 | 网络订阅的多播组数量 |
zt_网络_数据包 | 网络_id,方向 | 柜台 | 每个网络传入/传出数据包的数量 |
zt_peer_latency | 节点id | 直方图 | 对等延迟(毫秒) |
zt_peer_path_count | 节点 ID、状态 | 测量 | 到对等点的路径数 |
zt_peer_packets | 节点id,方向 | 柜台 | 发往/来自对等方的数据包数量 |
zt_peer_packet_errors | 节点id | 柜台 | 来自对等方的传入数据包错误数 |
如果您希望跟踪其他指标,请在问题中询问我们或向我们发送拉取请求!
有一个静态 http 文件服务器适合托管单页应用程序,地址为 http://localhost:9993/app/
使用zerotier-cli info -j
查找 Zerotier-one 服务的 homeDir
cd $ZT_HOME
sudo mkdir -p app/app1
sudo mkdir -p app/appB
echo ' <html><meta charset=utf-8><title>appA</title><body><h1>hello world A ' | sudo tee app/appA/index.html
echo ' <html><meta charset=utf-8><title>app2</title><body><h1>hello world 2 ' | sudo tee app/app2/index.html
curl -sL http://localhost:9993/app/appA http://localhost:9993/app/app2
然后访问 http://localhost:9993/app/app1/ 和 http://localhost:9993/app/appB/
对不存在路径的请求将返回应用程序根目录index.html,这是 SPA 的惯例。如果需要,您可以编写一些与服务或控制器 api 对话的 javascript。