Skip to content

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

macOS + Mihomo 分流:国内直连、海外 WireGuard、SSH 备用与 TUN 防绕过

这是一套可回滚、可验证的 macOS 分流方案:

  • 国内、局域网和指定应用走本机物理网络。
  • 其他流量优先走 VPS 上的 WireGuard。
  • WireGuard 暂时失效时,后续 TCP 连接改走同一台 VPS 的 SSH SOCKS。
  • System Proxy 与 TUN 同时开启;TUN 扩大覆盖到遵循正常内核路由、未被 route exclusion 排除的 IPv4 UDP/WebRTC 等流量。

它不是“完美隐藏”方案。主线保留国内直连,因此不同网站看到不同出口是 预期;SSH 备用也不支持 UDP。需要所有公网目标统一使用 VPS 出口时,应 改成另一套单一出口策略,并接受国内访问可能变慢。

当前验证结论

本次公开基线在以下环境完成验证:

  • macOS 26.5.2,Apple Silicon
  • Clash Verge Rev 2.5.2
  • Mihomo 1.19.29

这些版本是证据锚点,不是照着攻略操作的硬门槛。其他近期版本通常沿用 相同架构;UI、DNS 合并、服务生命周期或字段默认值出现差异时,再读取本机 版本和对应 release notes。

2026-07-28 的 TUN 开/关/恢复 A/B 共完成 105 次经同一 mixed-port 入口的 真实请求,全部成功。关闭 TUN 没有表现得更快,部分海外请求反而更慢;这 只能支持“未发现 TUN 拖慢 System Proxy 路径”,不能证明 TUN 会提速,也 不外推到 TUN-only UDP。恢复后,两个独立 raw STUN IPv4 目标 的 UDP 响应与代理出口一致,普通公网路由重新进入 TUN。真实浏览器 WebRTC/ICE 在 Google Chrome 150 连续 3 轮均只得到与 HTTP 出口一致的 srflx,没有公网候选错配或 IPv6 candidate;本机检查还未观察到全局 IPv6 route。该结果不自动覆盖微信内嵌 WebView、Safari 或 Firefox。完整结果见 验收与性能基线

架构

flowchart LR
    A["遵循 macOS 代理设置的应用"] --> B["System Proxy"]
    C["未被排除的 IPv4 UDP/WebRTC 等流量"] --> D["TUN + auto-route"]
    B --> E["Mihomo Rule"]
    D --> E
    E -->|"国内 / 局域网"| F["DIRECT-WIFI"]
    E -->|"其他目标"| G["AUTO-FAILOVER"]
    G -->|"主路径,TCP + UDP"| H["Mihomo 原生 WireGuard"]
    G -->|"备用,仅 TCP"| I["本机 SSH SOCKS"]
    H --> J["VPS"]
    I --> J
Loading

System Proxy 和 TUN 是两个独立开关,可以同时为真。Clash Verge Rev 首页停留在“系统代理”区域,只代表当前显示的卡片,不代表 TUN 没运行。 进入 Mihomo 之后,真正决定 DIRECT-WIFI、WireGuard 或 SSH 的是规则和 策略组。详见 架构与边界

从哪里开始

当前状态 阅读入口
还没有 VPS 购买 VPS 前的选择
已有纯 Ubuntu VPS,需要 WireGuard 服务端 VPS 服务端配置
已有 VPS、WireGuard Peer 与 SSH macOS 客户端安装
已部署,需要完整验收 验收与性能基线
发生慢、断网或泄露检测异常 排障矩阵
准备交给本地智能体协助 智能体协作手册

快速部署

  1. 备份当前 Clash profile、应用设置和系统代理状态,记录回滚入口。
  2. 迁移用户保留一条已经通过真实请求的海外路径;全新部署保留 VPS 控制台 和管理员 SSH,直到第 4 步建立第一条 SSH SOCKS 海外路径。
  3. 在 VPS 建立 WireGuard 服务端与这台 Mac 的独立 Peer。
  4. 先建立 127.0.0.1:7898 的 SSH SOCKS,确认真实 HTTPS 请求成功。
  5. 把 WireGuard 私钥放进 Mihomo home 内权限为 0600 的私密 provider。
  6. 根据 公开 profile 模板 推导物理 接口和 route exclusions;不要复制别人的 VPS、DNS 或局域网值。
  7. 导入副本 profile,使用 Rule,同时开启 System Proxy 与 TUN。
  8. 验收清单 检查入口、路由、DNS、规则、主备、 WebRTC/STUN、IPv4/IPv6 与性能。

公共模板中的 REPLACE_WITH_...example.com 和示例接口都必须在私密 副本中替换;真实副本不得提交到 Git。

公开模板已把两个 provider 的持续健康检查设为 enable: truelazy: false,并把 fallback 失败门槛设为 2。当前机器仍运行旧 profile 中的遗留健康检查值;本次重写没有把公开模板静默部署到当前运行态。

两个不能混淆的目标

分流模式:本仓库主线

  • 国内目标走物理网络,速度和区域兼容性优先。
  • 海外目标与被 TUN 捕获的 STUN/UDP 走 VPS WireGuard。
  • 中国检测站若命中国内规则,看到中国出口属于设计结果。

单一出口模式:另一种策略

  • 所有公网目标都走 VPS,出口一致性优先。
  • 需要删掉或收窄公网 DIRECT 规则和公网 route exclusions。
  • 国内访问不再保证直连性能。

给某个 IP 检测域名单独加 PROXY 规则,只改变该站点,不会把分流模式 变成单一出口模式,也不能用来证明匿名。

WebRTC、DNS 与 fallback 的边界

  • 经典系统代理可能被 WebRTC 的 STUN UDP 绕过;本方案用 TUN 从更底层 扩大覆盖。raw STUN 脚本不等于浏览器 WebRTC/ICE 验收,两者都不能只看 开关。
  • dns-hijack 把匹配的 UDP/TCP DNS 导入 Mihomo,不等于自动接管任意 DoH、DoT、局域网 DNS 或 Bonjour/mDNS。
  • profile DNS 与 Clash Verge 全局 DNS 覆写必须只有一个配置所有者。
  • route-exclude-address 会让目标绕过 TUN。只排除确需直连的物理 LAN、 VPS underlay 和直连 DNS,并逐项验证。
  • WireGuard 主节点支持 UDP;SSH SOCKS 备用仅支持 TCP。主节点故障时, UDP 可能失败,fallback 不保证同一个失败请求透明重试。
  • WireGuard 与 SSH 共用同一台 VPS,不能覆盖 VPS 整机、账号、主机商或 上游共同故障。

验收不是看一个绿灯

至少确认:

  • controller 返回 mode=rule、TUN 开、auto-route=true
  • macOS HTTP/HTTPS 系统代理指向活动 mixed listener。
  • 普通公网 IPv4 路由进入 TUN;被排除的 LAN/DNS/VPS underlay 走物理 接口。
  • 国内与海外请求交错重复,实际规则命中符合预期。
  • WireGuard 与 SSH 分别真实可用;WireGuard handshake 和 transfer counters 在真实请求后更新。
  • 假故障演练后,新 TCP 连接切到 SSH;恢复后回到 WireGuard。
  • 两个独立 raw STUN IPv4 目标不显示本地 ISP 公网 IPv4;当前 Chrome 复核也通过,但实际发生问题的其他浏览器或 WebView 仍要单独测试。
  • Mihomo IPv6、系统全局 IPv6 route 与浏览器 candidate 被分开记录; 网络或配置变化后重新验收。
  • TUN A/B 没有新增失败或超过预设性能门槛。

诊断脚本只读系统与 Mihomo 状态,但会发送少量真实请求:

NETWORK_SERVICE="Wi-Fi" zsh scripts/diagnose.zsh

主动候选探测会更新健康历史,只在保存故障现场后使用:

ACTIVE_NODE_PROBES=1 NETWORK_SERVICE="Wi-Fi" zsh scripts/diagnose.zsh

需要比较显式代理、无显式 HTTP proxy 的请求和两个 raw STUN IPv4 出口时:

STUN_PROBES=1 NETWORK_SERVICE="Wi-Fi" zsh scripts/diagnose.zsh

这会向公共 IP 回显与 STUN 服务发送请求;脚本只报告是否一致,不打印实际 出口 IP。结果不能代替浏览器 WebRTC/ICE candidate 检查。

输出可能包含网关、接口和网络结构,公开分享前按 安全说明 脱敏。

仓库内容

运行仓库检查:

bash scripts/test-validate-repo.sh
bash scripts/validate-repo.sh

静态 CI 只能证明公开文件、结构与安全扫描通过,不能代替目标机器的端到端 网络验收。

About

macOS 上使用 Clash Verge Rev、Mihomo、WireGuard 与 SSH 备用通道实现国内直连、国外 VPS 分流的可复现指南

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages