原文永久链接:https://forum.piwind.com/d/40-zerotierjiao-cheng-03-ke-hu-duan-pei-zhi-zerotier-clichang-yong-ming-ling-qiao-jie-he-lu-you-pei-zhi-shi-li
Date: 2024-10-02
Update: 2025-09-19
3. 客户端
win
-
使用官方客户端:https://www.zerotier.com/download/#windows
-
下载msi尾缀安装程序,会默认安装在两个路径(无法选择):
- zerotier_desktop_ui:C:\Program Files (x86)\ZeroTier\One
- zerotier-one_x64:C:\ProgramData\ZeroTier\One
-
zerotier的win客户端配置:
- 点击状态栏zerotier,可以勾选 Start UI at Login,即可开机启动zerotier
- 可以添加
C:\Program Files (x86)\ZeroTier\One
到PATH以便调用zerotier-cli
等命令【注意要以管理员权限运行命令】
-
可视化操作加入网络:点击状态栏zerotier,Join New Network,填入Network ID即可加入
-
启动Zerotier One服务,在网络连接中可以看到zerotier virtual port和一个network id一致的ZeroTier One虚拟网卡,此时在ipconfig中也可以查询到ZeroTier One虚拟网卡的ip地址,就是组网ip
-
使用自建PLANET的流程:
services.msc,找到ZeroTier One,先把服务停止掉,再替换文件(C:\ProgramData\ZeroTier\One\planet),将其替换为PLANET服务器上的planet文件(可以将原planet改名为 planet-official),再启动服务
在 zerotier-cli 的 status 和 peers 中看到 ONLINE 和 planet 的 DIRECT 就说明成功了
可以先 zerotier leave 掉原先的 network,然后 zerotier-cli join
linux
linux上安装用的是脚本,地址:https://install.zerotier.com/,解析脚本内容:
检测发行版,支持很多unix系统
对于debian类,添加gpg密钥,apt安装zerotier-one
对于centos类,rpm导入gpg密钥,创建文件
/etc/yum.repos.d/zerotier.repo
,内容如下:[zerotier] name=ZeroTier, Inc. RPM Release Repository baseurl=http://download.zerotier.com/redhat/el/$releasever enabled=1 gpgcheck=1
然后yum安装zerotier-one
可执行文件位置:/usr/sbin/zerotier-one【zerotier-cli、zerotier-idtool都是软链指向这个】
service文件位置:/etc/systemd/system/multi-user.target.wants/zerotier-one.service
启动并设置开机启动zerotier-one服务
最后生成id文件:/var/lib/zerotier-one/identity.secret
因此可以考虑直接使用这里的脚本安装zerotier-one客户端,命令如下:
## 常规命令 curl -s https://install.zerotier.com | sudo bash ## 或者先使用gpg校验,通过验证再执行脚本 curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/main/doc/contact%40zerotier.com.gpg' | gpg --import && if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi
不过本次选择手动安装zerotier客户端
-
使用官方客户端:https://www.zerotier.com/download/#linux
安装指定版本:https://download.zerotier.com/RELEASES/
-
手动安装zerotier-one 1.14.0版本:
cd /data-nas/linux/files/download wget https://download.zerotier.com/RELEASES/1.14.0/dist/redhat/el7/zerotier-one-1.14.0-1.el7.x86_64.rpm # 用 yum 或者 rpm -i 命令安装都可以 yum install zerotier-one-1.14.0-1.el7.x86_64.rpm # rpm -i zerotier-one-1.14.0-1.el7.x86_64.rpm# 安装完成之后需要自行配置服务 systemctl daemon-reload systemctl start zerotier-one systemctl enable zerotier-one## 查看状态等 systemctl status zerotier-one systemctl stop zerotier-one systemctl restart zerotier-one
-
(另外)debian-11安装zerotier-one 1.14.2流程:
mkdir -p /data/linux/files/download cd /data/linux/files/download wget https://download.zerotier.com/RELEASES/1.14.2/dist/debian/bullseye/zerotier-one_1.14.2_amd64.deb apt install ./zerotier-one_1.14.2_amd64.debsystemctl start zerotier-one systemctl enable zerotier-one
-
注意要手动配置防火墙以开放端口(否则zerotier状态为TUNNELED):
zerotier会监听3个UDP端口:
- 9993 - The default
- A random, high numbered port derived from your ZeroTier address
- A random, high numbered port for use with UPnP/NAT-PMP mappings
# 最好把相应的tcp端口也开放一下,以便其fallback到relay上 firewall-cmd --permanent --add-port=9993/udp firewall-cmd --permanent --add-port=9993/tcp firewall-cmd --reload # 开放之后重启服务 systemctl restart zerotier-one
-
更新或卸载流程:
## 后续更新 yum install zerotier-one systemctl daemon-reload systemctl restart zerotier-one## 降级安装 yum downgrade zerotier-one-1.14.2-1.el7.x86_64.rpm systemctl daemon-reload systemctl restart zerotier-one## 卸载流程(centos-7) yum remove zerotier-one systemctl daemon-reload # 按需删除zerotier的数据目录 rm -rf /var/lib/zerotier-one## 卸载流程(debian-11) apt remove zerotier-one rm -rf /etc/systemd/system/zerotier-one.service rm -rf /etc/init.d/zerotier-one systemctl daemon-reload # 按需删除zerotier的数据目录 rm -rf /var/lib/zerotier-one
-
使用自建PLANET的流程:
停止服务、替换planet文件(/var/lib/zerotier-one/planet)、启动服务,成功连上的话再zerotier-cli join,再到控制台中授权即可
systemctl status zerotier-one zerotier-cli status zerotier-cli listnetworks zerotier-cli peers# 先退出官方network zerotier-cli leave <Network ID>systemctl stop zerotier-one cd /var/lib/zerotier-one mv planet planet-official wget -O planet https://www.example.com/console/zerotier-files/planet?key=<key> chown zerotier-one:zerotier-one planetsystemctl start zerotier-one zerotier-cli join <Network ID>
安卓
-
官方客户端(本次不用):https://download.zerotier.com/RELEASES/1.16.0/dist/ZeroTierOne.apk
最新版链接:https://download.zerotier.com/dist/ZeroTierOne.apk
官方安卓客户端从版本1.16.0开始,支持了加载自定义PLANET,在设置中 Add planet file,填入PLANET的URL(可能会遇到BUG,无法弹出二次确认的窗口导致无法添加),添加成功之后所有已存在的network会删掉,然后添加network id,在controller中授权,即可顺利连上
但是,实测官方客户端有些连接无法建立(安卓和linux之间)
-
使用第三方客户端:ZerotierFix
但是这个项目的原作者已经不更新了,最新的release为1.0.10(2023-09-17,Zerotier核心为1.12.2)
版本虽老,但是目前不影响使用
iOS
-
有且只有官方客户端:https://apps.apple.com/us/app/zerotier-one/id1084101492
目前也是1.16.0版本,没有添加PLANET的功能,但是填入network id,授权之后也通了,通过zerotier-cli peers看到其会引入官方的PLANET作为一个LEAF加入到network中,以便于连接,本次引入的信息如下:
cafe80ed74 - LEAF 334 DIRECT -1 4906 185.152.67.145/9993
可以和windows通信了,但是也无法与linux通信
4. zerotier-cli常用命令
链接:CLI | ZeroTier Documentation
zerotier-cli命令,在win上需要管理员运行,linux上要root
zerotier-cli -h## 检查服务状态,ONLINE就是正常的,TUNNELED就是用TCP中转
zerotier-cli status
zerotier-cli info
## 加入、退出、列举网络
zerotier-cli join <Network ID>
zerotier-cli leave <Network ID>
zerotier-cli listnetworks
## P2P网络中的对等体,列举所有peers,DIRECT表示P2P成功打通连接,RELAY表示通过roots服务器中转
zerotier-cli peers
## 查看完整的info,重点排查对称型NAT(Symmetric NAT),也就是关注listeningOn和surfaceAddresses,如果surfaceAddresses的数量在使用过程中不断增长,且端口号不是固定的规律,且数量超过listeningOn等特征,说明当前的网络环境为对称型NAT,影响P2P连接质量
zerotier-cli info -j## moon的操作
zerotier-cli listmoons
zerotier-cli orbit <world ID> <seed>
zerotier-cli deorbit <world ID>
5. 桥接
- 参考链接:Layer 2 Bridge | ZeroTier Documentation
- 适用场景:如果想要远程访问局域网中一些无法安装zerotier客户端的设备,就可以开启这个功能。通常会把局域网中的软路由设备加入到zerotier网络中并将其作为二层网桥,这样局域网中其他设备均无需安装运行zerotier客户端(如果想远程访问的设备都可以方便装上zerotier,就没必要配置桥接)
- Allow Ethernet Bridging 选项说明:允许以太网桥接,就是允许该节点作为二层网桥,将自己所在的物理局域网通过桥接的方式暴露到 ZeroTier 虚拟网络里
- 不要忘记:二层网络需要不同ip处于同一个网段才能互相通信,也就是说家里局域网的网段和zerotier虚拟网络的网段要一致,但是要避免ip冲突,可选的方法如下:
- 把zerotier虚拟网络的Assignment Pools清空掉,也就是禁用掉zerotier的DHCP,让家庭LAN的DHCP做唯一的IP分配,此时远程客户端会通过桥接节点把 DHCP 请求直接转到 LAN 路由器,由 LAN 来统一分配
- 家庭里的DHCP和zerotier的DHCP池子隔离开,比如 192.168.1.0/24网段,家里是100199,zerotier上是200230
- zerotier的DHCP关掉,只有家庭LAN的DHCP,在zerotier上手动分配同网段下的不冲突的ip
- 二层网络桥接除了ip冲突,还有:广播/组播风暴(Broadcast storm / Multicast storm)、二层环路(Layer 2 Switching Loops)、安全边界模糊(把远程设备暴露到 LAN,如果其中一个远程设备被攻陷,所有LAN上的设备都会暴露,相比之下三层路由可以通过路由表或防火墙规则做隔离,风险更可控)、MTU和性能问题
- 如何判断是二层路由还是三层路由:用traceroute等追踪路由,或者看设备的ARP表中是否含有目标ip的MAC地址。
二层网络配置
方法:局域网中的软路由或其他设备,启用zerotier,并在controller中分配家庭LAN网段下的ip,启用Bridging,在zerotier网络中添加一条route让流量走向该节点的ip,再到设备中把 eth0(物理网口)和 ztxxxx(ZeroTier 网口)桥接到一个 br0 里面。那么当外部设备接入zerotier的网络并分配与家庭LAN同网段的ip,就如同加入了家中的LAN,能和同网段的ip通信。
流程:
-
在controller中,给指定节点分配家庭LAN网段下的ip,例如 172.16.22.2/24,勾选 Active Bridge,再添加一条route
172.16.22.0/24 via 172.16.22.2
-
在节点中配置bridge(本例为centos7)【特别注意,如果服务器是通过eth0上网的,直接桥接会导致断线,最好是配置另一块网卡做网桥,也可以把下列命令放在一行里执行】
ip link add name br0 type bridge ip link set eth0 master br0 ip link set ztXXXX master br0 ip link set br0 up
-
在controller的Assignment Pools中删除所有网段,让设备连上zerotier网络后通过网桥自动获取家庭LAN中DHCP分配的ip,即可与内网ip通信
-
中间有一条命令需要在节点中配置的:
zerotier-cli set $NETWORK_ID allowManaged=0
三层网络配置
方法:维持原先的家庭LAN和zerotier网络的网段隔离,在controller中添加一条route,让家庭LAN的网段流量走向某个节点的ip,再把该节点的SNAT开起来。此时外部设备只要能和该节点通信,就可以访问家庭LAN中的所有设备了,但反过来是不通的,家庭LAN中的其他设备如果没有配置zerotier,是不知道zerotier网段的(要实现反向,同样的就在家庭路由器上添加路由,让zerotier网段流向该节点,并在节点上配置DNAT)。
流程:
-
节点开启SNAT(本例为centos7)
## 查看ipv4转发 sysctl net.ipv4.ip_forward # 临时开启,永久生效 sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf## 设置防火墙转发 firewall-cmd --permanent --add-masquerade firewall-cmd --reload
-
在controller中添加一条route
172.16.22.0/24 via 10.11.12.21
-
当客户端处于zerotier网络,例如10.11.12.101,就可以直接ping到 172.16.22.3 等设备
常用检查命令
windows上:
## 查看路由表
route print## 检查路由
tracert -d 172.16.22.1## 查看ARP表
arp -a
linux:
## 查看ARP表
arp -n
ip neigh## 查看网口
ip a
nmcli device show eth0
nmcli c s## 查看路由表
ip route## 查看iptables
iptables -L -n## 查看bridge
ip link show type bridge## 回滚操作
ip link set eth0 nomaster
ip link set ztXXXX nomaster
ip link set br0 down
ip link delete br0 type bridge
本文声明:
- 此文可能会存在排版、样式不美观,图片无法显示等问题
- 文章内容在原文永久链接中会定期更新,此文不做同步更新
- 限于篇幅长度限制,此文可能会有裁剪
建议阅读原文链接