MeshNook技术与生活的角落

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 --> Y

mac系统通知配置

如果日常设置了专注模式,需要为通知开启例外。例如:

在 系统设置 → 专注模式 → 减少干扰 → App → 允许通知 中添加“脚本编辑器”即可。

系统通知使用了osascript 发送通知,通常归到“脚本编辑器”这个应用。

恢复ZeroTier路由

目前还是手动重启服务。

sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist
sudo launchctl load /Library/LaunchDaemons/com.zerotier.one.plist