2026.10.08 · 3 分钟阅读
Zerotier Watcher
macOS的网络管理,似乎口碑不太好,长期使用ZeroTier发现在Wi-Fi切换后,经常ZeroTier的路由会乱掉,有必要加上监控提醒。
监控实现
思路是用分流访问内网来监控:公网走当前 Wi-Fi,远端内网走 ZeroTier。launchd 每 30 秒运行检查脚本 + macOS 本机通知,重点检查:
| 检查项 | 正常条件 |
|---|---|
| 公网目标路由 | 出口是当前物理网络接口 |
| 远端内网目标路由 | 出口是对应 ZeroTier 虚拟接口,网关符合配置 |
| 远端服务连通性 | 一个稳定的内网 TCP/HTTP 服务可访问 |
| ZeroTier 网络状态 | 指定网络状态正常、接口存在 |
监控脚本需要:ZeroTier 网络 ID、一个远端内网 IP,以及可测试的端口。
mkdir -p ~/Library/LaunchAgents
cp com.local.zerotier-watch.plist \
~/Library/LaunchAgents/
launchctl bootstrap "gui/$(id -u)" \
~/Library/LaunchAgents/com.local.zerotier-watch.plist
监控处理流程:
flowchart TD
A["定时触发检查"] --> B["创建状态目录并获取锁"]
B --> C{"已有实例运行?"}
C -- 是 --> Z["退出"]
C -- 否 --> D["读取上次检查时间、失败次数、告警状态"]
D --> E{"首次运行或检查间隔过长?"}
E -- 是 --> F["重置失败次数、更新时间<br/>保留告警状态"]
F --> Y["释放锁并退出"]
E -- 否 --> G["检查指定 ZeroTier 网络状态和虚拟接口"]
G --> H{"网络正常且接口存在?"}
H -- 否 --> ERR["记录异常原因"]
H -- 是 --> I{"开启默认路由覆盖?"}
I -- 是 --> ERR
I -- 否 --> J{"远端内网目标的路由<br/>是否走对应 ZeroTier 接口?"}
J -- 否 --> ERR
J -- 是 --> K{"公网探测目标的路由存在<br/>且未走该 ZeroTier 接口?"}
K -- 否 --> ERR
K -- 是 --> L{"远端内网服务<br/>TCP 连接成功?"}
L -- 否 --> ERR
L -- 是 --> OK["失败次数清零"]
ERR --> M["连续失败次数加 1"]
M --> N{"达到失败阈值<br/>且尚未告警?"}
N -- 否 --> SAVE["保存检查时间、失败次数、告警状态"]
N -- 是 --> O["保存路由表、网络状态和异常原因<br/>日志达到大小上限时轮换"]
O --> P["发送 macOS 异常通知<br/>标记已告警"]
P --> SAVE
OK --> Q{"此前已告警?"}
Q -- 否 --> SAVE
Q -- 是 --> R["发送恢复通知、记录恢复日志<br/>清除告警状态"]
R --> SAVE
SAVE --> Ymac系统通知配置
如果日常设置了专注模式,需要为通知开启例外。例如:
在 系统设置 → 专注模式 → 减少干扰 → App → 允许通知 中添加“脚本编辑器”即可。
系统通知使用了osascript 发送通知,通常归到“脚本编辑器”这个应用。
恢复ZeroTier路由
目前还是手动重启服务。
sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist
sudo launchctl load /Library/LaunchDaemons/com.zerotier.one.plist