Date: 2024-10-02
Update: 2025-09-19
3. 客户端
win
使用官方客户端:https://www.zerotier.com/download/#windows
下载msi尾缀安装程序,会默认安装在两个路径(无法选择):
zerotier的win客户端配置:
可视化操作加入网络:点击状态栏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.deb
systemctl 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 planet
systemctl start zerotier-one
zerotier-cli join <Network ID>
安卓
iOS
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