相关:[[Easytier配置]] · [[异地组网]] · [[Zerotier局域网配置]] · [[软路由维护]]
✅ 2026-09-29 ~ 09-30 部署完成,全部开机自启,实测可用。 工作区原始长文(含全部调试过程):
~/Documents/MacBook/easytier-tx6us-relay.md
| 节点 | 虚拟 IP | 角色 | 开机自启 |
|---|---|---|---|
tx6us VPS 61.110.28.176(CentOS 7) |
— | 中继:帮两端打洞,打不通兜底转发 | /etc/systemd/system/easytier.service(enabled) |
iStoreOS 软路由 10.10.10.252 |
10.126.126.4 |
子网代理锚点:把家里局域网搬进私有网 | /etc/init.d/easytier(procd,enable) |
| MacBook | 10.126.126.2 |
客户端 | /Library/LaunchDaemons/com.easytier.zlsh.plist |
macmini 10.10.10.25 |
10.126.126.3 |
客户端(上面跑着 Hindsight 记忆系统,不能移除) | 同款 plist |
设备间优先 P2P 直连(家里 macbook↔路由 5 ms、macmini↔路由 36 ms),中继只在打不通时介入。
| 项 | 值 |
|---|---|
| network-name | zlsh-net |
| network-secret | 52e24a00ef6a85180ece6d89ae3fd821 |
| 中继监听 | tcp://0.0.0.0:11010、udp://0.0.0.0:11010、ws://0.0.0.0:11011 |
| 私有模式 | --private-mode true(只允许持同一密钥的节点接入) |
⚠️ secret 等于这套内网的钥匙,泄露 = 任何人都能进你的虚拟内网。别提交 git、别贴公开群。
easytier-core -d \
--network-name zlsh-net \
--network-secret 52e24a00ef6a85180ece6d89ae3fd821 \
--peers tcp://61.110.28.176:11010 \
--peers udp://61.110.28.176:11010 \
-i 10.126.126.9/24 # 每台设备必须不同
验证:easytier-cli peer 能看到 tx6us-relay 与其它成员;easytier-cli route 看路由。
家里设备不用装任何东西,路由器在隧道里做地址转换,把 10.10.10.X 以别名 10.99.0.X 发布给其它节点:
| 出门敲这个 | = 家里的 |
|---|---|
10.99.0.23 |
NAS 10.10.10.23 |
10.99.0.252 |
iStoreOS 10.10.10.252 |
10.99.0.25 |
macmini 10.10.10.25 |
10.99.0.14 |
dev 10.10.10.14 |
10.99.0.254 |
PVE 10.10.10.254 |
在家照旧用 10.10.10.X(走 en0 直连,不经过隧道)。规 则通用:10.99.0.X ⇄ 10.10.10.X。
路由器上的节点参数(已生效):
/usr/bin/easytier-core \
--hostname istore-router --instance-name zlsh-istore \
--ipv4 10.126.126.4/24 \
--listeners tcp://0.0.0.0:11010 udp://0.0.0.0:11010 ws://0.0.0.0:11011 \
--peers udp://61.110.28.176:11010 tcp://10.10.10.25:11010 \
--proxy-networks 10.10.10.0/24->10.99.0.0/24 \
--private-mode true
配置与自启:二进制 /etc/easytier/,参数文件 /etc/easytier/easytier.conf(0600),
/etc/easytier/ 已写进 /etc/sysupgrade.conf(固件升级保留)。
21 台 ICMP 可达(.2 .3 .4 .5 .6 .7 .9 .10 .16 .17 .18 .19 .22 .23 .24 .25 .27 .29 .252 .253 .254),
其中有应用层证据的:
| 家里地址 | 证据 |
|---|---|
10.10.10.23 NAS |
HTTP 200 / HTTPS 200 / SSH-2.0-OpenSSH_8.2 |
10.10.10.252 iStoreOS |
HTTP 200 / HTTPS 200 / SSH-2.0-dropbear |
10.10.10.253 网关 |
HTTP 302 |
10.10.10.25 macmini |
SSH-2.0-OpenSSH_10.3、:8888 服务在 |
10.10.10.14 dev |
HTTP 403 / SSH-2.0-OpenSSH_9.9 |
10.10.10.254 PVE |
SSH-2.0-OpenSSH_10.0p2 Debian-13 |
10.10.10.16 / .24 |
SSH-2.0-OpenSSH_10.0p2 Debian-7 |
10.10.10.29 |
HTTP 200 / SSH-2.0-OpenSSH_8.8 |
10.10.10.9 |
HTTP 200 |
其它(.4 .5 .6 .7 .10 .17 .18 .19 .21 .22 .27)没回 ICMP 或常见端口,不代表不可达,
只是没开 HTTP/SSH;同网段内换它们的实际服务端口(SMB 445、AirPlay、RTSP…)照样能连。
不在 10.10.10.0/24 的网段(192.168.8.x、192.168.6.x 等)不在隧道里,需要另加 --proxy-networks。
iStoreOS 上 EasyTier 建的接口是 tun0。子网代理里 ICMP/UDP 走用户态协议栈(不过防火墙)、TCP 才走内核转发,
所以不放防火墙会出现「ping 10.99.0.23 3/3 通,curl http://10.99.0.23/ 秒拒 000」。
解法:给 tun0 加独立 fw4 zone(input/output/forward 全 ACCEPT + forwarding easytier→lan)后 fw4 reload。
改动前备份 /etc/config/firewall.bak-20260929-235841。
教训:验证子网代理必须用 TCP,只 ping 会误判。
nc -z 判断端口EasyTier 用户态协议栈会先把 TCP 连接「接受」下来,nc -z 对根本不存在的 IP 也报成功
(实测 nc -z -G 1 10.99.0.55 22 报 OPEN,但那台机器没有)→ 会得到满屏「所有端口都开着」的假结果。
必须用真实应用层证据:HTTP 状态码、SSH-2.0-… banner。
10.10.10.25(22/8888/11010 全超时),NAS、网关一起不通;overlay 同时断
(easytier-cli peer 里 mac-mini 变 relay(2)、rx/tx 0 B)。10.10.10/24 → utun4(正确);回家后这条没撤,macOS 想给 en0 装回直连 /24
时前缀已被占住 → 装不上 → 整个家里网段被吸进隧道。EasyTier 只在新装路由时检查冲突,对已有的不复检。立即修复(管理员权限):
sudo route delete -net 10.10.10.0/24
sudo route add -net 10.10.10.0 -netmask 255.255.255.0 -interface en0
sudo launchctl kickstart -k system/com.easytier.zlsh # overlay 还没好时再重启守护进程
持久方案(已实施):子网代理搬到路由器并改成映射网段 10.10.10.0/24->10.99.0.0/24(永不冲突)+
MacBook 加 --manual-routes 10.99.0.0/24(peer 传播来的代理路由一律不装)→ 这个坑结构性消除。
判据:netstat -rn -f inet | grep '^10.10.10/24' 应是 en0;正常状态是
10.10.10/24 → en0(家里直连)与 10.126.126/24 → utun4(overlay)两条并存。
/bin/sh 的 $VAR + 中文坑脚本里写 echo "下标 $IDX,值" 会报 IDX\uFFFD: unbound variable——bash 3.2 把紧跟变量名的多字节字符
并进了变量名。一律写 ${IDX}。
改完配置 / launchctl kickstart -k system/com.easytier.zlsh 之后,10.10.10/24 直连路由会消失,
路由表里只剩 10.10.10.3/32、10.10.10.252/32 两个 /32。家里设备仍然能连(改走默认路由绕到路由器一圈),
所以很隐蔽。原因:EasyTier 卸载它曾安装过的 10.10.10.0/24 时按前缀删,不管这个前缀现在是系统自己的
en0 直连路由;而 macOS 不会自动把它补回来。
sudo route add -net 10.10.10.0 -netmask 255.255.255.0 -interface en0 # 脚本 /tmp/et/restore-lan-route.sh
判据:route -n get 10.10.10.23 的 flags 里不应有 GATEWAY;netstat -rn -f inet | grep '^10.10.10/24'
应显示 link#14 … UCSc … en0。每次重启/改 EasyTier 配置后都顺手看一眼这条路由。
# 中继(管理走阿里云跳板,家宽出口到它的 22 被链路透明代理掐断)
ssh -J aliyun2 root@61.110.28.176
systemctl status easytier ; journalctl -u easytier -f
# 路由器(iStoreOS)
/etc/init.d/easytier status|restart
easytier-cli peer ; easytier-cli route ; easytier-cli node
# macOS 客户端
sudo launchctl kickstart -k system/com.easytier.zlsh
easytier-cli peer # macOS 无 watch,用 while 循环看
即时看状态(macOS):while true; do clear; easytier-cli peer; sleep 2; done
| 内容 | 位置 |
|---|---|
| 路由器防火墙(改前) | 路由器 /etc/config/firewall.bak-20260929-235841 |
| MacBook 的 EasyTier 参数(改前) | MacBook /tmp/et/plist.before-manual-routes |
| macmini 的 EasyTier 参数(改前) | macmini /tmp/et/plist.before-proxy-removal |
⚠️ 后两个在
/tmp,重启会被清(想长期留就挪到~/)。
10.99.0.X,不是家里原地址;书签 / App / SMB 挂载里写死 10.10.10.X 的,出门一律不通
(2026-09-30 实测:外面 ping 10.10.10.23 丢包 100%、curl 6 s 超时 000)。10.99.0.X 在家里也同样能用。relay(2)(133 ms)在无人工干预下
自动变成 p2p UDP 直连(42–48 ms,软路由 8.5 ms),拉 300 KB 只用 0.097 s ≈ 3 MB/s。判断方法:
easytier-cli peer 看 cost 列(p2p=直连 / relay(N)=中继);也可对比两条腿的 rx/tx 计数看流量算在谁头上。10.10.10.252(若 NAS 有 IP 白名单按它放行)。--proxy-networks 10.10.10.0/24 已于 2026-09-30 清理完成 → 全网只剩 istore-router
发布 10.99.0.0/24,没有任何节点再发布与家里同名的 10.10.10.0/24;macmini 的虚拟 IP 仍是 10.126.126.3,
Hindsight 不受影响(清理脚本 sudo sh /tmp/et/remove-macmini-proxy.sh,自带自检与回滚)。tun0、防火墙 zone 与 nft 规则在、映射网段 10.10.10.0/24->10.99.0.0/24 在、LAN 仍 10.10.10.252/24、
三个 peer 自动 p2p 重连;出门视角 TCP 实测 10.99.0.23 200/0.012s、10.99.0.252 200/0.014s、
10.99.0.25:8888 200/0.036s。(两台 Mac 的重启仍未实测;防火墙 zone 绑的是接口名 tun0,见坑 1。)