当前位置: 首页 > news >正文

《ZeroTier教程》03-客户端配置 zerotier-cli常用命令 桥接和路由配置示例

原文永久链接: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冲突,可选的方法如下:
    1. 把zerotier虚拟网络的Assignment Pools清空掉,也就是禁用掉zerotier的DHCP,让家庭LAN的DHCP做唯一的IP分配,此时远程客户端会通过桥接节点把 DHCP 请求直接转到 LAN 路由器,由 LAN 来统一分配
    2. 家庭里的DHCP和zerotier的DHCP池子隔离开,比如 192.168.1.0/24网段,家里是100199,zerotier上是200230
    3. 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通信。

流程:

  1. 在controller中,给指定节点分配家庭LAN网段下的ip,例如 172.16.22.2/24,勾选 Active Bridge,再添加一条route

    172.16.22.0/24 via 172.16.22.2
    
  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
    
  3. 在controller的Assignment Pools中删除所有网段,让设备连上zerotier网络后通过网桥自动获取家庭LAN中DHCP分配的ip,即可与内网ip通信

  4. 中间有一条命令需要在节点中配置的:

    zerotier-cli set $NETWORK_ID allowManaged=0
    

三层网络配置

方法:维持原先的家庭LAN和zerotier网络的网段隔离,在controller中添加一条route,让家庭LAN的网段流量走向某个节点的ip,再把该节点的SNAT开起来。此时外部设备只要能和该节点通信,就可以访问家庭LAN中的所有设备了,但反过来是不通的,家庭LAN中的其他设备如果没有配置zerotier,是不知道zerotier网段的(要实现反向,同样的就在家庭路由器上添加路由,让zerotier网段流向该节点,并在节点上配置DNAT)。

流程:

  1. 节点开启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
    
  2. 在controller中添加一条route

    172.16.22.0/24 via 10.11.12.21
    
  3. 当客户端处于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

本文声明:

  • 此文可能会存在排版、样式不美观,图片无法显示等问题
  • 文章内容在原文永久链接中会定期更新,此文不做同步更新
  • 限于篇幅长度限制,此文可能会有裁剪

建议阅读原文链接

http://www.hskmm.com/?act=detail&tid=19454

相关文章:

  • XDG和桌面环境
  • JAVA 语法基础课程动手动脑及课后实验问题整理文档
  • python垃圾回收
  • Arduino IDE 离线更新ESP-32 lib包
  • CUDA编程(CUDA_By_Example笔记)
  • K8S部署Openwebui 服务(Nvidia版)
  • 传统AI对话:悟空也辛苦(ai元人文)
  • 理解大语言模型中的 Token
  • 软件工程第一次团队作业
  • 实验1作业
  • 苍穹外卖-day01(软件开发整体介绍,苍穹外卖项目介绍,开发环境搭建,导入接口文档,Swagger) - a
  • 9.27动手动脑及课后实验
  • idea必备插件
  • 新学期每日总结(第6天)
  • 第六天
  • Combinatorics
  • 绘制倒杨辉三角形
  • ABC425 总结
  • 解决方案 | 无需安装任何插件,chrome如何快速搜索书签
  • 订单模块逐字稿
  • 课后作业小结
  • 课后3
  • 尝试决定
  • 竞赛第一步----进实验室
  • Java语法基础课程动手动脑与实验问题深度解析
  • lc1038-从二叉搜索树到更大和树
  • 课程中的问题
  • 课后2
  • Java语法基础课程“动手动脑”问题与实验整理
  • 课后感想