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

news/2025/9/28 0:18:57/文章来源:https://www.cnblogs.com/piwind/p/19115944

原文永久链接: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.mzph.cn/news/920117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XDG和桌面环境

1、定义XDG(X Desktop Group):一套 freedesktop.org 制定的目录规范,用来统一应用的配置、缓存、数据和运行时文件存放路径,在 freedesktop.org 制定的规范中,最常见的是 XDG Base Directory Specification(基础目…

PocoEmit遥遥领先于AutoMapper之循环引用

PocoEmit遥遥领先于AutoMapper之循环引用一、什么是循环引用循环引用就是类型相互依赖1. 比如A类有B类的属性,B类也有A类的属性这有什么问题呢? 编写生成A的代码需要遍历A的所有属性 构造B类型属性是A代码的一部分,B代…

网站制作怎么学去哪学建设个人网站需要什么条件

摘要&#xff1a; 云托付&#xff08;Cloud Hosting&#xff09;是以阿里云的标准&#xff0c;提供给企业优质的机房托管资源、云专线网络以及增值服务&#xff0c;并与阿里云公有云产品结合&#xff0c;为企业搭建混合云提供基础资源。 原文地址&#xff1a;http://click.aliy…

JAVA 语法基础课程动手动脑及课后实验问题整理文档

一、编程思维与项目分解相关 1.按照 “分解 — 识别模式 — 抽象 — 算法” 的编程思维项目分解原则,重新编写课前测试题。思考将整个程序分成若干个组件(分解)、将多次出现的相似功能设成独立的方法(模式识别、抽…

python垃圾回收

python垃圾回收Python的垃圾回收机制以引⽤计数器为主、分代码回收和标记清除为辅 1.refchai链表 在Python的C源码中有⼀个名为refchain的环状双向链表,在Python程序中每创建1个对象,就会将其加入此链表。 city = 四…

Arduino IDE 离线更新ESP-32 lib包

前提:学习ESP-32过程中,没有科技,只能离线安装依赖; 1. 参考这个知乎答案执行的 (99+ 封私信 / 88 条消息) 分享一个离线更新Arduino的ESP32库的方法 - 知乎 借助kimi的帮助 让不懂python的人也能用上 感谢AI 2. …

上海企业注销流程seo发布专员招聘

Java内存模型可以说是Java并发的底层支持&#xff0c;了解Java内存模型才能正在了解Java并发。内存模型在内存中设置一个变量"value 1&#xff1b;"那么其他线程能在什么时候读取到这个结果呢&#xff1f;有可能不能立即甚至永远都读不到。比如指令顺序与源代码中的…

CUDA编程(CUDA_By_Example笔记)

CUDA编程 概念 核函数 核函数(Kernel Function) 指的是运行在 GPU 上的函数,由 CPU(Host)端调用,但实际在 GPU(Device)端并行执行。 核函数的声明需要限定符 __global__ ,例如: __global__ void add(int *a,…

K8S部署Openwebui 服务(Nvidia版)

K8S部署Openwebui 服务(Nvidia版)K8S部署BOBAI 服务(Nvidia版) 目录一、GPU 节点部署 Driver && CUDA部署1、前提准备检查机器上面有支持CUDA的NVIDIA GPU 查看自己的系统是否支持 验证系统是否有GCC编译环…

传统AI对话:悟空也辛苦(ai元人文)

悟空也辛苦 absolutely. 您这个补充至关重要,它点明了整个系统实现“智慧循环”和“责任追溯”的最后一环。我们把它整合进去。 这个“悟空中的数据备案”机制,可以称之为 “悟空的全程审计追踪” 或 “创造性过程档…

响应网站开发内容营销策略有哪些

Java异常架构与异常关键字Java异常简介Java异常架构1. Throwable2. Error&#xff08;错误&#xff09;3. Exception&#xff08;异常&#xff09;运行时异常编译时异常4. 受检异常与非受检异常受检异常非受检异常Java异常关键字Java异常处理声明异常抛出异常捕获异常如何选择异…

企业网站建设备案需要哪些资料广州网站制作公司电话

1. 注释Java中有三种注释&#xff1a;(1) // -单行注释&#xff0c;注释从“//”开始&#xff0c;终止于行尾&#xff1b;(2) -多行注释&#xff0c;注释从““结束&#xff1b;(3) -是Java特有的doc注释&#xff0c;这种注释主要是为支持JDK工具Javadoc而采用的。Javadoc能识…

广州个人网站制作apache 建立网站

阻塞式IO与非阻塞IO的区别 1. 阻塞式IO (Blocking I/O) 定义 当程序发起一个I/O操作&#xff08;如读取文件、网络数据&#xff09;时&#xff0c;进程会被挂起&#xff08;阻塞&#xff09;&#xff0c;直到操作完成或超时才会继续执行后续代码。在此期间&#xff0c;程序无法…

苍穹外卖-day01(软件开发整体介绍,苍穹外卖项目介绍,开发环境搭建,导入接口文档,Swagger) - a

苍穹外卖-day01(软件开发整体介绍,苍穹外卖项目介绍,开发环境搭建,导入接口文档,Swagger) 课程内容软件开发整体介绍 苍穹外卖项目介绍 开发环境搭建 导入接口文档 Swagger项目整体效果展示:​ …

做中东市场哪个网站合适海盐网站建设

1.概念 在现实生活中&#xff0c;可能存在一个与你一样的自己&#xff0c;我们称之为双胞胎。那在创建对象的时候&#xff0c;可否创建一个与已存在对象一模一样的新对象呢&#xff1f;答案是可以的&#xff0c;这就要通过拷贝构造函数来实现了。 拷贝构造函数&#xff1a;只有…

网页设计与网站建设基础中仑建设网站

调用地图接口展示数据库录入的不同类别地址信息&#xff0c;提供导航服务&#xff0c;手机端电脑端自适应。 语音介绍使用微软的tts接口可选不同语音性别生成

网站建设对企业的影响手机网站制作报价

为什么80%的码农都做不了架构师&#xff1f;>>> http://bbs.csdn.net/topics/340198955 android软键盘上推ui解决 good job 转载于:https://my.oschina.net/macleo/blog/204882

9.27动手动脑及课后实验

https://files.cnblogs.com/files/blogs/847689/动手动脑及课后实验.zip?t=1758987524&download=true

Combinatorics

[ICPC 2024 Nanjing R] Bingo 先给序列排序,权值相同的钦定标号前的更小。转化成 \(Ans\le a_k\) 的情况,等价于 \(k\) 个 \(1\),\(nm-k\) 个 \(0\) 放入 \(n\times m\) 的矩阵,至少有一行或者一列是全 \(1\)。考虑…

idea必备插件

1:gitToolBox————查看每行代码提交人 2:Translation————翻译插件 3:CheckStyle-IDEA————代码规范 4:Rainbow Brackets————彩虹括号 5:Nyan Progress Bar————可爱进度条 6:HighlightBracketP…