Răsfoiți Sursa

vault backup: 2026-09-30 17:18:02

zhensolid 3 săptămâni în urmă
părinte
comite
d70fad7611

+ 202 - 0
02-家庭实验室/网络工具/EasyTier 私有组网 zlsh-net(tx6us 中继 + iStoreOS 锚点).md

@@ -0,0 +1,202 @@
+---
+tags:
+  - 网络
+  - EasyTier
+  - 组网
+  - 家庭实验室
+created: 2026-09-30
+---
+
+# EasyTier 私有组网 zlsh-net(tx6us 中继 + iStoreOS 锚点)
+
+相关:[[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、别贴公开群。
+
+## 三、新设备接入
+
+```bash
+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`。
+
+路由器上的节点参数(已生效):
+
+```bash
+/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`(固件升级保留)。
+
+## 五、家里设备可达性普查(2026-09-30,从 MacBook 走隧道)
+
+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`。
+
+## 六、踩过的 4 个坑(都是真金白银)
+
+### 1. 只 ping 通、TCP 全挂 → iStoreOS 防火墙
+
+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 会误判。**
+
+### 2. 隧道里别用 `nc -z` 判断端口
+
+EasyTier 用户态协议栈会先把 TCP 连接「接受」下来,`nc -z` 对**根本不存在的 IP** 也报成功
+(实测 `nc -z -G 1 10.99.0.55 22` 报 OPEN,但那台机器没有)→ 会得到满屏「所有端口都开着」的假结果。
+**必须用真实应用层证据**:HTTP 状态码、`SSH-2.0-…` banner。
+
+### 3. 从外面回家,家里局域网被隧道路由吞掉(2026-09-29 踩到)
+
+- **症状**:出门回来上不去 `10.10.10.25`(22/8888/11010 全超时),NAS、网关一起不通;overlay 同时断
+  (`easytier-cli peer` 里 mac-mini 变 `relay(2)`、rx/tx `0 B`)。
+- **原因**:在外时 EasyTier 自动装了 `10.10.10/24 → utun4`(正确);回家后这条没撤,macOS 想给 en0 装回直连 /24
+  时前缀已被占住 → 装不上 → 整个家里网段被吸进隧道。EasyTier 只在**新装**路由时检查冲突,对已有的不复检。
+- **立即修复**(管理员权限):
+
+```bash
+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)**两条并存**。
+
+### 4. macOS `/bin/sh` 的 `$VAR` + 中文坑
+
+脚本里写 `echo "下标 $IDX,值"` 会报 `IDX\uFFFD: unbound variable`——bash 3.2 把紧跟变量名的多字节字符
+并进了变量名。**一律写 `${IDX}`**。
+
+### 5. EasyTier 清理路由时,会把系统自己的直连 /24 一起删掉(2026-09-30 又踩到)
+
+改完配置 / `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 不会自动把它补回来。
+
+```bash
+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 配置后都顺手看一眼这条路由。**
+
+## 七、运维命令
+
+```bash
+# 中继(管理走阿里云跳板,家宽出口到它的 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` 在家里也同样能用。
+- 切网络后有**约 1 分钟**自愈空窗(先连中继再打通),刚切过去别急着判定「不通」。
+- 而且**中继会自动升级成直连**:2026-09-30 实测同一次会话里,macmini 那条腿从 `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 计数看流量算在谁头上。
+- 手机移动网络下 UDP 打洞打不通(双对称 NAT),走中继 → 延迟几百 ms;实测 ping 280–800 ms、
+  隧道里 300 KB 文件 ≈ 36 KB/s → **适合 SSH、路由器/群晖后台、Hindsight 这类小请求,大文件很慢**。
+- 家里设备看到的来源 IP 是路由器 `10.10.10.252`(若 NAS 有 IP 白名单按它放行)。
+- macmini 上原来的 `--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`,自带自检与回滚)。
+- **重启实测(2026-09-30 00:45,路由器):真重启一次后全部自动恢复,不需要重新配置** —— EasyTier 自启、接口名仍是
+  `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。)
+- 中继是 CentOS 7(已 EOL),仅作中继足够,不要再堆需要长期更新的服务。

+ 5 - 0
02-家庭实验室/网络工具/Easytier配置.md

@@ -1,6 +1,11 @@
 ---
 notion-id: 27aca4d7-cb7b-80e0-a18f-f1be7f48ac74
 ---
+> [!tip] 本机当前实际在用的方案(2026-09-30 起)
+> 见 [[EasyTier 私有组网 zlsh-net(tx6us 中继 + iStoreOS 锚点)]]——
+> tx6us 当公网中继、iStoreOS 当子网代理锚点、出门用 `10.99.0.X` 访问家里 `10.10.10.X`。
+> 下面这份是历史的 docker-compose 配置(另一个网络 `user_8743`),留作参考。
+
 [https://easytier.cn/guide/introduction.html](https://easytier.cn/guide/introduction.html)
 ### docker-compose配置文件
 ```bash

+ 1 - 0
02-家庭实验室/网络工具/异地组网.md

@@ -2,6 +2,7 @@
 notion-id: 24fca4d7-cb7b-8047-99ca-e21106b59c85
 ---
 [[Easytier配置]]
+[[EasyTier 私有组网 zlsh-net(tx6us 中继 + iStoreOS 锚点)]]
 [[Zerotier局域网配置]]
 [[Tailscale 配置]]
 > [!note]+ ### 开启端口转发