Dreamc's blog

zerotier组网(自建planet、moon)联动rustdesk远程管理 附加公网ipv6配置

·

,

zerotier组网(自建planet、moon)联动rustdesk远程管理 附加公网ipv6配置

一、Zerotier 原理(不想了解可跳过)

一个“分布式网络虚拟化器(distributed network hypervisor)”= 加密 P2P 网络(VL1) + 以太网虚拟层(VL2)

1️⃣ VL1:Peer-to-Peer 虚拟链路层(底层)

核心组件:

  • 行星根服务器:planet 负责节点发现、identity 查询(whois)、rendezvous 协助
  • 卫星根服务器:moon 协助planet,功能类似(提升稳定性 / 内网穿透能力)
  • 叶节点客户端:LEAF 客户端节点

每个节点在VL1上都被唯一标识为40位(10十六进制数字)的zerotier地址。

通信流程:
初始通信(还没直连)

        ┌──────────────┐
        │   Planet /   │
        │    Moon(R)   │
        └──────┬───────┘
               │
        ┌──────▼──────┐
        │             │
     ┌──▼───┐     ┌───▼──┐
     │Node A│     │Node B│
     └──────┘     └──────┘

           1. A→R 发包   
         ──────▼────────
        ┌──────────────┐
        │   Planet /   │
        │    Moon(R)   │
        └──────┬───────┘
               │
               │ 2. R 查找 B
               │
               ▼
        ┌──────────────┐
        │ 如果知道 B   │
        │ 转发给 B     │
        └──────┬───────┘
               │
        3. 同时发送 rendezvous
               │
     ┌─────────┴─────────┐
     │                   │
┌────▼────┐         ┌────▼────┐
│ 告诉 A   │         │ 告诉 B   │
│ 如何找B  │         │ 如何找A  │
└─────────┘         └─────────┘

🔁 打洞阶段(关键)

Node A                     Node B
   │                          │
   │ 4. 发送探测包(UDP)       │
   ├──────────────►           │
   │                          │
   │◄───────────────          │
   │ 5. 同时回包               │
   │                          │

👉 NAT 被“打洞”
✅ 成功后(直连)
Node A  ◄──────────────►  Node B
         P2P 直连(VL1)

不再经过 root
❌ 失败(fallback)
Node A → Root → Node B
(继续中继)

**安全性: **

Node ID:10 位十六进制字符串,每个 ZeroTier 客户端的唯一标识。该地址是从公共部分计算的公钥/私钥对的。节点的地址、公钥和私钥 密钥共同构成其身份。

数据包经过非对称公钥加密。

支持将ZeroTier作为高性能SDN/NFV协议使用在物理安全的网络上,该协议支持一种称为可信路径的功能。可以将所有zerotier设备配置在给定网络以跳过加密和认证。

2️⃣ VL2:虚拟以太网层(上层)

主要功能:
ARP / 广播 / 多播
VLAN(network ID)
ACL / flow rules
IP 分配(IPv4 / IPv6)

每个VL2网络(VLAN)通过一个64位(16十六进制数字)zerotier网络ID标识,该ID包含网络控制器的40位zerotier地址和一个24位数字确认该网络在该控制器上。

Network ID: 8056c2e21c123456
            |      |
            |         Network number on controller
            |
            ZeroTier address of controller

控制器是本层的核心,管理着节点的加入,证书的管理、网络的配置。与planet、moon服务器不同(他们负责VL1层的连接)

controller配置的网络路由和ip会即时的同步给在线的节点。

网络控制器向给特定成员节点颁发的所有凭据网络由控制器的密钥签名,以允许所有网络成员们来核实这些信息.

控制器数据以 JSON 格式存储在 ZeroTier 工作目录下。它可以复制、同步、放进去等等。控制器运行时,下面的文件不应被修改,否则可能导致数据丢失;如果直接编辑,请务必避免保存损坏的JSON,因为这可能导致控制器重启时的数据丢失。通过API远胜于直接修改这些文件。controller.d
本地网络控制器通常运行在127.0.0.1 端口 9993
具体API可以参考下面链接:https://docs.zerotier.com/api/service/v1/

本节参考官方文档:The Protocol | ZeroTier Documentation

问题点:

  • 国内访问官方 planet 有时不稳定
  • NAT / 防火墙导致打洞失败

👉 解决:

  • 自建 moon(加速+稳定)
  • 或自建 planet(完全私有网络)

二、组网实践()

1. 安装 Zerotier

Linux:

curl -s https://install.zerotier.com | sudo bash

windows:

https://download.zerotier.com/dist/ZeroTier One.msi

macos:

https://download.zerotier.com/dist/ZeroTier One.pkg

ios:

https://apps.apple.com/us/app/zerotier-one/id1084101492

官方下载网页:

ZeroTier | Download ZeroTier for All Platforms

官方github地址:

zerotier/ZeroTierOne: A Smart Ethernet Switch for Earth

2. 创建网络

方式1-官网创建

登录官网:
👉 https://my.zerotier.com
有新旧两个版本,都可以注册,选一个就行。
新版本只支持1个免费网络、10个设备
老版本支持3个免费网络、10个设备

方式2-使用自建控制器创建(私有化)

使用ztncui自建控制器
https://key-networks.com/ztncui/#installation

使用功能和官网差不多。
支持docker、EL8/9、Debian/Ubuntu。

x86架构deb包:
https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb
示例:

#安装ztncui前务必安装zeroiter
#安装ztncui
sudo apt install ./ztncui_0.8.14_amd64.deb

#配置防火墙规则
sudo ufw allow 3443 # ztncui后端端口,若无公网ip则不需要

#配置文件默认位置/opt/key-networks/ztncui/.env 需自建
sudo sh -c "echo ZT_TOKEN=`cat /var/lib/zerotier-one/authtoken.secret` > /opt/key-networks/ztncui/.env"
sudo sh -c "echo ZT_ADDR=127.0.0.1:9993 >> /opt/key-networks/ztncui/.env"  #这个就是zerotier的控制api接口地址
sudo sh -c "echo HTTPS_PORT=3443 >> /opt/key-networks/ztncui/.env"
sudo sh -c "echo NODE_ENV=production >> /opt/key-networks/ztncui/.env"

#权限管理
sudo chmod 400 /opt/key-networks/ztncui/.env
sudo chown ztncui:ztncui /opt/key-networks/ztncui/.env

#重启服务
sudo systemctl restart ztncui

#url:https://你的ip:3443/
#默认账户:admin
#默认密码:password

这个控制器安装在任意节点均可,但务必保持在线。
打开web界面后add network即可。

github链接:
https://github.com/key-networks/ztncui

3. 加入网络

管理员权限执行:

zerotier-cli join <network_id>

4. 授权节点

在控制器web界面
勾选设备授权

5. 配置路由和ip

添加虚拟局域网路由、ip分配起始地址、自动分配ipv4、ipv6。

至此,所有授权设备可以通过虚拟网络互相访问。


三、Moon 节点配置(可选)

👉 Moon = 你自己的“辅助根节点”

1. 准备条件

  • 一台公网服务器(推荐有 IPv6)
  • 开放端口:
9993/udp

2. 生成 moon 配置

在服务器执行:

sudo zerotier-idtool initmoon identity.public | sudo tee  moon.json

3. 修改 moon.json(关键)

编辑:

"stableEndpoints": [
  "你的公网IP/9993"
]

支持 IPv6:

"stableEndpoints": [
  "[你的IPv6]:9993"
]

👉 注意:

  • IPv6 必须加 []
  • 可以写多个 endpoint(IPv4 + IPv6)

4. 生成签名文件

sudo zerotier-idtool genmoon moon.json

生成:

000000xxxxxxxx.moon

5. 部署 moon

sudo mkdir -p /var/lib/zerotier-one/moons.d
sudo cp 000000*.moon /var/lib/zerotier-one/moons.d/
sudo systemctl restart zerotier-one

6. 客户端加入 moon

方式一

管理员权限执行

zerotier-cli orbit [moon节点id] [moon节点id]

方式二

.moon 文件复制到客户端:

/var/lib/zerotier-one/moons.d/

然后:

systemctl restart zerotier-one

检查:

zerotier-cli listmoons

7. 验证

zerotier-cli peers

看到类似:

moon  OK

四、Planet 节点(完全私有 Zerotier)

👉 Planet = 官方根服务器替代


把moon.json copy到个人目录
cd && sudo cp /var/lib/zerotier-one/moon.json ./planet.json

修改最后一行的”worldType”: “planet”

“stableEndpoints”: [填写你的planet公网ip和端口]

需要用mkmoonworld来编译planet文件(官网github上该工具源文件已经没有了)
https://g.in0.re/github.com/kaaass/ZeroTierOne/releases/download/mkmoonworld-1.0/mkmoonworld-x86

# 下载工具
wget https://g.in0.re/github.com/kaaass/ZeroTierOne/releases/download/mkmoonworld-1.0/mkmoonworld-x86 && sudo chmod +x mkmoonworld-x86

# 编译文件
./mkmoonworld-x86 ./moon.json && mv world.bin planet

# 复制到本机zerotier
sudo rm /var/lib/zerotier-one/planet && sudo cp planet /var/lib/zerotier-one/ && sudo chmod 755 /var/lib/zerotier-one/planet && sudo systemctl restart zerotier-one

下载planet文件 /var/lib/zerotier-one/planet
客户端替换planet
客户端目录

/var/lib/zerotier-one/planet #linux

C:\ProgramData\ZeroTier\One  #win

官网手机端需要base64 执行下面命令复制过去。
base64 planet

安卓端可以用这位师傅的
https://github.com/kaaass/ZerotierFix

  • 所有节点必须使用同一个 planet
  • 官方网络将不可用
  • 网络完全由你控制

👉 一句话总结:

moon = 辅助
planet = 接管

moon和planet配置参考博客:https://twiyin0.github.io/views/experience/ztncui.html#编译moons节点


五、构建SDN家庭网络


在控制器设置到局域网的静态路由

目标网段 网关
局域网网段 安装zerotier的用于转发的设备的虚拟网段ip

通过路由组网

1. windows客户端作为中继网关构建

开启ip转发

#管理员权限执行启用命令

reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v IPEnableRouter /t REG_DWORD /d 1 /f

# 查看是否成功 

ipconfig /all

    Windows IP 配置

        主机名  . . . . . . . . . . . . . : WIN-2PXXXXX
        主 DNS 后缀 . . . . . . . . . . . :
        节点类型  . . . . . . . . . . . . : 混合
        IP 路由已启用 . . . . . . . . . . : 是           # 成功
        WINS 代理已启用 . . . . . . . . . : 否
        DNS 后缀搜索列表  . . . . . . . . : lan
        
        
# 指定网络接口的ipv4开启转发功能  可用下条命令查看ifindex后再填入本命令
Set-NetIPInterface -ifindex zerotier的网络接口索引 -AddressFamily IPv4 -Forwarding Enabled

# 查看网络接口的转发情况
Get-NetIPInterface | Select-Object ifIndex, InterfaceAlias, AddressFamily, Forwarding | Format-Table

# 然后可看到其中
     60 ZeroTier One [xxxxxxxxxxxxxxxx]          IPv4    Enabled

配置局域网需要互联的设备:
有两种方式可以让局域网设备与zerotier虚拟网段设备互通。

# 方式一 很简单,把局域网需要组网的设备的网关设置成中继网关的ip
# 例子 配置静态ip
ip地址 xxx   局域网设备ip
子网掩码 xxx  同局域网一致
网关   xxx   中继网关的局域网ip
dns   xxx    任意dns
# 方式二 在路由器设置转发路由 需把防火墙局域网转发策略设置成允许
目标网段                    网关
zerotier的虚拟网段          中继网关的局域网ip

如果配置完仍无法访问
可能的原因

  1. 路由冲突 #查看路由表 route -4 print
  2. 防火墙转发策略未允许 # 检查配置项或文件/etc/config/firewall
  3. 中继网关的zerotier网络接口转发未启用 #Get-NetIPInterface | Select-Object ifIndex, InterfaceAlias, AddressFamily, Forwarding | Format-Table
  4. zerotier节点是否连上

2. Linux(ubuntu)客户端作为中继网关构建

开启ip转发


# 临时启用
echo 1 > /proc/sys/net/ipv4/ip_forward

# 永久启用,编辑 /etc/sysctl.conf 添加
net.ipv4.ip_forward=1

# 应用更改
sysctl -p

# 配置iptables
# 对物理网卡和虚拟网卡设置shell变量
PHY_IFACE=eth0; ZT_IFACE=zt7nnig26

# 启用nat 设置转发
sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT

# 设置持久化
sudo apt install iptables-persistent
sudo bash -c iptables-save > /etc/iptables/rules.v4

配置局域网需要互联的设备:
方式一: 添加路由 虚拟网段 中继网关ip
方式二:修改网关为中继网关ip
方式三: 路由器配置路由转发

3. openwrt作为中继网关构建

安装软件包 zerotier

# 安装
opkg update
opkg install zerotier

# 启用并加入网络
uci set zerotier.global.enabled='1'
uci delete zerotier.earth
uci set zerotier.mynet=network
uci set zerotier.mynet.id=<network_id>
uci commit zerotier
service zerotier restart

# 配置文件在/etc/config/zerotier

启用 IP 转发(OpenWrt 默认已启用)
`cat /proc/sys/net/ipv4/ip_forward`

# 创建新网络接口
uci -q delete network.ZeroTier
uci set network.ZeroTier=interface
uci set network.ZeroTier.proto='none'
uci set network.ZeroTier.device='ztXXXXXXXX' # Replace ztXXXXXXXX with your own ZeroTier device name
 
# 配置防火墙区域
uci add firewall zone
uci set firewall.@zone[-1].name='vpn'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].forward='ACCEPT'
uci set firewall.@zone[-1].masq='1'
uci add_list firewall.@zone[-1].network='ZeroTier'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='vpn'
uci set firewall.@forwarding[-1].dest='lan'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='vpn'
uci set firewall.@forwarding[-1].dest='wan'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='lan'
uci set firewall.@forwarding[-1].dest='vpn'
 
# 提交更改
uci commit
 
# 重启防火墙
/etc/init.d/firewall restart
# 重启openwrt
reboot

# 查看防火墙状态和防火墙通信规则
/etc/init.d/firewall status
nft list ruleset

openwrt官方文档:https://openwrt.org/docs/guide-user/services/vpn/zerotier

通过网络桥接组网

没有尝试,比路由组网复杂
官网文档:https://docs.zerotier.com/bridging/


六、rustdesk远程桌面工具配置


1. 下载即可使用

https://github.com/rustdesk/rustdesk/releases/tag/1.4.6
无需注册登录
被控端和控制端均需安装rustdesk。

2. 自建ID/中继服务器(自托管计划)

使用免费自托管计划就够用
官网不同环境安装参考:https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/

# 打开防火墙,云服务的话需到控制台打开
ufw allow 21114:21119/tcp
ufw allow 21116/udp
sudo ufw enable

# 方式一 docker安装
bash <(wget -qO- https://get.docker.com)
wget rustdesk.com/oss.yml -O compose.yml
sudo docker compose up -d

# 方式二 脚本安装服务
wget https://raw.githubusercontent.com/techahold/rustdeskinstall/master/install.sh
chmod +x install.sh
./install.sh
从那里,记下安装结束时显示的IP/DNS和密钥

# 方式三 使用deb包安装
wget https://github.com/rustdesk/rustdesk-server/releases/latest
sudo apt install <filename>.deb

3. 客户端配置ID/中继服务器

将安装后显示IP/DNS和密钥 分别插入客户端设置 > 网络 > ID/中继服务器的ID服务器密钥字段中,其他字段留空。如果不用官方中继服务器,那就把中继服务器字段也填上。

4. 联合zerotier使用

被控端安装rustdesk后开启ip访问,默认端口21118
可以在控制远程桌面的输入框直接输入zerotier组网后的ip进行访问。

实际应用中,rustdesk用的较少。


七、IPv6 公网访问配置(可选)

为什么想起折腾ipv6呢,因为在我zerotier手机端用移动网络进行打洞的时候,总是失败,看到有人说移动网络优先ipv6连接,才有了此尝试。如果需要组网的局域网都有ipv6,是不是就可以抛弃zerotier,进行直接访问呢,当然可以,配置路由器防火墙规则,把需要访问的设备应用端口进行端口转发。

1. planet/moon服务器有 IPv6

开放对应端口,zerotier默认udp 9993

重新配置planet或moon,步骤和上面章节一样,不赘述。


2. 家庭宽带使用 IPv6

路由器的ipv6配置为native,
openwrt2512默认配置即可
然后测试
curl https://v6.ipgg.cn
返回了ipv6,说明已经有ipv6
没有ipv6则需要查看路由器或光猫是否开启ipv6配置,(具体不同型号操作不同,需自行搜索)
如果开启了还没有公网ipv6,则联系运营商(宽带小哥)


3. 防火墙放行

建议根据需要进行端口转发,不要直接让wan访问路由器或lan。


4. NAT6 配置

这篇文章很好
https://www.xrgzs.top/posts/openwrt-istoreos-x-wrt-config-ipv6-nat6

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Index