用 ZEROTIER 低成本搭建虚拟局域网
不多介绍,你能找到这里来说明你已经知道他是什么并且知道他能帮你做什么了。
所以我们直接开始。
我们的方案是:服务器(官方或者 moon)+ 路由器(OpenWRT)+ NAT。
如果你的需求不高,具有比较好的网络环境(就是没墙),需要组网的端点也比较少,而且只有一个网要组,那么你可以跳过搭建 moon 服务器的步骤直接到下面配置。
搭建 moon 服务器
首先第一步是拥有一个带有公网 IPv4 的服务器,可以去各大云服务捞一个。腾讯云每隔一段时间就会有那种新人专享服务器,量大管饱还便宜的,甚至可以同时跑好几个服务都没问题。
当你已经买好了服务器,把服务器安装成 Linux 系统(Debian/Ubuntu 或者 Rocky/CentOS 都可以),先在云服务那里把 9993 端口打开,然后 ssh 到你的服务器上开始配置。
在服务器上安装 zerotier-one
# 安装 zerotier
curl -s https://install.zerotier.com | sudo bash如果安装顺利,你将会看到这样的消息:
...
Unpacking zerotier-one (1.16.1) ...
Setting up zerotier-one (1.16.1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/zerotier-one.service → /lib/systemd/system/zerotier-one.service.
Processing triggers for man-db (2.11.2-2) ...
*** Enabling and starting ZeroTier service...
Synchronizing state of zerotier-one.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable zerotier-one
*** Waiting for identity generation...
*** Success! You are ZeroTier address [ c332c5e85b ].就表示安装成功了。这里有一个 ZeroTier Address,也就是 id,很重要后面还会用到(不过不用担心,可以用 cat /var/lib/zerotier-one
/moon.json | grep id 命令找到。
现在可以把 zerotier 是设置为开机自启
# 启动服务并设置开机自启
sudo systemctl start zerotier-one
sudo systemctl enable zerotier-one生成 moon.json 文件
# 1. 进入ZeroTier配置目录
cd /var/lib/zerotier-one
# 2. 生成moon配置模板
sudo zerotier-idtool initmoon identity.public > moon.json
# 3. 查看生成的moon.json
cat moon.json你将会看到 moon.json 文件大概长这样:
{
"id": "c332c5e85b",
"objtype": "world",
"roots": [
{
"identity": "c332c5e85b:0:e29b6d7fd1ef79807159226bb71981babff2041d81c9015d8707f72fde8aef1ee43514a7a8aa113ef1c5a569ac025064d6a2a3103fcb6d5411f51ecaa0c1f722",
"stableEndpoints": []
}
],
"signingKey": "7cdccdd2568df6bcedbaa0ac16b3c5853aba541ac9007360ff601f165c3b697485ec31f3b1386f728310dbd5a895df251b084f7284696a4f6f39b6f5b1d3e243",
"signingKey_SECRET": "781d71c5e9f2e75a2764b56973e143852a46d790b24c53d284fcd52f3f8534acb7fe60fa1377743fab06b173813c45338d487bdac82cb201a20b97df6cf8a926",
"updatesMustBeSignedBy": "7cdccdd2568df6bcedbaa0ac16b3c5853aba541ac9007360ff601f165c3b697485ec31f3b1386f728310dbd5a895df251b084f7284696a4f6f39b6f5b1d3e243",
"worldType": "moon"
}
然后给你的 stableEndpoints 加上你的服务器 ip 和端口,如果有 IPv6 也可以加上:
{
"id": "c332c5e85b",
"objtype": "world",
"roots": [
{
"identity": "abcdef1234:0:0123456789abcdef...",
"stableEndpoints": ["81.69.15.98/9993"] # ← 添加这行,IP换成您的公网IP
}
],
...
}然后生成签名文件
# 1. 生成.moon文件(这是签名后的配置文件)
sudo zerotier-idtool genmoon moon.json
# 2. 创建moons.d目录(如果不存在)
sudo mkdir -p moons.d
# 3. 移动.moon文件到moons.d目录
sudo mv *.moon moons.d/
# 查看生成的文件
ls -la moons.d/你将会看到一个 0000 开头的 .moon 格式的文件,这个就是我们要的签名。也就是在 zerotier-idtool 那一行命令时生成的,moon 服务器要求在 moods.d 目录下找到这个签名文件才可以使用,所以我们需要创建这个目录并且移动文件进去。
root@VM-16-12-debian:/var/lib/zerotier-one# ls -la moons.d/
total 12
drwxr-xr-x 2 root root 4096 Feb 3 13:30 .
drwxr-xr-x 5 zerotier-one zerotier-one 4096 Feb 3 13:30 ..
-rw-r--r-- 1 root root 259 Feb 3 13:29 000000c332c5e85b.moon
注意:这里需要把这个 000000c332c5e85b.moon 文件下载下来,后面配置 OpenWRT 的时候需要用到它。
然后重启 zerotier-one
# 重启服务使配置生效
sudo systemctl restart zerotier-one
# 检查服务状态
sudo systemctl status zerotier-one
# 查看日志确认moon加载成功
sudo journalctl -u zerotier-one -f最后再配置一下防火墙,允许 9993 出入
# Ubuntu/Debian使用ufw
# 如果没有 ufw 命令可以 apt-get install ufw 一下再执行
sudo ufw allow 9993/udp
sudo ufw reload
# CentOS/RHEL使用firewalld
sudo firewall-cmd --permanent --add-port=9993/udp
sudo firewall-cmd --reload
# 或者直接使用iptables
sudo iptables -A INPUT -p udp --dport 9993 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4这样 moon 服务器就配置好了。
配置域名解析
我建议你给服务器配置一个域名解析,方便个客户端连接使用,也方面使用 GUI 配置时在不用输入 ip。
下面的配置中,我们假设你配置了域名 vpn.mitkimi.com。
一键脚本
我写了一个脚本,在 Debian 或者 Ubuntu 上可以一键安装,如果是 CentOS 系的伙伴可以让 AI 帮你改一个。
wget -c https://raw.githubusercontent.com/mitkimi/zerotier-moon-init/refs/heads/master/debian.sh
bash ./debian.sh配置软路由
OpenWRT 这边我推荐 iStoreOS,它是一个很优秀的编译版本,而且有应用商店,可以直接配置安装不需要通过命令行。不过你已经做到这一步了,命令行肯定也能搞定,这里就不啰嗦了。
需要参与组网的每一个 OpenWRT 都需要做。
配置接口
浏览器访问到你的路由器,例如我的是 http://10.1.5.1 ,登录到管理,进网络 -接口 ,点击“添加新接口”,配置:
名称:zerotier
协议:ZeroTier
网络ID:你的 ZeroTier 网络 ID,moon 服务器从 ztncui 或 CLI 中创建网络获得,官方的从官网登录后创建网络获得。这一步会在下面“配置路由表”->“创建网络 ID”中介绍。
启用:√然后进入 OpenWRT 的 SSH,把刚才下载的 moon 文件放进 /var/lib/zerotier-one/moons.d 目录。
# 创建 Moon 配置目录(如果没有)
mkdir -p /var/lib/zerotier-one/moons.d
# 然后把 .moon 文件传进这个目录,可以用 WinSCP 或者 scp 命令,例如:
scp /var/lib/zerotier-one/moons.d/000000c332c5e85b.moon \
root@10.1.5.1:/var/lib/zerotier-one/moons.d/打开 NAT
在软路由上打开 NAT 可以让各局域网中的各个终端可以跨虚拟局域网互相访问。
配置虚拟局域网
现在各(小)局域网的 OpenWRT 都已经连接到 Moon 节点,接下来需要配置 ZeroTier 网络的路由规则,这是让各办公室局域网能互相访问的关键。
下面的每一步需要在哪里做,会在二级标题下面第一行的方括号中标记。
创建网络 ID
[Moon 或 zerotier 官方服务]
如果你使用官方服务,就在 https://my.zerotier.com 中创建网络。如果你使用 Moon 服务器,就在 Moon 服务器的 ztncui(也就是例子中 vpn.mitkimi.com)创建网络,然后你将会得到一个网络 ID,假设是 8056c2e21c000001。
记好这个 ID,后面还会用到。
创建好网络 ID 以后,它会分配 IPv4 的虚拟网络地址空间,例如 10.147.17.0/24。
加入这个网络
[OpenWRT]
在服务中找到 zerotier,把网络 ID 8056c2e21c000001 贴进去,点击保存。OpenWRT 的 zerotier-one 会自动加入这个网络。
如果是使用 CLI,命令是zerotier-cli join 8056c2e21c000001 。
每一台 OpenWRT 都要配置。
授权加入这个网络
[Moon 或 zerotier 官方服务]
进入你的网络,点击 Members 标签页,你就会看到每个小局域网的设备待加入。点击前面的 Auth 的勾给予授权,点击 Assign IP 旁边的 Auto(官网有,Moon 没有)即可。
我会建议你一个一个的添加,这样就知道哪一个终端了,你也可以给他们填写备注,方便后续的排查。
服务器会给你的每一个终端分配一个虚拟 IP,假设:
我们需要使用这些虚拟 IP 来配置子网路由。
配置子网路由
[Moon 或 zerotier 官方服务,**官方服务需要付费**]
这一步最关键,他是允许各个终端之间可以互相访问的最重要的步骤。
进入 Network -> Routes 标签页,添加以下的路由规则(注意,你需要根据你的实际情况来填写)
然后点击 Save Changes。
配置防火墙转发
[OpenWRT]
每一个 OpenWRT 都要配置:进入 网络 -> 防火墙 :
在常规设置中弃用 SYN-flood 防御(默认保持勾选);
区域转发:找到 LAN -> WAN 转发规则,确保已经勾选;
添加 ZeroTier 区域:点 添加 按钮,按照以下的信息进行配置:
名称:zerotier
网络:zerotier
输入:accept
输出:accept
转发:accept
IP 动态伪装(MASQUERADE):√启用
MMS 钳制:√启用回到区域转发,添加两条转发规则:
LAN->ZeroTier:源区域:lan,目标区域:zerotier
ZeroTier -> LAN:源区域:zerotier,目标区域:lan
进入”通信规则“选项卡:
查找现有的 WAN 规则,找到名称为 ”Allow-ZeroTier“ 或者类似的规则,如果没有就添加;
添加 ZeroTier 端口规则:名称: Allow-ZeroTier-UDP;协议: UDP; 源区域: wan; 目标区域: 设备 (路由器本身) ;目标端口: 9993; 操作: 接受
添加接口规则(两条)
允许 ZeroTier 入口流量:名称: ZeroTier-In,协议: 全部,源区域: zerotier,目标区域: 设备,操作: 接受;
允许ZeroTier 出口流量:名称: ZeroTier-Out ,协议: 全部, 源区域: 设备, 目标区域: zerotier, 操作: 接受。
配置个人终端
有的时候你需要在电脑或者手机上链接,这时你就需要在电脑上安装 zerotier 客户端了。