ZeroTier - 全球区域网络
本文件是为软件开发人员编写的。有关使用ZeroTier的信息,请参见:网站,文档网站,和讨论论坛。
ZeroTier是地球上的一个智能可编程以太网交换机。它允许所有联网的设备、虚拟机、容器和应用程序进行通信,就像它们都居住在同一个物理数据中心或云区域一样。
这是通过将加密寻址和安全的点对点网络(称为VL1)与有点类似于VXLAN的以太网仿真层(称为VL2)相结合来实现的。我们的VL2以太网虚拟化层包括先进的企业SDN功能,如用于网络微分割和安全监控的细粒度访问控制规则。
所有ZeroTier流量都使用只有你能控制的秘密密钥进行端到端加密。大多数流量都是点对点流动的,尽管我们为无法建立点对点连接的用户提供免费(但速度较慢)的中继服务。
ZeroTier的目标和设计原则受到谷歌BeyondCorp原始文件和Jericho论坛的 "去周边化 "概念的启发。
请访问ZeroTier的网站,了解更多信息和预建的二进制包。Android和iOS的应用程序可在Google Play和苹果应用商店免费下载。
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则标识一个可以被设备加入的虚拟以太网。
零层地址可以被认为是支持VLAN的巨大的全地球企业以太网智能交换机上的端口号。网络ID是这些端口可能被分配到的VLAN ID。一个端口可以被分配到一个以上的VLAN。
一个ZeroTier地址看起来像8056c2e21c ,一个网络ID看起来像8056c2e21c000001 。网络ID是由该网络主控制器的ZeroTier地址和一个任意的24位ID组成,该ID在该控制器上标识网络。网络控制器大致类似于OpenFlow等SDN协议中的SDN控制器,不过就像VXLAN和VL2之间的类比一样,这不应该被理解为意味着协议或设计是相同的。你可以在my.zerotier.com上使用我们方便而便宜的SaaS托管控制器,或者运行你自己的控制器,如果你不介意乱用JSON配置文件或编写脚本来做的话。
项目布局
基本路径包含ZeroTier One服务的主入口(one.cpp)、自我测试代码、makefiles等:
artwork/: 图标、标志等。attic/: 旧的东西和实验性的代码,我们想保留下来作为参考。controller/:参考网络控制器的实现,它在桌面和服务器构建目标中被默认构建和包含。debian/: 用于在 Linux 上构建 Debian 软件包的文件。doc/: 手册页和其他文件。ext/第三方库,我们为方便某些平台(Mac 和 Windows)而提供的二进制文件,以及安装支持文件。include/包含文件:ZeroTier核心的包含文件。java/:我们的Android移动应用程序使用的JNI包装器。(整个Android应用没有开放源代码,但将来可能会开放)。macui/用于控制ZeroTier One的Macintosh菜单栏应用程序,用Objective C编写。node/ZeroTier虚拟以太网交换机核心,它被设计成与代码的其他部分完全分离,并能够作为一个独立的、与操作系统无关的库来构建。开发者注意:不要在这里使用C++11的功能,因为我们希望这能在缺乏C++11支持的旧的嵌入式平台上构建。C++11可以在其他地方使用。osdep/:支持并与操作系统集成的代码,包括只为某些目标构建的特定平台的东西。rule-compiler/:用于定义网络级规则的JavaScript规则语言编译器。service/ZeroTier One:ZeroTier One服务,包裹ZeroTier核心,为台式机、笔记本电脑、服务器、虚拟机和容器提供类似VPN的虚拟网络连接。windows/:Visual Studio解决方案文件、Windows服务代码和Windows任务栏应用程序用户界面。zeroidc/:ZeroTier服务使用的OIDC实现,用于登录支持SSO的网络。(这部分是用Rust写的,将来会有更多的Rust出现在这个仓库里)。
构建和平台说明
要在Mac和Linux上构建,只需输入make 。在FreeBSD和OpenBSD上需要gmake (GNU make),可以从软件包或端口安装。对于Windows,在windows/ 中有一个Visual Studio解决方案。
- Mac
- 需要MacOS 10.13或更新版本的Xcode命令行工具。
- *如果在构建中启用了SSO,*则Rust用于x86_64和ARM64目标。
- Linux系统
- 需要的最小编译器版本是GCC/G++ 4.9.3或CLANG/CLANG++ 3.4.2。(在CentOS 7上安装
clang,因为G++太旧了)。 - Linux makefiles会自动检测并优先选择clang/clang++,因为它在大多数情况下会产生较小且稍快的二进制文件。你可以通过在make命令行中提供CC和CXX变量来覆盖。
- *如果在构建中启用了SSO,*则Rust用于x86_64和ARM64目标。
- 需要的最小编译器版本是GCC/G++ 4.9.3或CLANG/CLANG++ 3.4.2。(在CentOS 7上安装
- 窗口
- Windows 10或更新版本上的Visual Studio 2022。
- 如果在构建过程中启用了SSO,则Rust适用于x86_64和ARM64目标。
- FreeBSD
- 需要使用 GNU make。键入
gmake来构建。 - 如果在构建过程中启用了SSO,则Rust适用于x86_64和ARM64目标。
- 需要使用 GNU make。键入
- OpenBSD
- OpenBSD上有四个网络成员的限制,因为只有四个分接设备(
/dev/tap0到/dev/tap3)。 - 需要使用 GNU make。输入
gmake来构建。 - 如果在构建中启用了SSO,则Rust用于x86_64和ARM64目标。
- OpenBSD上有四个网络成员的限制,因为只有四个分接设备(
输入make selftest ,将构建一个zerotier-selftest二进制文件,它对各种内部结构进行单元测试,并对构建环境的几个方面进行报告。在新的平台或架构上尝试这个是一个好主意。
运行
使用-h 选项运行zerotier-one将显示帮助。
在Linux和BSD上,如果你从源码构建,你可以用启动服务。
sudo ./zerotier-one -d
在大多数发行版、macOS和Windows上,安装程序将启动该服务并将其设置为启动时启动。
你的系统将自动创建一个主文件夹。
该服务通过JSON API控制,默认情况下,该API在127.0.0.1端口9993可用。我们包括一个zerotier-cli命令行工具,为加入和离开网络等标准事项进行API调用。主文件夹中的authtoken.secret文件包含了访问该API的秘密令牌。参见service/README.md获取API文档。
以下是主文件夹在每个操作系统上的位置(默认)。
- Linux。
/var/lib/zerotier-one - FreeBSD/OpenBSD。
/var/db/zerotier-one - Mac:
/Library/Application Support/ZeroTier/One - Windows:
\ProgramData\ZeroTier\One(这是默认的。如果Windows安装时采用了非标准的盘符分配或布局,那么基本的 "共享应用程序数据 "文件夹可能会有所不同)。
基本故障排除
对于大多数用户来说,它只是工作。
如果你正在运行一个本地系统防火墙,我们建议添加一个允许zerotier的规则。如果你为Windows安装了二进制文件,这应该是自动完成的。其他平台可能需要手动编辑本地防火墙规则,这取决于你的配置。
更多信息请参见文档网站。
Mac的防火墙可以在系统偏好的 "安全 "下找到。Linux有各种各样的防火墙配置系统和工具。
在CentOS上检查/etc/sysconfig/iptables ,了解IPTables规则。对于其他发行版,请咨询你的发行版的文档。如果你正在运行商业第三方防火墙应用程序,如Little Snitch(Mac)、McAfee Firewall Enterprise(Windows)等,你还必须检查其用户界面或文档。一些企业环境可能有集中管理的防火墙软件,所以你可能还需要联系IT部门。
如果UDP入站端口9993是开放的,ZeroTier One对等体将自动找到对方并通过本地有线局域网直接通信。如果该端口被过滤,它们将无法看到对方的局域网公告数据包。如果你在同一物理网络上的设备之间遇到性能不佳,请检查它们的防火墙设置。如果没有局域网自动定位,对等人必须尝试 "环回 "NAT穿越,这有时会失败,而且在任何情况下都需要每个数据包穿越你的外部路由器两次。
某些类型的防火墙和 "对称 "NAT设备后面的用户可能根本无法直接连接到外部对等体。ZeroTier对端口预测的支持是有限的,并将尝试穿越对称NAT,但这并不总是有效。如果P2P连接失败,你将从我们的中继服务器上弹出UDP数据包,导致性能下降。一些NAT路由器有一个可配置的NAT模式,将其设置为 "全锥体 "将消除这个问题。如果你这样做,你也可能看到像VoIP电话、Skype、BitTorrent、WebRTC、某些游戏等方面的神奇改善,因为所有这些都使用与我们类似的NAT穿越技术。
如果你和互联网之间的防火墙阻止了ZeroTier的UDP流量,你将退回到最后的TCP隧道,通过443端口(https冒充)到根服务器。这几乎可以在任何地方工作,但与UDP或直接点对点连接相比,速度非常慢。
其他帮助可以在我们的知识库中找到。