macOS 菜单栏小工具 —— 把本机 TUN 代理的网络,经 Wi-Fi 热点摆渡给周围设备。
连上热点的手机、平板、游戏机不需要任何配置,自动走同一条代理线路。
Mac 用网线上网,同时跑着 TUN 模式的代理(FlClash / Clash Verge / mihomo / sing-box 等)。 想让 iPhone、iPad、Switch 这些不方便装代理客户端的设备也走代理时用它。
mihomo 这类 TUN 会用 0/1 + 128.0/1 两条路由抢走全部公网流量。开启系统自带的互联网共享、
打开 net.inet.ip.forwarding 之后:
客户端 ──Wi-Fi──> bridge100 ──查路由表──> utunX ──> 代理软件用户态重建连接 ──> 出网
热点客户端的包进 bridge100,查的是同一张路由表,自然落到 utunX,被代理软件在用户态
重新建立连接发出去 —— 所以客户端零配置就走了代理。
系统共享的 pf NAT 规则挂在物理网卡上,不匹配 utun,包会原样进 TUN,不会漏。 不需要自己写 NAT、不需要改 pf、不需要在客户端设代理。
到 Releases 下载 dmg,打开后把「摆渡」拖进 「应用程序」。App 是自签名的,首次打开会被 Gatekeeper 拦下,执行一次:
xattr -dr com.apple.quarantine /Applications/摆渡.app需要 macOS 14+ 和 Xcode 命令行工具。
git clone https://github.com/zzusec/ferry.git
cd ferry
./build_app.sh # 产出 摆渡.app
./make_dmg.sh # 顺便打个 dmg(可选)把 摆渡.app 拖进「应用程序」。想开机自启就到「系统设置 → 通用 → 登录项」加一条。
热点的名称和密码得让系统生成,App 只接管之后的开关:
- 插上网线
- 系统设置 → 通用 → 共享 → 互联网共享
- 「共享来源」选网线(如 USB 10/100/1000 LAN),「给以下设备使用」勾 Wi-Fi
- 点「Wi-Fi 选项」设好热点名称和密码,打开开关
之后就只用菜单栏那个渡轮图标了。
点菜单栏的渡轮图标:
摆渡 [开关]
✔ 上游 en6 192.168.1.20
✔ 代理 utun4 已接管全部流量
✔ 热点 192.168.2.1 经 en0 发射
────────────────────────────
已上船 2 台
📱 iPhone 192.168.2.2
📱 iPad 192.168.2.3
────────────────────────────
共享设置 退出
三行状态任意一行变橙色都会写清楚缺什么(没插网线 / TUN 没开 / 热点没起来)。
拨动开关会弹一次管理员密码框 —— 改 net.inet.ip.forwarding 和互联网共享配置需要 root。
FERRY_SELFTEST=1 ./摆渡.app/Contents/MacOS/Ferry状态项 已挂上菜单栏,面板 就绪
上游 en6 192.168.1.20 | TUN utun4 | 热点 192.168.2.1 | 共享已配置 true | 客户端 2
- 提权走
osascript ... with administrator privileges,每次开关弹一次密码框,没有装 sudoers 免密 - 只处理 IPv4;客户端若拿到 IPv6 可能绕过代理,介意就在系统里关掉 IPv6
- 开发验证环境为 macOS 26.5 + Apple Silicon + FlClash
MIT