静看光阴荏苒
不管不顾不问不说也不念

ZTNET: 开源ZeroTier网络控制器

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)下载页面:

Download

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(狗头

赞(3)
未经允许不得转载:荒岛 » ZTNET: 开源ZeroTier网络控制器
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

分享创造快乐

广告合作资源投稿