个人 VPN、公司 VPN、直连,三者在 macOS 上并行不悖。 rowt 能做到这一点,恰恰因为它不是 VPN。
逐连接分流 · 实时可观测 · 不写系统路由表
这是一个资源独占问题,不是配置问题。
Google 走自己的 VLESS 服务器,内网走公司 VPN,百度直连,三者同时成立。
Shadowrocket 与公司 VPN 客户端都属于数据包隧道,各自建立一块
utun 虚拟网卡,也都要占据默认路由;macOS 只让其中一个生效。
反复手动切换:连公司 VPN,Google 不通;开个人 VPN,内网进不去。
两块 utun 争同一张路由表。后连接的一方取走默认路由,
先连接的那个随即失效,且没有任何提示。
决定权在每条连接,而不是整台机器。
google.com 一条路,jira.corp 另一条,baidu.com 第三条。
rowt 用 sing-box 起一个用户态代理,监听
127.0.0.1:7890。代理不碰路由表,自然不与公司 VPN 争抢资源;
应用把连接交过来,由它逐条判断该走哪个出口。
换一个层次解决问题:不在网络层抢路由,而在应用层做分发。
| 常见 VPN 客户端 | rowt | |
|---|---|---|
| 实现方式 | 数据包隧道(utun) | 监听端口的本地代理 |
| 路由表 | 占据默认路由 | 只读,不写 |
| 与公司 VPN 共存 | 不能,只能活一个 | 可以,天然如此 |
| 分流粒度 | 全量,或不可控的分流 | 按连接、按域名 |
| 是否需要 root | 需要 | 不需要 |
| 判断依据 | 目标 IP | 嗅探到的域名,早于 DNS |
代价:只覆盖走代理的流量;裸 ping、ssh
以及任何不读系统代理设置的程序都会绕过。取舍写在明处,不做隐性承诺。
连到自己的 VPS,支持 VLESS / VMess / AnyTLS / hysteria2。 socket 绑定物理网卡,公司 VPN 占着默认路由也不影响,照样经家庭路由器出网。
google.com · youtube.com · geosite:github
socket 不绑网卡,域名交系统解析器处理,顺着系统路由表
直接进入 utunN。内容可自行生成,见后文 corp sync。
*.intranet.example.com · 10.0.0.0/8
绑定物理网卡,两条隧道都不走。未被任何名单命中的流量默认走这里, 国内站点保持原速,不额外绕行。
baidu.com · mirrors.debian.org · 其余全部
当场拒绝,不解析也不连接。广告与遥测域名连不上会持续重试, CPU 往往因此被耗掉;这条通道正是为此而设。
doubleclick.net · google-analytics.com
流量如何进入 rowt、如何被分类、又从哪里出去。
自上而下,命中即止。
连接进来,sing-box 先嗅探目标域名,这一步早于任何 DNS 查询;取得域名后,逐条匹配规则。
最长后缀跨通道比较。escape 中的 api.foo.com 一定优先于
block 中的 foo.com,与通道先后无关。
同一个 CDN 地址背后,既有被封锁的站点,也有正常的站点,IP 说明不了问题。 能标识目的地的只有域名;嗅探取得域名时 DNS 尚未查询,污染也就无从发生。
复现的就是线上那套规则;路由器在运行时,还会补一次真实请求验证。
三个层面,rowt 只管两个。
| 层面 | 回答的问题 | 归属 |
|---|---|---|
| 通道 | 走代理的连接从哪个出口出去 | rowt |
| DNS | 哪个解析器回答这个域名 | rowt |
| 系统路由 | 不走代理的流量从哪块网卡出去 | 刻意不管 |
改路由表需要常驻的 root 守护进程,而 root 进程不应执行用户可写的代码。 rowt 由 brew 安装、文件用户可写、更新频繁,恰属最不适合以 root 运行的一类。 按最小权限原则,这一层被主动排除在外:只读这张表,从不写入。
真正需要动路由表的场景,交给一个独立的小型守护进程, 与 rowt 不共享任何文件。
七步装好。
全程开着现有 VPN 操作,rowt up 需要联网下载
sing-box;整套跑通后再切回公司 VPN。这张清单可随时用 rowt onboard 打印,并标出当前进度。
支持从 Shadowrocket、Clash Verge、V2Box、FlClash 导入。每个客户端各跑一次, 结果累加进同一份待确认文件,并标注来源;删掉不需要的,再确认写入。
也可直接添加分享链接:
rowt server add '<vless://…>'
缺 sing-box 会自动获取;探测适用模式,渲染配置,拉起路由器,打开系统代理。
退出原 VPN,连接公司 VPN,各取一个域名确认走向。
escape 出厂已带一份(Google、GitHub、维基、X 等);corp 会从 VPN 路由自行生成。按需补充:
geosite:<名称>
引入一份维护好的规则集,涵盖该服务的全部域名与各国后缀,无需逐条罗列;更精确的条目仍然优先。
连接状态下执行一次 corp sync;此后看门狗每一拍自动重跑。
装上看门狗:网络变化自动重载, 隧道卡死或崩溃自动恢复,登录时清理残留代理设置。
系统代理只覆盖浏览器与图形应用。命令行工具不读系统代理,只认
http_proxy / https_proxy / all_proxy。rowt 提供三种方式。
这两条别名由 rowt shell-init 提供,
在当前 shell 内设置与清除上述变量;同时装好 Tab 补全。
当场探测哪条路径确实通得了外网:当前 shell 的设置、系统代理、 rowt 自身端口、直连,取第一条可用的执行命令;全部不通则不执行。
系统代理当前指向何处、是否指向 rowt, 以及可直接粘贴到别处的 export 行。
rowt run 的由来:机器上并存多个代理软件,
网络一天多变,"该填哪个值"始终在动;猜错后的报错又难以定位。与其猜,不如现测。
按使用频率排列。
最常用的一套动作:执行 rowt direct errors 10m,
查看刚才在直连上失败的域名;超时与 reset 基本即被封锁,把确需使用的加入 escape。
一屏之内,一目了然。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ _ __ _____ __| |_ MONITOR uptime 3h 15m │ │ | '__/ _ \ \ /\ / /| __| ● LIVE mode host · en0 server JP-Tokyo 42 ms │ │ | | | (_) \ V V / | |_ sys proxy on router running · 3% │ │ |_| \___/ \_/\_/ \__| collector on watch on │ │ │ ├─┤ live connections ├───────────────────────────────────────────────────────┬─┤ errors & blocked ├────────────────────────────┤ │ all ↑ 2.9 MB/s ↓ 3.5 MB/s 27 426.4M 1.9G │ aggregated over 5m [10m] 1h 24h │ │ escape ↑ 2.7 MB/s ↓ 3.5 MB/s 18 417.1M 1.3G │ transient 12 · 1 dom │ │ corp ↑ 144 KB/s ↓ 44 KB/s 5 8.1M 414.6M │ persistent 50 · 5 dom │ │ direct ↑ 5 KB/s ↓ 2 KB/s 4 1.2M 176.9M │ blocked 57 · 5 dom │ ├────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────┤ │ LANE HOST:PORT # UP DOWN RULE │ COUNT TYPE DOMAIN │ │ escape i.ytimg.com:443 5 8.0M 352.2M domain_suffix │ 15 timeout vpn.corp.example.com │ │ escape raw.githubusercontent.com:443 2 915K 96.8M domain_suffix │ 13 blocked googlesyndication.com │ │ escape fonts.gstatic.com:443 3 12.5M 43.1M domain_suffix │ 13 blocked doubleclick.net │ │ escape www.youtube.com:443 5 18.2M 427.7M domain_suffix │ 12 dns gateway.icloud.com │ │ escape api.anthropic.com:443 2 376.1M 414.4M domain_suffix │ 11 timeout dl.google.com │ │ escape en.wikipedia.org:443 1 1.4M 1.8M domain_suffix │ 11 blocked criteo.com │ │ corp jira.corp.example.com:443 5 8.1M 414.6M domain_suffix │ 10 blocked adnxs.com │ │ direct mirrors.debian.org:443 1 509K 128.6M final │ 10 blocked google-analytics.com │ │ direct dl.google.com:443 1 104K 47.8M final │ 10 reset x.com │ │ direct gateway.icloud.com:443 2 610K 519K final │ 8 timeout rr5.googlevideo.com │ │ escape netflix.com 0 0B 0B │ │ │ corp backups.corp.example.com 0 0B 0B │ │ │ escape mail.google.com 0 0B 0B │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├────────────────────────────────────────────────────────────────────────────┴─┤ server health ├───────────────────────────────┤ │ 10 servers · 9 up · 1 down │ │ ▶ JP-Tokyo 42 ms JP-Osaka 175 ms KR-Seoul 72 ms DE-Frankfurt 195 ms HK-1 82 ms SG-1 81 ms TW-Taipei 110 ms │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
四个区域,下面逐个展开。
数据均来自 2 秒一拍的采样;不按控制键则不作任何改动。
系统是否正常,先看这一栏。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ _ __ _____ __| |_ MONITOR uptime 3h 15m │ │ | '__/ _ \ \ /\ / /| __| ● LIVE mode host · en0 server JP-Tokyo 42 ms │ │ | | | (_) \ V V / | |_ sys proxy on router running · 3% │ │ |_| \___/ \_/\_/ \__| collector on watch on │ │ │ ├─┤ live connections ├───────────────────────────────────────────────────────┬─┤ errors & blocked ├────────────────────────────┤ │ all ↑ 2.9 MB/s ↓ 3.5 MB/s 27 426.4M 1.9G │ aggregated over 5m [10m] 1h 24h │ │ escape ↑ 2.7 MB/s ↓ 3.5 MB/s 18 417.1M 1.3G │ transient 12 · 1 dom │ │ corp ↑ 144 KB/s ↓ 44 KB/s 5 8.1M 414.6M │ persistent 50 · 5 dom │ │ direct ↑ 5 KB/s ↓ 2 KB/s 4 1.2M 176.9M │ blocked 57 · 5 dom │ ├────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────┤ │ LANE HOST:PORT # UP DOWN RULE │ COUNT TYPE DOMAIN │ │ escape i.ytimg.com:443 5 8.0M 352.2M domain_suffix │ 15 timeout vpn.corp.example.com │ │ escape raw.githubusercontent.com:443 2 915K 96.8M domain_suffix │ 13 blocked googlesyndication.com │ │ escape fonts.gstatic.com:443 3 12.5M 43.1M domain_suffix │ 13 blocked doubleclick.net │ │ escape www.youtube.com:443 5 18.2M 427.7M domain_suffix │ 12 dns gateway.icloud.com │ │ escape api.anthropic.com:443 2 376.1M 414.4M domain_suffix │ 11 timeout dl.google.com │ │ escape en.wikipedia.org:443 1 1.4M 1.8M domain_suffix │ 11 blocked criteo.com │ │ corp jira.corp.example.com:443 5 8.1M 414.6M domain_suffix │ 10 blocked adnxs.com │ │ direct mirrors.debian.org:443 1 509K 128.6M final │ 10 blocked google-analytics.com │ │ direct dl.google.com:443 1 104K 47.8M final │ 10 reset x.com │ │ direct gateway.icloud.com:443 2 610K 519K final │ 8 timeout rr5.googlevideo.com │ │ escape netflix.com 0 0B 0B │ │ │ corp backups.corp.example.com 0 0B 0B │ │ │ escape mail.google.com 0 0B 0B │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├────────────────────────────────────────────────────────────────────────────┴─┤ server health ├───────────────────────────────┤ │ 10 servers · 9 up · 1 down │ │ ▶ JP-Tokyo 42 ms JP-Osaka 175 ms KR-Seoul 72 ms DE-Frankfurt 195 ms HK-1 82 ms SG-1 81 ms TW-Taipei 110 ms │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
系统是否正常,这一栏即可判断,无需下翻。
sys proxy 单元格什么在跑,以及为什么这么跑。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ _ __ _____ __| |_ MONITOR uptime 3h 15m │ │ | '__/ _ \ \ /\ / /| __| ● LIVE mode host · en0 server JP-Tokyo 42 ms │ │ | | | (_) \ V V / | |_ sys proxy on router running · 3% │ │ |_| \___/ \_/\_/ \__| collector on watch on │ │ │ ├─┤ live connections ├───────────────────────────────────────────────────────┬─┤ errors & blocked ├────────────────────────────┤ │ all ↑ 2.9 MB/s ↓ 3.5 MB/s 27 426.4M 1.9G │ aggregated over 5m [10m] 1h 24h │ │ escape ↑ 2.7 MB/s ↓ 3.5 MB/s 18 417.1M 1.3G │ transient 12 · 1 dom │ │ corp ↑ 144 KB/s ↓ 44 KB/s 5 8.1M 414.6M │ persistent 50 · 5 dom │ │ direct ↑ 5 KB/s ↓ 2 KB/s 4 1.2M 176.9M │ blocked 57 · 5 dom │ ├────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────┤ │ LANE HOST:PORT # UP DOWN RULE │ COUNT TYPE DOMAIN │ │ escape i.ytimg.com:443 5 8.0M 352.2M domain_suffix │ 15 timeout vpn.corp.example.com │ │ escape raw.githubusercontent.com:443 2 915K 96.8M domain_suffix │ 13 blocked googlesyndication.com │ │ escape fonts.gstatic.com:443 3 12.5M 43.1M domain_suffix │ 13 blocked doubleclick.net │ │ escape www.youtube.com:443 5 18.2M 427.7M domain_suffix │ 12 dns gateway.icloud.com │ │ escape api.anthropic.com:443 2 376.1M 414.4M domain_suffix │ 11 timeout dl.google.com │ │ escape en.wikipedia.org:443 1 1.4M 1.8M domain_suffix │ 11 blocked criteo.com │ │ corp jira.corp.example.com:443 5 8.1M 414.6M domain_suffix │ 10 blocked adnxs.com │ │ direct mirrors.debian.org:443 1 509K 128.6M final │ 10 blocked google-analytics.com │ │ direct dl.google.com:443 1 104K 47.8M final │ 10 reset x.com │ │ direct gateway.icloud.com:443 2 610K 519K final │ 8 timeout rr5.googlevideo.com │ │ escape netflix.com 0 0B 0B │ │ │ corp backups.corp.example.com 0 0B 0B │ │ │ escape mail.google.com 0 0B 0B │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├────────────────────────────────────────────────────────────────────────────┴─┤ server health ├───────────────────────────────┤ │ 10 servers · 9 up · 1 down │ │ ▶ JP-Tokyo 42 ms JP-Osaka 175 ms KR-Seoul 72 ms DE-Frankfurt 195 ms HK-1 82 ms SG-1 81 ms TW-Taipei 110 ms │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
上半部是每条通道的速率汇总,下半部一行一个目标主机。
domain_suffix、domain、
rule_set 或 final最后一列回答的是"凭什么走这条通道",排查分流问题时最常看。
灰显、字节为 0B 的是休眠行:近期出现过,当前空闲。位置保持不变,
避免正在观察的主机一安静就从列表中消失。
什么在失败,以及属于哪一类。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ _ __ _____ __| |_ MONITOR uptime 3h 15m │ │ | '__/ _ \ \ /\ / /| __| ● LIVE mode host · en0 server JP-Tokyo 42 ms │ │ | | | (_) \ V V / | |_ sys proxy on router running · 3% │ │ |_| \___/ \_/\_/ \__| collector on watch on │ │ │ ├─┤ live connections ├───────────────────────────────────────────────────────┬─┤ errors & blocked ├────────────────────────────┤ │ all ↑ 2.9 MB/s ↓ 3.5 MB/s 27 426.4M 1.9G │ aggregated over 5m [10m] 1h 24h │ │ escape ↑ 2.7 MB/s ↓ 3.5 MB/s 18 417.1M 1.3G │ transient 12 · 1 dom │ │ corp ↑ 144 KB/s ↓ 44 KB/s 5 8.1M 414.6M │ persistent 50 · 5 dom │ │ direct ↑ 5 KB/s ↓ 2 KB/s 4 1.2M 176.9M │ blocked 57 · 5 dom │ ├────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────┤ │ LANE HOST:PORT # UP DOWN RULE │ COUNT TYPE DOMAIN │ │ escape i.ytimg.com:443 5 8.0M 352.2M domain_suffix │ 15 timeout vpn.corp.example.com │ │ escape raw.githubusercontent.com:443 2 915K 96.8M domain_suffix │ 13 blocked googlesyndication.com │ │ escape fonts.gstatic.com:443 3 12.5M 43.1M domain_suffix │ 13 blocked doubleclick.net │ │ escape www.youtube.com:443 5 18.2M 427.7M domain_suffix │ 12 dns gateway.icloud.com │ │ escape api.anthropic.com:443 2 376.1M 414.4M domain_suffix │ 11 timeout dl.google.com │ │ escape en.wikipedia.org:443 1 1.4M 1.8M domain_suffix │ 11 blocked criteo.com │ │ corp jira.corp.example.com:443 5 8.1M 414.6M domain_suffix │ 10 blocked adnxs.com │ │ direct mirrors.debian.org:443 1 509K 128.6M final │ 10 blocked google-analytics.com │ │ direct dl.google.com:443 1 104K 47.8M final │ 10 reset x.com │ │ direct gateway.icloud.com:443 2 610K 519K final │ 8 timeout rr5.googlevideo.com │ │ escape netflix.com 0 0B 0B │ │ │ corp backups.corp.example.com 0 0B 0B │ │ │ escape mail.google.com 0 0B 0B │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├────────────────────────────────────────────────────────────────────────────┴─┤ server health ├───────────────────────────────┤ │ 10 servers · 9 up · 1 down │ │ ▶ JP-Tokyo 42 ms JP-Osaka 175 ms KR-Seoul 72 ms DE-Frankfurt 195 ms HK-1 82 ms SG-1 81 ms TW-Taipei 110 ms │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
按滚动窗口聚合,w 或 [ ] 在 5m → 10m → 1h → 24h → 全部 之间切换。
标准动作:筛到 direct 通道,看 persistent 一类,把确需使用的接入 escape, 全程不必离开面板。
仅记录失败连接。此栏为空表示没有错误,不代表没有流量。
从哪里出网,延迟如何。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ _ __ _____ __| |_ MONITOR uptime 3h 15m │ │ | '__/ _ \ \ /\ / /| __| ● LIVE mode host · en0 server JP-Tokyo 42 ms │ │ | | | (_) \ V V / | |_ sys proxy on router running · 3% │ │ |_| \___/ \_/\_/ \__| collector on watch on │ │ │ ├─┤ live connections ├───────────────────────────────────────────────────────┬─┤ errors & blocked ├────────────────────────────┤ │ all ↑ 2.9 MB/s ↓ 3.5 MB/s 27 426.4M 1.9G │ aggregated over 5m [10m] 1h 24h │ │ escape ↑ 2.7 MB/s ↓ 3.5 MB/s 18 417.1M 1.3G │ transient 12 · 1 dom │ │ corp ↑ 144 KB/s ↓ 44 KB/s 5 8.1M 414.6M │ persistent 50 · 5 dom │ │ direct ↑ 5 KB/s ↓ 2 KB/s 4 1.2M 176.9M │ blocked 57 · 5 dom │ ├────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────┤ │ LANE HOST:PORT # UP DOWN RULE │ COUNT TYPE DOMAIN │ │ escape i.ytimg.com:443 5 8.0M 352.2M domain_suffix │ 15 timeout vpn.corp.example.com │ │ escape raw.githubusercontent.com:443 2 915K 96.8M domain_suffix │ 13 blocked googlesyndication.com │ │ escape fonts.gstatic.com:443 3 12.5M 43.1M domain_suffix │ 13 blocked doubleclick.net │ │ escape www.youtube.com:443 5 18.2M 427.7M domain_suffix │ 12 dns gateway.icloud.com │ │ escape api.anthropic.com:443 2 376.1M 414.4M domain_suffix │ 11 timeout dl.google.com │ │ escape en.wikipedia.org:443 1 1.4M 1.8M domain_suffix │ 11 blocked criteo.com │ │ corp jira.corp.example.com:443 5 8.1M 414.6M domain_suffix │ 10 blocked adnxs.com │ │ direct mirrors.debian.org:443 1 509K 128.6M final │ 10 blocked google-analytics.com │ │ direct dl.google.com:443 1 104K 47.8M final │ 10 reset x.com │ │ direct gateway.icloud.com:443 2 610K 519K final │ 8 timeout rr5.googlevideo.com │ │ escape netflix.com 0 0B 0B │ │ │ corp backups.corp.example.com 0 0B 0B │ │ │ escape mail.google.com 0 0B 0B │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├────────────────────────────────────────────────────────────────────────────┴─┤ server health ├───────────────────────────────┤ │ 10 servers · 9 up · 1 down │ │ ▶ JP-Tokyo 42 ms JP-Osaka 175 ms KR-Seoul 72 ms DE-Frankfurt 195 ms HK-1 82 ms SG-1 81 ms TW-Taipei 110 ms │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
池中每台服务器及其实测延迟。延迟经隧道实测得出,探测节奏平缓, 且运行在 UI 线程之外,不影响界面响应。
等价于 rowt ping 与
rowt use <tag>,只是无需离开面板。
筛选、搜索、切窗口均作用于整屏,无需先把焦点移到某个面板。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ _ __ _____ __| |_ MONITOR uptime 3h 15m │ │ | '__/ _ \ \ /\ / /| __| ● LIVE mode host · en0 server JP-Tokyo 42 ms │ │ | | | (_) \ V V / | |_ sys proxy on router running · 3% │ │ |_| \___/ \_/\_/ \__| collector on watch on │ │ │ ├─┤ live connections · escape ├──────────────────────────────────────────────┬─┤ errors & blocked · escape ├───────────────────┤ │ all ↑ 2.9 MB/s ↓ 3.5 MB/s 27 426.4M 1.9G │ aggregated over 5m [10m] 1h 24h │ │ escape ↑ 2.7 MB/s ↓ 3.5 MB/s 18 417.1M 1.3G │ transient 12 · 1 dom │ │ corp ↑ 144 KB/s ↓ 44 KB/s 5 8.1M 414.6M │ persistent 50 · 5 dom │ │ direct ↑ 5 KB/s ↓ 2 KB/s 4 1.2M 176.9M │ blocked 57 · 5 dom │ ├────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────┤ │ LANE HOST:PORT # UP DOWN RULE │ COUNT TYPE DOMAIN │ │ escape i.ytimg.com:443 5 8.0M 352.2M domain_suffix │ 15 timeout vpn.corp.example.com │ │ escape raw.githubusercontent.com:443 2 915K 96.8M domain_suffix │ 13 blocked googlesyndication.com │ │ escape fonts.gstatic.com:443 3 12.5M 43.1M domain_suffix │ 13 blocked doubleclick.net │ │ escape www.youtube.com:443 5 18.2M 427.7M domain_suffix │ 12 dns gateway.icloud.com │ │ escape api.anthropic.com:443 2 376.1M 414.4M domain_suffix │ 11 timeout dl.google.com │ │ escape en.wikipedia.org:443 1 1.4M 1.8M domain_suffix │ 11 blocked criteo.com │ │ escape netflix.com 0 0B 0B │ 10 blocked adnxs.com │ │ escape mail.google.com 0 0B 0B │ 10 blocked google-analytics.com │ │ │ 10 reset x.com │ │ │ 8 timeout rr5.googlevideo.com │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├────────────────────────────────────────────────────────────────────────────┴─┤ server health ├───────────────────────────────┤ │ 10 servers · 9 up · 1 down │ │ ▶ JP-Tokyo 42 ms │ JP-Osaka 175 ms KR-Seoul 72 ms DE-Frankfurt 195 ms HK-1 82 ms SG-1 81 ms TW-Taipei 110 ms │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
流量究竟花在哪里。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ _ __ _____ __| |_ MONITOR uptime 3h 15m │ │ | '__/ _ \ \ /\ / /| __| ● LIVE mode host · en0 server JP-Tokyo 42 ms │ │ | | | (_) \ V V / | |_ sys proxy on router running · 3% │ │ |_| \___/ \_/\_/ \__| collector on watch on │ │ │ ├─┤ connections · ▲ upload · recent ├────────────────────────────────────────┬─┤ errors & blocked ├────────────────────────────┤ │ all 8K/s 8K/s 29.7M 714.0M │ aggregated over 5m [10m] 1h 24h │ │ escape 7K/s 7K/s 26.5M 636.0M │ transient 12 · 1 dom │ │ corp 656B/s 656B/s 2.4M 56.7M │ persistent 50 · 5 dom │ │ direct 247B/s 247B/s 889K 21.3M │ blocked 57 · 5 dom │ ├────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────┤ │ LANE HOST ↑1m ↑5m ↑1h ↑24h │ COUNT TYPE DOMAIN │ │ escape i.ytimg.com:443 0B/s 0B/s 0B 0B │ 15 timeout vpn.corp.example.com │ │ escape raw.githubusercontent.com:443 0B/s 0B/s 0B 0B │ 13 blocked googlesyndication.com │ │ escape fonts.gstatic.com:443 0B/s 0B/s 0B 0B │ 13 blocked doubleclick.net │ │ escape www.youtube.com:443 2K/s 2K/s 6.8M 163.3M │ 12 dns gateway.icloud.com │ │ escape api.anthropic.com:443 2K/s 2K/s 8.6M 206.7M │ 11 timeout dl.google.com │ │ escape en.wikipedia.org:443 0B/s 0B/s 0B 0B │ 11 blocked criteo.com │ │ corp jira.corp.example.com:443 0B/s 0B/s 0B 0B │ 10 blocked adnxs.com │ │ direct mirrors.debian.org:443 247B/s 247B/s 889K 21.3M │ 10 blocked google-analytics.com │ │ direct dl.google.com:443 0B/s 0B/s 0B 0B │ 10 reset x.com │ │ direct gateway.icloud.com:443 0B/s 0B/s 0B 0B │ 8 timeout rr5.googlevideo.com │ │ escape netflix.com 3K/s 3K/s 10.4M 250.0M │ │ │ corp backups.corp.example.com 656B/s 656B/s 2.4M 56.7M │ │ │ escape mail.google.com 185B/s 185B/s 667K 16.0M │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├────────────────────────────────────────────────────────────────────────────┴─┤ server health ├───────────────────────────────┤ │ 10 servers · 9 up · 1 down │ │ ▶ JP-Tokyo 42 ms │ JP-Osaka 175 ms KR-Seoul 72 ms DE-Frankfurt 195 ms HK-1 82 ms SG-1 81 ms TW-Taipei 110 ms │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
collector 旁路进程按域名与通道记录字节数,写入分层 SQLite: 5 秒一格,逐级汇总至一年。
选中按域名记录,切换视图不丢失;在实时视图锁定一台主机, 即可顺势查看其历史曲线。
需确认,可撤销。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ _ __ _____ __| |_ MONITOR uptime 3h 15m │ │ | '__/ _ \ \ /\ / /| __| ● LIVE mode host · en0 server JP-Tokyo 42 ms │ │ | | | (_) \ V V / | |_ sys proxy on router running · 3% │ │ |_| \___/ \_/\_/ \__| collector on watch on │ │ │ ├─┤ live connections ├───────────────────────────────────────────────────────┬─┤ errors & blocked ├────────────────────────────┤ │ all ↑ 2.9 MB/s ↓ 3.5 MB/s 27 426.4M 1.9G │ aggregated over 5m [10m] 1h 24h │ │ escape ↑ 2.7 MB/s ↓ 3.5 MB/s 18 417.1M 1.3G │ transient 12 · 1 dom │ │ corp ↑ 144 KB/s ↓ 44 KB/s 5 8.1M 414.6M │ persistent 50 · 5 dom │ │ direct ↑ 5 KB/s ↓ 2 KB/s 4 1.2M 176.9M │ blocked 57 · 5 dom │ ├────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────┤ │ LANE HOST:PORT # UP DOWN RULE │ COUNT TYPE DOMAIN │ │▎escape i.ytimg.com:443 5 8.0M 352.2M domain_suffix │ 15 timeout vpn.corp.example.com │ │ escape raw.githubusercontent.com:443 2 915K 96.8M domain_suffix │ 13 blocked googlesyndication.com │ │ escape fonts.gstatic.com:443 3 12.5M 43.1M domain_suffix │ 13 blocked doubleclick.net │ │ escape www.youtube.com:443 5 18.2M 427.7M domain_suffix │ 12 dns gateway.icloud.com │ │ escape api.anthropic.com:443 2 376.1M 414.4M domain_suffix │ 11 timeout dl.google.com │ │ escape en.wikipedia.org:443 1 1.4M 1.8M domain_suffix │ 11 blocked criteo.com │ │ corp jira.corp.example.com:443 5 8.1M 414.6M domain_suffix │ 10 blocked adnxs.com │ │ direct mirrors.debian.org:443 1 509K 128.6M final │ 10 blocked google-analytics.com │ │ direct dl.google.com:443 1 104K 47.8M final │ 10 reset x.com │ │ direct gateway.icloud.com:443 2 610K 519K final │ 8 timeout rr5.googlevideo.com │ │ escape netflix.com 0 0B 0B │ │ │ corp backups.corp.example.com 0 0B 0B │ │ │ escape mail.google.com 0 0B 0B │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├────────────────────────────────────────────────────────────────────────────┴─┤ server health ├───────────────────────────────┤ │ 10 servers · 9 up · 1 down │ │ ▶ JP-Tokyo 42 ms │ JP-Osaka 175 ms KR-Seoul 72 ms DE-Frankfurt 195 ms HK-1 82 ms SG-1 81 ms TW-Taipei 110 ms │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ CONFIRM i.ytimg.com → press e again to apply
d 退回 directx.y.z.com →
z.com,一键覆盖整个服务每个按键背后都是一条本可手工输入的 rowt 命令。
改动会先行累积,最后一次操作约 7 秒后统一重载一次路由器。
范围过大的条目会标红并拒绝写入:
com 不是一台主机,而是整个 .com。
一个键,全部在内。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ _ __ _____ __| |_ MONITOR uptime 3h 15m │ │ | '__/ _ \ \ /\ / /| __| ● LIVE mode host · en0 server JP-Tokyo 42 ms │ │ | | | (_) \ V V / | |_ sys proxy on router running · 3% │ │ |_| \___/ \_/\_/ ╭───────────────────────────────────────────────────────────────────────────────╮ │ │ │ rowt monitor — keys │ │ ├─┤ live connections ├─│ │───────────────────────┤ │ all ↑ 2.9 MB/s ↓│ ↑↓ / j k move selection (locks the row) │ 5m [10m] 1h 24h │ │ escape ↑ 2.7 MB/s ↓│ ←→ / h l switch pane · select server chip │ │ │ corp ↑ 144 KB/s ↓│ Tab cycle focus (conns/errors/health) │ │ │ direct ↑ 5 KB/s ↓│ v flip pane · live / ↑ upload / ↓ download │ │ ├──────────────────────│ s span — metrics band (recent/days/year); from Live, opens ↑ upload │───────────────────────┤ │ LANE HOST:PORT │ f 1 2 3 0 lane filter / jump / clear │N │ │ escape i.ytimg.com:44│ / search hosts (regex) · esc clears │orp.example.com │ │ escape raw.githubuser│ w [ ] errors window (rolling) │esyndication.com │ │ escape fonts.gstatic.│ y copy the selected domain │eclick.net │ │ escape www.youtube.co│ e c b d route selected → escape/corp/ │ay.icloud.com │ │ escape api.anthropic.│ block / direct (key×2 = apply) │ogle.com │ │ escape en.wikipedia.o│ E C B D same, on the parent suffix │o.com │ │ corp jira.corp.exam│ (x.y.z.com → z.com) │.com │ │ direct mirrors.debian│ after ½s the entry turns editable: │e-analytics.com │ │ direct dl.google.com:│ type · ^w drop leading label · ↵ apply │ │ │ direct gateway.icloud│ u use the selected server │ooglevideo.com │ │ escape netflix.com │ o toggle the system proxy on/off │ │ │ corp backups.corp.e│ r re-probe servers now │ │ │ escape mail.google.co│ p pause sampling · esc cancel │ │ │ │ ? toggle this help · q quit │ │ │ │ │ │ │ │ observe + confirmed, reversible overrides. │ │ │ ╰───────────────────────────────────────────────────────────────────────────────╯ │ ├────────────────────────────────────────────────────────────────────────────┴─┤ server health ├───────────────────────────────┤ │ 10 servers · 9 up · 1 down │ │ ▶ JP-Tokyo 42 ms │ JP-Osaka 175 ms KR-Seoul 72 ms DE-Frankfurt 195 ms HK-1 82 ms SG-1 81 ms TW-Taipei 110 ms │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
--theme light 可固定仅 watch 需安装一次,其余默认启用。
读取系统路由表,把公司 VPN 当前的网段镜像进 corp 通道, 使走代理的流量同样能进入隧道。看门狗每一拍重跑一次,约两分钟一轮,网络变化亦会触发; VPN 重连后换了网段也跟得上。手工添加的条目不受影响。
一个 LaunchAgent:网络变化即重载;定时探活隧道,卡死或崩溃可自动恢复; 登录时清理残留的系统代理设置,避免 rowt 的影响跨越重启。
酒店与机场的 Wi-Fi 登录页在开启代理时无法打开。rowt 能识别此类网络, 先摘掉代理让登录页加载,认证完成后自动恢复。
一条命令接入整个维护好的服务:
rowt escape add geosite:google,无需自行罗列后缀;更精确的条目仍然优先。
collector 按域名写入分层存储,5 秒一格逐级汇总至一年; 命令行可查询,面板中切换视图亦可查看。
每次状态变更均记账,并标明由本人还是看门狗发起;
BEGIN 在动作之前写入,因此卡死未完成的命令同样留痕。
对应三种处境。
sing-box 运行在 Mac 上,escape 的 socket 绑定物理网卡。 只要公司 VPN 客户端放行绑定网卡的连接即可使用。
部分公司客户端以包过滤拦截,仅绑定网卡不足以绕开。 此时把隧道移入一台桥接的 Lima 虚拟机,它拥有独立的局域网地址,在过滤器看来即另一台主机。
不建隧道。escape 通道的规则不会消失,而是改指向 direct, 因而仍然优先于范围更大的 block 条目。此模式无需配置服务器。
不带参数的 rowt up 会自行探测:在公司 VPN 开启的前提下,验证绑定网卡的连接
能否出网,据此决定模式;同时从物理网卡试探若干探针域名,若均可达,说明当前已在墙外,
直接选用 local。
连接公司 VPN 时判断最准,切换网络后建议重跑一次。
config export 只打包真正的源头:服务器池、订阅,以及三个通道文件。
渲染产物、运行状态与二进制均与机器绑定,在新机器上会重新生成。
包内含凭证与订阅令牌,传输时请加密。
rowt 附带一份 agent skill:链接之后,编码 agent 可以用同一套命令完成安装、 排查通道、解释某条分流决策。
依赖、配置、逐台服务器连通性、DNS、走代理的探测、日志与审计尾部, 敏感信息已脱敏,可直接发送。
凭什么把流量交给它。
rowt 最初是一个庞大的 shell 脚本,目前正逐块迁移到 Rust。 新旧两套实现之间由一套差分测试台把关,而不是靠"应该没问题"。
每条命令都放进一个接触不到真实机器的沙箱,用两套实现各跑一遍,比对四项产物: 标准输出、退出码、整棵配置目录、以及每一个副作用命令的调用轨迹。
同一种克制也体现在产品里:范围大到能匹配整个顶级域的条目会被拒绝, 待确认的改动会自动过期,每次改动均可撤销、均有记录。
Python 正在退场:自 3.3.7 起
bin/rowt 调用的已是 Rust 版助手,两种架构的安装包均不再依赖
python@3.12。
典型的绞杀式迁移:
每个阶段单独发布、各自把关,日常运行的始终仍是 shell 版。
ROWT_IMPL=rust 已可将整条命令交由 Rust 处理,默认关闭,待观察期跑满。
其余都可自行探索:rowt help、
rowt <命令> --help,以及那份会指出下一步的清单。
文档:README.md · DESIGN.md · rowt-monitor/DESIGN.md