ZTNET介绍(摘自官方项目页面)
ZTNET – ZeroTier Controller Web UI is a robust and versatile application designed to transform the management of ZeroTier networks. Now featuring organization and multi-user support, it elevates the network management experience, accommodating team-based environments and larger organizations seamlessly.
With a rich palette of features, and an intuitive user interface, ZTNET embodies a paradigm shift in network management experience. It elegantly handles the complexity, letting you focus on what you do best.
部署ZTNET
系统Debian12,建议最低配置1C1G。另外准备一个域名做好DNS解析。
安装Docker和需要用到的软件:
apt -y update apt -y install curl wget nginx python3-certbot-nginx curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh
准备目录新建compose文件:
mkdir -p /opt/ztnet && cd /opt/ztnet && nano docker-compose.yml
写入如下配置:
services: postgres: image: postgres:15.2-alpine container_name: postgres restart: unless-stopped environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: hidden POSTGRES_DB: ztnet volumes: - postgres-data:/var/lib/postgresql/data networks: - app-network zerotier: image: zyclonite/zerotier:1.14.0 hostname: zerotier container_name: zerotier restart: unless-stopped volumes: - zerotier:/var/lib/zerotier-one cap_add: - NET_ADMIN - SYS_ADMIN devices: - /dev/net/tun:/dev/net/tun networks: - app-network ports: - "9993:9993/udp" environment: - ZT_OVERRIDE_LOCAL_CONF=true - ZT_ALLOW_MANAGEMENT_FROM=172.31.255.0/29 ztnet: image: sinamics/ztnet:latest container_name: ztnet working_dir: /app volumes: - zerotier:/var/lib/zerotier-one restart: unless-stopped ports: - 127.0.0.1:3000:3000 environment: POSTGRES_HOST: postgres POSTGRES_PORT: 5432 POSTGRES_USER: postgres POSTGRES_PASSWORD: hidden POSTGRES_DB: ztnet NEXTAUTH_URL: "https://ztnet.example.com" NEXTAUTH_SECRET: "hidden" NEXTAUTH_URL_INTERNAL: "http://ztnet:3000" networks: - app-network links: - postgres depends_on: - postgres - zerotier volumes: zerotier: postgres-data: networks: app-network: driver: bridge ipam: driver: default config: - subnet: 172.31.255.0/29
需要修改的配置如下:
POSTGRES_PASSWORD: hidden NEXTAUTH_URL: "https://ztnet.example.com" NEXTAUTH_SECRET: "hidden"
其他的配置,如果你不知道是什么意思就保持原样不变就好了。现在只需up起来:
docker compose up -d
配置NGINX反向代理,新建NGINX的vhost配置文件:
nano /etc/nginx/sites-available/ztnet
写入如下配置:
server { listen 80; listen [::]:80; server_name ztnet.example.com; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; client_max_body_size 0; } }
启用vhost:
ln -s /etc/nginx/sites-available/ztnet /etc/nginx/sites-enabled/ztnet
签发TLS证书:
certbot --nginx --email imlala@example.com --agree-tos --no-eff-email
至此,ZTNET就部署完成了。访问ztnet.example.com第一个注册的用户将成为管理员。
配置与使用
下面由浅入深介绍下ZTNET的相关配置与使用。
创建网络并将设备加入到网络
单击如图所示按钮即可创建一个网络:
单击刚创建的网络,可以更详细的设置这个网络,例如给这个网络修改名称,添加描述,设置IP段等:
需要注意的是网络ID是固定的,这也是客户端加入此网络的唯一方式,如图所示此网络的ID是:938a87a21176f84d。
你还可以选择把这个网络设置成私有或公开,如果设置成公开,则只要知道这个网络的ID或者二维码就能直接加入这个网络而无需所有者审核。一般情况下,还是建议保持默认的私有状态。
现在我们可以把自己的设备加入到这个网络中,对应平台的客户端(ZeroTier One)下载页面:
Windows在下载安装包安装好后,右键托盘ZeroTier的图标,点击“Join New Network”,在弹出的界面输入网络ID:
Linux(DEB/RPM)操作系统可以使用一键安装脚本进行安装:
curl -s https://install.zerotier.com | bash
然后使用如下命令加入到网络:
zerotier-cli join 938a87a21176f84d
设备第一次申请加入到网络(私有),需要在ZTNET进行授权,只有授权允许的设备才能成功加入此网络:
设置退出节点(ExitNode)
首先将一台设备加入到网络,这里我选择一台境外的VPS,系统是Debian12。
使用一键安装脚本安装ZeroTier客户端:
curl -s https://install.zerotier.com | bash
然后使用如下命令加入到网络:
zerotier-cli join 938a87a21176f84d
我给这台设备设置了一个名称为:ExitNode,IP地址:10.121.15.241,如图所示:
在这台设备上启用IPv4转发,编辑sysctl.conf:
nano /etc/sysctl.conf
写入如下配置:
net.ipv4.ip_forward = 1
应用生效:
sysctl -p
使用如下命令查找机器的网络接口名:
ip a
如图所示,我这台机器的物理接口是eth0(主网卡),ZeroTier的接口是ztggnvrdrr:
现在需要配置iptables,用你机器上的物理接口和ZeroTier接口名替换掉如下配置:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i ztggnvrdrr -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o ztggnvrdrr -m state --state RELATED,ESTABLISHED -j ACCEPT
[可选]安装iptables-persistent,持久化保存iptables规则,即便机器重启也依旧生效:
apt install iptables-persistent
安装过程中会提示是否保存现有规则到/etc/iptables/rules.v4,选择允许即可。
回到ZTNET的WEBUI,添加一条路由,效果是此网络内的所有流量都经过这台ExitNode设备:
0.0.0.0/0 via 10.121.15.241
如图所示:
其他的设备(客户端)重新连接,在Windows的ZeroTier客户端启用Allow default route override选项。iOS的ZeroTier客户端启用Enable Default Route即可。
Linux客户端可以使用下面的命令进行设置:
zerotier-cli set 938a87a21176f84d allowDefault=1
配置私有PLANET服务器
当ZeroTier无法直接完成P2P连接的时候,转而就会使用ZeroTier官方的PLANET服务器进行中继连接。
一般情况下用ZeroTier官方的PLANET服务器就足够了,但如果官方服务器的延迟不理想,或者你想构建一个完全私有的网络,不依赖这些公共基础设施服务也是可以的,ZTNET原生支持配置私有PLANET,也称为:Private Root Servers。
但目前有个缺陷是iOS客户端无法使用私有的PLANET,如果你需要经常使用iOS去访问网络内的设备,就不要配置了。
首先找到ZTNET WEBUI上的控制器,点击创建行星:
一般情况下,在端点这里会自动配置好IP地址和端口,如果没有配置好,就自己把ZTNET所在机器的公网IP写上,端口是9993,其他的不用管:
创建完成后,重启ZeroTier服务:
docker restart zerotier
执行如下命令验证配置是否正常,如果回显只有你自己的PLANET服务器则说明正常:
docker exec zerotier zerotier-cli listpeers
回到ZTNET WEBUI将配置文件下载下来:
下载完成后是一个压缩包,里面有4个文件:
只需要解压planet.custom这个文件即可,解压之后将这个文件重命名为planet。
现在我们需要修改客户端使用我们私有的PLANET服务器,其实就是替换客户端的文件。对于Linux客户端而言,进入如下目录:
cd /var/lib/zerotier-one
将原始的planet文件重命名,或者说做个备份:
mv planet planet.bak
将我们自己的私有planet文件上传到机器内,使用scp、sftp都行,你怎么方便怎么来。
注意变更文件的所有者:
chown -R zerotier-one:zerotier-one planet
最后重启客户端即可:
systemctl restart zerotier-one
对于Windows客户端,进入如下目录:
%PROGRAMDATA%\ZeroTier\One\
步骤和Linux基本一样,替换掉planet文件:
打开Powershell(管理员)执行如下命令重启客户端服务:
Restart-Service "ZeroTier One"
或者在“计算机管理”界面重启服务也是可以的:
当然这样配置的PLANET服务是和ZTNET在同一台机器上面,如果ZTNET所在的机器本身延迟就很高,你还可以单独用一台设备配置PLANET,具体的看官方的这个文档:
https://ztnet.network/usage/private_root#adding-a-second-private-root-server-in-zerotier
总结
使用ZTNET可以摆脱官方对免费用户的设备数量限制,这应该是最大的优点。。
实际体验了一下,有时候连接的很慢,不知道怎么回事,要等很久。。不过一旦成功连接之后就还比较稳,不会出现经常断开重连的问题。
再就是ExitNode模式下,Windows会莫名访问不了某些网站。。iOS上完全正常,网络环境都是一致的,就很玄学= =
我还特地测试了中继,在电脑是电信,手机是联通5G的情况下,没有P2P连接成功后走官方中继,没想到延迟还挺低,只有不到50ms,可能ZeroTier在国内或周边地区有部署PLANET服务器??不明觉厉= =
当然最硬伤的还是iOS的客户端不能指定私有的PLANET,搜了一下有一个三方的实现,必须要系统越狱了才行= =
总的来说,ZeroTier很好,但我用Headscale(狗头