使用 Zerotier 组建虚拟局域网

ZeroTier delivers the capabilities of VPNs, SDN, and SD-WAN with a single system. Manage all your connected resources across both local and wide area networks as if the whole world is a single data center.

前言

ZeroTier 是一个非常简单的跨平台实现虚拟局域网的一个开源工具, 只需要简单的注册账号, 创建一个网络, 剩下的事情只是简单的加入网络 id 就完成了.

ZeroTier 分为节点控制器两个概念, 其中控制器负责维护网络, 包括网络的创建/修改等, 以及节点的授权, IP 分配等功能. 而节点只需要知道一个网络的 id 即可加入此网络(私有网络当然需要经过控制器的授权才可以)

同时, 运行 ZeroTier 的机器既可以是节点也可以是控制器, 二者可以同时存在. 它的工作原理其实就是利用了打洞, 控制器大部分时间只是一个打洞的时候的辅助服务器, 成功打洞之后各个节点是直接连接的, 只有当节点之间无法直接联通的时候, 才会利用控制器进行数据中转. 为了应对某个控制器故障或者也无法连通的情况, ZeroTier 内置了几个分布在全球的控制器节点, 对 IPv4 和 IPv6 都有支持, 具体的节点地址可以在 此处源码 查看.

因此, 如果你不想用官方提供的控制面板, 或者想要连接超过 100 个设备却不想付钱, 你可以自己通过开放的 API 文档 来创建你自己的网络. (需要提醒的是, 这里的文档有一部分是过时的, 遇到问题建议去阅读一下源码, ZeroTier 的源码写的不错)

使用

自建控制器其实很简单, 稍微看一下 API 文档就可以了. 只说一下官方提供的面板的使用.

注册/登陆

没什么好说的.

网络的创建

登陆之后会直接跳转到一个页面, 显示了你的个人信息, 可以选择的套餐, 这不用管, 直接点右上角的 Networks, 在这里会列出创建的所有网络, 点击 Create 会直接创建一个新的网络

相关设置

点击一个网络之后会进入网络的设置界面, Networks Id 会用醒目的黄色标出来, 当加入网络的时候需要这个 id.

网络分为两种, 一种是私有网络, 一种是公开网络. 公开网络只需要知道网络 id, 任何人都能加入, 并且获得 IP 分配, 也就意味着可以直接和其他成员通讯. 而私有网络虽然知道 id 也能直接加入, 但加入之后会提示 Access Denied, 并且是不会获得 IP 分配的, 自然也不会和其他节点取得通信.

当加入一个私有网络后, 在下方的 Member 里面看到左侧有红色虚线的节点, 代表没有授权, 如果想授权只需要简单的在前面打个勾就代表授权, 取消同理, 即时生效.

在面板的右侧是设置相关的 IP 和路由, IPv4 Auto-Assign 默认是开启的, 代表节点在授权之后会自动分配一个 IPv4, 可以自己选择分配的内网 IP 段. (其实是可以填公网 IP 的, 不过可能是bug, 自动分配的 IP 是公网的话是不会自动分配的.) 同理 IPv6 也可以开启自动分配.

加入网络

ZeroTier 提供了多平台的客户端, 安装也非常方便.

ZeroTier 的命令行是 zerotier-cli.

加入网络也很简单:

zerotier-cli join xxxxx

要离开只需要

zerotier-cli leave xxxx

使用 zerotier-cli listnetworks 可以查看自己加入的网络的状态.

一些 bug

爆 401 错误

有时候会遇到执行 cli 的时候提示

401 info invalid JSON response (parse error - unexpected end of input)

如果你确定你是以 root 权限执行的, 那恭喜你遇到了这个 bug.

这个 bug 产生原因未知, 但目前我这里可以复现的操作是, 装了 shadowvpn, 或者 是有 IPSec site to site 的连接存在.

这个 bug 的原理是, cli 其实也是向本机的 9993 端口以 HTTP 方式发请求来控制的, 但通常为了安全起见, 只有 127.0.0.1 向 9993 发送的请求才会被接收, 外部的 IP 则会被 401拦下来. 但问题就是即便是本机运行 cli 也会被拦截, 这就很奇怪.

解决办法也很简单, 将自己的 IP 加入到白名单…

/var/lib/zerotier-one 下创建一个文件叫 local.conf, 写入以下内容

{
    "settings": {
        "allowManagementFrom": ["127.0.0.0/8", "10.xx.xx.xx/32"]
    }
}

其中将 10.xx.xx.xx 改成你自己的 IP, 也就是你自己的 eth0 的 IP. 如果你有多个 IP, 建议都加进去…..

说起这个配置, 在 GitHub 上的 service/README.MD 看到的 allowManagementFrom 的格式是一个字符串, 当初设置了半天都没用, 后来去源码里一看, tmd 早就改成数组了, 文档都没更新.

黑科技用法

ZeroTier 除了用来组建局域网外, 还可以用来做策略路由什么的…

比如说通常情况下, 假设 A 和 B 之间有点对点的隧道 tun0, A 的 隧道 IP 是 10.0.0.1, B 的隧道 IP 是 10.0.0.2

那 A 上的路由表一般是这么加的

ip ro add x.x.x.x/x via 10.0.0.1 或者 ip ro add x.x.x.x/x dev tun0

那有了 ZeroTier 的话, 就可以这么用, 假设 A 分配到的 IP 是 10.147.17.1, B 分配到的 IP 是 10.147.17.2.

那么 A 上加路由表的话就可以这样

ip ro add x.x.x.x/x via 10.147.17.2

需要注意的是 via 填的是 B 的 IP. 这样如果还有 C, D, E 等很多节点的话, 也可以这样添加…

之前某大佬发现这功能之后就顺手用 ZeroTier 给我笔记本播了一个公网 IP 上去…

关于 “使用 Zerotier 组建虚拟局域网” 的 3 个意见

    1. 可以的. zt 的不同节点之间的通讯是加密过的. 同时如果直接将路由表的网关设置成zt局域网另一台节点的zt地址, 也是可以转发过去的. 利用这个特性其实也是可以拿来翻墙的.

评论关闭。