EN · English

三条通道,
一个本地代理

个人 VPN、公司 VPN、直连,三者在 macOS 上并行不悖。 rowt 能做到这一点,恰恰因为它不是 VPN。

逐连接分流 · 实时可观测 · 不写系统路由表

rowt1 / 25
为什么需要它

两条隧道,一张路由表

这是一个资源独占问题,不是配置问题。

目标

Google 走自己的 VLESS 服务器,内网走公司 VPN,百度直连,三者同时成立。

障碍

Shadowrocket 与公司 VPN 客户端都属于数据包隧道,各自建立一块 utun 虚拟网卡,也都要占据默认路由;macOS 只让其中一个生效。

结果

反复手动切换:连公司 VPN,Google 不通;开个人 VPN,内网进不去。

冲突在哪

两块 utun 争同一张路由表。后连接的一方取走默认路由, 先连接的那个随即失效,且没有任何提示。

真正需要的

决定权在每条连接,而不是整台机器。 google.com 一条路,jira.corp 另一条,baidu.com 第三条。

rowt2 / 25
它是什么

不是隧道,是代理

rowt 用 sing-box 起一个用户态代理,监听 127.0.0.1:7890。代理不碰路由表,自然不与公司 VPN 争抢资源; 应用把连接交过来,由它逐条判断该走哪个出口。

换一个层次解决问题:不在网络层抢路由,而在应用层做分发。

常见 VPN 客户端rowt
实现方式数据包隧道(utun监听端口的本地代理
路由表占据默认路由只读,不写
与公司 VPN 共存不能,只能活一个可以,天然如此
分流粒度全量,或不可控的分流按连接、按域名
是否需要 root需要不需要
判断依据目标 IP嗅探到的域名,早于 DNS

代价:只覆盖走代理的流量;裸 pingssh 以及任何不读系统代理设置的程序都会绕过。取舍写在明处,不做隐性承诺。

rowt3 / 25
它是什么

四条通道,各行其道

escape

自己的隧道

连到自己的 VPS,支持 VLESS / VMess / AnyTLS / hysteria2。 socket 绑定物理网卡,公司 VPN 占着默认路由也不影响,照样经家庭路由器出网。

google.com · youtube.com · geosite:github

corp

进公司 VPN

socket 不绑网卡,域名交系统解析器处理,顺着系统路由表 直接进入 utunN。内容可自行生成,见后文 corp sync。

*.intranet.example.com · 10.0.0.0/8

direct

直接出网

绑定物理网卡,两条隧道都不走。未被任何名单命中的流量默认走这里, 国内站点保持原速,不额外绕行。

baidu.com · mirrors.debian.org · 其余全部

block

黑洞

当场拒绝,不解析也不连接。广告与遥测域名连不上会持续重试, CPU 往往因此被耗掉;这条通道正是为此而设。

doubleclick.net · google-analytics.com

rowt4 / 25
工作原理

产品架构

流量如何进入 rowt、如何被分类、又从哪里出去。

在你的 Mac 上 浏览器与图形应用 Safari · Chrome · Slack 命令行工具 git · npm · curl · claude 裸 socket ping · ssh · 组网对端 macOS 系统代理 http_proxy 环境变量 完全绕过代理 rowt proxy on rowt-proxy-on · rowt run rowt sing-box · mixed HTTP+SOCKS · 127.0.0.1:7890 嗅探域名 → 通道选择 escape corp direct block 你的 VPS 绑定 en0 utunN 公司 VPN en0 物理网卡 直接拒绝 不解析、不连接 系统路由表 corp VPN · Tailscale · en0 corp 通道不绑网卡,靠这张表进隧道 watch 网络变化时重载 collector 按域名记流量 → SQLite
rowt5 / 25
工作原理

通道选择逻辑

自上而下,命中即止。

连接进来,sing-box 先嗅探目标域名,这一步早于任何 DNS 查询;取得域名后,逐条匹配规则。

# route.rules,按顺序 sniff domain 精确域名 → --domain 条目 domain_suffix 最长后缀优先 → 三个通道文件 rule_set geosite:… → 整个服务 ip_cidr 公司网段 → corp sync 同步 ip_cidr 私有 / CGNAT → 组网对端 rule_set ads → 广告规则集 final direct

最长后缀跨通道比较。escape 中的 api.foo.com 一定优先于 block 中的 foo.com,与通道先后无关。

为什么看域名,不看 IP

同一个 CDN 地址背后,既有被封锁的站点,也有正常的站点,IP 说明不了问题。 能标识目的地的只有域名;嗅探取得域名时 DNS 尚未查询,污染也就无从发生。

随时可以问

rowt explain www.google.com www.google.com → ESCAPE matched: longest-match escape suffix 'google.com'

复现的就是线上那套规则;路由器在运行时,还会补一次真实请求验证。

rowt6 / 25
工作原理

职责边界

三个层面,rowt 只管两个。

层面回答的问题归属
通道走代理的连接从哪个出口出去rowt
DNS哪个解析器回答这个域名rowt
系统路由不走代理的流量从哪块网卡出去刻意不管

DNS 随通道而定

  • corp 域名交系统解析器,以取得内网地址
  • escape 域名在 VPS 侧解析,出口所见与本机一致
  • 其余走物理网卡上的 DoH

为何不碰第三层

改路由表需要常驻的 root 守护进程,而 root 进程不应执行用户可写的代码。 rowt 由 brew 安装、文件用户可写、更新频繁,恰属最不适合以 root 运行的一类。 按最小权限原则,这一层被主动排除在外:只这张表,从不写入。

真正需要动路由表的场景,交给一个独立的小型守护进程, 与 rowt 不共享任何文件。

rowt7 / 25
上手

新手上路

七步装好。

全程开着现有 VPN 操作,rowt up 需要联网下载 sing-box;整套跑通后再切回公司 VPN。这张清单可随时用 rowt onboard 打印,并标出当前进度。

01

安装

brew install tanghong123/tap/rowt
02

导入服务器

支持从 Shadowrocket、Clash Verge、V2Box、FlClash 导入。每个客户端各跑一次, 结果累加进同一份待确认文件,并标注来源;删掉不需要的,再确认写入。

rowt server import --from shadowrocket rowt server import --from clash-verge # 累加,不覆盖 $EDITOR ~/.config/rowt/import-review.json rowt server import --apply

也可直接添加分享链接: rowt server add '<vless://…>'

03

启动

缺 sing-box 会自动获取;探测适用模式,渲染配置,拉起路由器,打开系统代理。

rowt up
04

选服务器

rowt ping # 按延迟排序 rowt use JP # 或 rowt use auto
05

切网络并验证

退出原 VPN,连接公司 VPN,各取一个域名确认走向。

rowt explain www.google.com rowt status
06

通道配置

escape 出厂已带一份(Google、GitHub、维基、X 等);corp 会从 VPN 路由自行生成。按需补充:

rowt escape add youtube.com googlevideo.com rowt escape add geosite:google # 一整个服务 rowt corp add '*.intranet.example.com' 10.0.0.0/8 rowt block add ads.example.com

geosite:<名称> 引入一份维护好的规则集,涵盖该服务的全部域名与各国后缀,无需逐条罗列;更精确的条目仍然优先。

rowt corp suggest # 依据 DHCP 搜索域推断 rowt corp sync # 连着公司 VPN 时执行,同步其路由

连接状态下执行一次 corp sync;此后看门狗每一拍自动重跑。

07

自动管理

装上看门狗:网络变化自动重载, 隧道卡死或崩溃自动恢复,登录时清理残留代理设置。

rowt watch install rowt watch status
rowt8 / 25
上手

命令行代理配置

系统代理只覆盖浏览器与图形应用。命令行工具不读系统代理,只认 http_proxy / https_proxy / all_proxy。rowt 提供三种方式。

按 shell
eval "$(rowt shell-init)" # 写入 ~/.zshrc,一次即可 rowt-proxy-on rowt-proxy-off

这两条别名由 rowt shell-init 提供, 在当前 shell 内设置与清除上述变量;同时装好 Tab 补全。

按命令
rowt run claude rowt run git pull

当场探测哪条路径确实通得了外网:当前 shell 的设置、系统代理、 rowt 自身端口、直连,取第一条可用的执行命令;全部不通则不执行。

查看
rowt proxy status rowt proxy env

系统代理当前指向何处、是否指向 rowt, 以及可直接粘贴到别处的 export 行。

rowt run 的由来:机器上并存多个代理软件, 网络一天多变,"该填哪个值"始终在动;猜错后的报错又难以定位。与其猜,不如现测。

rowt9 / 25
日常

高频命令

按使用频率排列。

几乎每天
rowt status
模式、服务器、代理、连通性、配置是否合法
rowt monitor
全屏实时视图
rowt escape add <域名>
把站点接入隧道
rowt reload
Wi-Fi ↔ 有线 ↔ 热点 切换后执行
时常
rowt explain <域名>
走哪条通道、命中哪条规则
rowt direct errors
直连失败的域名,即待入隧道的候选
rowt ping / use
服务器排序,指定一台或交给 auto
rowt connections
当前连接分别走哪条通道
排查时
rowt audit
谁改了什么:本人,还是看门狗
rowt report
完整诊断,敏感信息已脱敏,可直接发出
rowt corp sync
重新同步公司 VPN 的实时路由
rowt metrics top
指定窗口内最耗流量的域名

最常用的一套动作:执行 rowt direct errors 10m, 查看刚才在直连上失败的域名;超时与 reset 基本即被封锁,把确需使用的加入 escape。

rowt10 / 25
监控面板

监控面板总览

一屏之内,一目了然。

rowt monitor — 演示数据
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   _ __ _____      __| |_   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   
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
1
2
3
4

四个区域,下面逐个展开。

1 · 身份栏 模式、当前服务器、代理、路由器健康,以及两个后台进程
2 · 实时连接 什么在跑、走哪条通道,以及命中了哪条规则
3 · 错误与拦截 滚动窗口内的失败项,待入隧道的候选即在其中
4 · 服务器健康 整个池子、实测延迟、当前出口

数据均来自 2 秒一拍的采样;不按控制键则不作任何改动。

rowt11 / 25
监控面板 · 区域 1 / 4

身份栏

系统是否正常,先看这一栏。

rowt monitor — 演示数据
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   _ __ _____      __| |_   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   
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
身份栏

系统是否正常,这一栏即可判断,无需下翻。

● LIVE
呼吸式心跳;停止即表示数据已不再更新。另有 DOWN、ERROR、PAUSED 三态
mode
host / vm / local,以及当前使用的网卡
server
当前出口服务器及其实测延迟
sys proxy
macOS 是否确实指向 rowt
router
运行状态与 CPU;路由器空转,最先在这里暴露
collector · watch
流量记录与自动重载看门狗两个后台进程是否在运行

可执行的操作

  • o 开关系统代理,也可直接点击 sys proxy 单元格
  • p 暂停采样,画面静止,便于逐行核对
  • r 立即重测全部服务器,不必等待下一轮
rowt12 / 25
监控面板 · 区域 2 / 4

实时连接

什么在跑,以及为什么这么跑。

rowt monitor — 演示数据
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   _ __ _____      __| |_   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   
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
实时连接

上半部是每条通道的速率汇总,下半部一行一个目标主机。

LANE
该连接实际走的出口
HOST:PORT
嗅探到的目标
#
并发连接数
UP · DOWN
上下行字节
RULE
命中的规则类型domain_suffixdomainrule_setfinal

最后一列回答的是"凭什么走这条通道",排查分流问题时最常看。

灰显、字节为 0B 的是休眠行:近期出现过,当前空闲。位置保持不变, 避免正在观察的主机一安静就从列表中消失。

rowt13 / 25
监控面板 · 区域 3 / 4

错误与拦截

什么在失败,以及属于哪一类。

rowt monitor — 演示数据
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   _ __ _____      __| |_   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 → 全部 之间切换。

transient
DNS 类失败,多数可自行恢复
persistent
超时、reset、拒绝;这一类就是待入 escape 的候选
blocked
被 block 通道与广告规则集拦下的

标准动作:筛到 direct 通道,看 persistent 一类,把确需使用的接入 escape, 全程不必离开面板。

仅记录失败连接。此栏为空表示没有错误,不代表没有流量。

rowt14 / 25
监控面板 · 区域 4 / 4

服务器健康

从哪里出网,延迟如何。

rowt monitor — 演示数据
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   _ __ _____      __| |_   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 线程之外,不影响界面响应。

当前出口,固定在最左侧,不会滚出视野
跑马灯
一行放不下时滚动显示,选中即刻冻结
计数
总数 / 在线 / 离线,一眼可见

可执行的操作

  • 选择服务器,点击亦可
  • u 立即切换到该服务器
  • r 立即重测整个池子

等价于 rowt pingrowt use <tag>,只是无需离开面板。

rowt15 / 25
监控面板 · 导航

全局快捷键

筛选、搜索、切窗口均作用于整屏,无需先把焦点移到某个面板。

rowt monitor — 演示数据
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   _ __ _____      __| |_   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   
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
通道筛选设为 escape,两个面板同时收窄;按 0 清除。

收窄

f · 1 2 3 0循环切换通道筛选,或直接跳至 escape / corp / direct;0 清除
/按正则搜索域名,输入过程中同时过滤两个面板
w · [ ]错误窗口:5m → 10m → 1h → 24h → 全部

移动

↑↓ · j k移动选中;首次按下会按域名锁定该行
←→ · h l切换面板,或选择服务器
Tab连接 → 错误 → 服务器条,循环切换

其他

y复制选中的域名
p暂停采样
?随时调出完整键位表
rowt16 / 25
监控面板 · 历史

流量历史

流量究竟花在哪里。

rowt monitor — 演示数据
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   _ __ _____      __| |_   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   
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
▲ 上行
按 v 切至 ▲ 上行,再按一次切至 ▼ 下行;错误与服务器健康不受影响。

collector 旁路进程按域名与通道记录字节数,写入分层 SQLite: 5 秒一格,逐级汇总至一年。

v
切换面板:实时 → ▲ 上行 → ▼ 下行
s
时间跨度:近期(1m/5m/1h/24h)→ 天 → 年

选中按域名记录,切换视图不丢失;在实时视图锁定一台主机, 即可顺势查看其历史曲线。

rowt metrics top 3600 # 近一小时流量最大的域名 rowt metrics query "<SQL>" # 只读 SQL 直通
rowt17 / 25
监控面板 · 操作

通道编辑

需确认,可撤销。

rowt monitor — 演示数据
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   _ __ _____      __| |_   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         
在 i.ytimg.com 上待确认;确认前不写入任何内容,按 Esc 或直接离开即取消。
e c b d
将锁定的域名接入 escape / corp / block,或用 d 退回 direct
E C B D
同样四项,作用于父级后缀x.y.z.comz.com,一键覆盖整个服务
↵ / 连按两次
确认 · esc 取消 · 闲置 10 秒自动取消
u · o
切换服务器 · 开关系统代理,两者立即生效,无需确认

每个按键背后都是一条本可手工输入的 rowt 命令。 改动会先行累积,最后一次操作约 7 秒后统一重载一次路由器。

范围过大的条目会标并拒绝写入: com 不是一台主机,而是整个 .com

rowt18 / 25
监控面板 · 速查

键位速查

一个键,全部在内。

rowt monitor — 演示数据
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
   _ __ _____      __| |_   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   
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
随时按 ?,esc 关闭。

还需知道

鼠标滚轮作用于指针所在列表;行、通道、窗口标签、服务器、代理单元格均可点击
主题依终端背景自动判断,--theme light 可固定
兜底无配置或路由器未运行时显示演示数据,而非错误页
只读数据通路不修改任何状态,仅需确认的控制键会写入
开销IO 与 CPU 只随新增数据增长,与日志和服务器池规模无关
rowt19 / 25
自动运转

智能路由,自动运转

watch 需安装一次,其余默认启用。

corp sync

读取系统路由表,把公司 VPN 当前的网段镜像进 corp 通道, 使走代理的流量同样能进入隧道。看门狗每一拍重跑一次,约两分钟一轮,网络变化亦会触发; VPN 重连后换了网段也跟得上。手工添加的条目不受影响。

watch

一个 LaunchAgent:网络变化即重载;定时探活隧道,卡死或崩溃可自动恢复; 登录时清理残留的系统代理设置,避免 rowt 的影响跨越重启。

强制门户

酒店与机场的 Wi-Fi 登录页在开启代理时无法打开。rowt 能识别此类网络, 先摘掉代理让登录页加载,认证完成后自动恢复。

geosite

一条命令接入整个维护好的服务: rowt escape add geosite:google,无需自行罗列后缀;更精确的条目仍然优先。

流量记录

collector 按域名写入分层存储,5 秒一格逐级汇总至一年; 命令行可查询,面板中切换视图亦可查看。

审计

每次状态变更均记账,并标明由本人还是看门狗发起; BEGIN 在动作之前写入,因此卡死未完成的命令同样留痕。

rowt20 / 25
进阶

三种运行模式

对应三种处境。

host

最常用

sing-box 运行在 Mac 上,escape 的 socket 绑定物理网卡。 只要公司 VPN 客户端放行绑定网卡的连接即可使用。

vm

如果绑定网卡不生效

部分公司客户端以包过滤拦截,仅绑定网卡不足以绕开。 此时把隧道移入一台桥接的 Lima 虚拟机,它拥有独立的局域网地址,在过滤器看来即另一台主机。

local

人已在墙外

不建隧道。escape 通道的规则不会消失,而是改指向 direct, 因而仍然优先于范围更大的 block 条目。此模式无需配置服务器。

如何选择

rowt up # 自动判断 rowt up vm # 强制指定 rowt probe # 当前环境适用哪种

不带参数的 rowt up 会自行探测:在公司 VPN 开启的前提下,验证绑定网卡的连接 能否出网,据此决定模式;同时从物理网卡试探若干探针域名,若均可达,说明当前已在墙外, 直接选用 local

连接公司 VPN 时判断最准,切换网络后建议重跑一次。

rowt21 / 25
进阶

迁移与交接

把整套配置搬到另一台机器

config export 只打包真正的源头:服务器池、订阅,以及三个通道文件。 渲染产物、运行状态与二进制均与机器绑定,在新机器上会重新生成。

rowt config list # 查看打包范围 rowt config export # → 一个 .tgz rowt config import setup.tgz # 恢复并重新渲染

包内含凭证与订阅令牌,传输时请加密。

交给 agent 操作

rowt 附带一份 agent skill:链接之后,编码 agent 可以用同一套命令完成安装、 排查通道、解释某条分流决策。

rowt skill install rowt skill status

需要他人协助时

rowt report

依赖、配置、逐台服务器连通性、DNS、走代理的探测、日志与审计尾部, 敏感信息已脱敏,可直接发送。

rowt22 / 25
工程

工程保障

凭什么把流量交给它。

rowt 最初是一个庞大的 shell 脚本,目前正逐块迁移到 Rust。 新旧两套实现之间由一套差分测试台把关,而不是靠"应该没问题"。

每条命令都放进一个接触不到真实机器的沙箱,用两套实现各跑一遍,比对四项产物: 标准输出、退出码、整棵配置目录、以及每一个副作用命令的调用轨迹

命令行界面 292/292 一致 通道编辑 28/28 渲染矩阵 23/23 规范化 JSON 分流判定 10/10 通道与理由均需一致

这样做换来什么

  • 重写过程不会悄悄改变行为
  • 顺带在旧实现中查出缺陷:测试台确实抓到过潜伏数月的分流错误
  • 影子模式:两套实现同时运行,记录分歧,在真机上跑满观察期后再谈切换

同一种克制也体现在产品里:范围大到能匹配整个顶级域的条目会被拒绝, 待确认的改动会自动过期,每次改动均可撤销、均有记录。

rowt23 / 25
工程

统计数据

4.3 万行,含文档与测试
222次提交,始于 2026-07-03
81个发布标签
366个 Rust 单测与集成测试
353条差分对比用例
14个随包发布的二进制

代码分布

Rust · crates18,928
Rust · 监控面板8,871
Bash · bin/rowt5,027
差分测试台4,266
文档 · markdown3,480
Python · 遗留2,529

Python 正在退场:自 3.3.7 起 bin/rowt 调用的已是 Rust 版助手,两种架构的安装包均不再依赖 python@3.12

技术构成

语言
Bash、Rust、少量 Python,以及最初用 jq 写的渲染
运行时
sing-box · SQLite(内置)· TUI 基于 ratatui
工作区
两个:CLI 与核心库,以及监控面板
门禁
命令行 292 · 通道 28 · 渲染 23 · 分流 10 · 沙箱场景 25
打包
Homebrew tap;Apple Silicon 直取 5 个预编译二进制,Intel 由源码构建
权限
无任何进程以 root 常驻,也无任何代码写入路由表

Rust 迁移进度

0 · 测试台2 · 分流与通道 4 · 整个命令行6 · 导入解析 1 · 渲染 · 观察期3 · 看门狗 · 未切换 5 · Linux 与 tun 模式

典型的绞杀式迁移: 每个阶段单独发布、各自把关,日常运行的始终仍是 shell 版。 ROWT_IMPL=rust 已可将整条命令交由 Rust 处理,默认关闭,待观察期跑满。

rowt24 / 25

从这里开始

brew install tanghong123/tap/rowt rowt onboard

其余都可自行探索:rowt helprowt <命令> --help,以及那份会指出下一步的清单。

文档:README.md · DESIGN.md · rowt-monitor/DESIGN.md

rowt25 / 25
← → or space to move