Chute Dashboard
Chute Dashboard 是一个免费的 macOS 应用,连接到一个正在运行的 Chute——通过 Wi-Fi 或 USB 线连 Chute iOS,通过网络或 adb 连 Chute Android,或在同一台 Mac 上连 Chute Mac——并展示那个实例正在做什么:每条连接以及决定它的规则与策略、HTTPS 解密覆盖的主机上解密后的请求与响应、DNS 应答、UDP 会话。它还能让你边看边改流量:MitM 主机列表和每一族改写与模拟响应规则都可以在线编辑。
它不是 Web 控制台。控制台由引擎自己提供、用浏览器打开;Dashboard 是一个独立的应用,通过引擎的二进制控制通道与它对话,所以它需要设备上的
external-controller-access,而不是external-http-controller。两者有重叠,也各有对方没有的东西——见 Dashboard 无法触及的功能。只有一种情况例外:Dashboard 与引擎在同一台 Mac 上时,它连的是引擎始终开着的本地套接字,完全不需要任何配置。
Dashboard 的界面已本地化为本手册的各种语言(阿拉伯语除外;在阿拉伯语系统上显示英文)。
允许 Dashboard 连接
设备不放行,什么都不会监听。
Chute iOS —— 在配置编辑器中打开外部控制器:
- 打开外部控制器访问——就是脚注写着 允许 Chute Dashboard/Chute CLI 连接 的那个开关。
- 设置端口和密码。密码不能为空,而且必须是你自己设的:能从网络访问到的监听器,用空密码或默认密码是拒绝启动的。
- 除非确实需要,否则让允许通过 Wi-Fi 访问保持关闭。关闭是默认值,意味着监听器只留在手机自己身上——USB 线仍能到达它,Wi-Fi 上的其他设备不能。打开则意味着这个网络上任何知道密码的人都能读到本次运行看到的一切。
- 保存,然后启动(或重启)隧道。控制面板现在会显示外部访问端口:
<端口>——这一行就是监听器已经起来的确认。
Chute Mac —— 同样的三个值写在 [General] 里:
[General]
external-controller-access = password@127.0.0.1:6170
127.0.0.1 把它限制在你所在的这台 Mac 上;换成局域网地址或 0.0.0.0 就对其他机器开放了。配置窗口的「通用」分区有对应这个键的字段。同一台 Mac 上运行的 Dashboard 根本不需要这个键——见下面的连接本机。
Chute Android —— 在配置编辑器中打开外部控制器,把同样的值写进外部访问:
password@127.0.0.1:6170就够通过 USB 连接用了:Dashboard 会为这个端口执行adb forward,经数据线连接,所以监听器可以只留在手机本机。这需要 Mac 上有adb——Dashboard 会在ANDROID_HOME和ANDROID_SDK_ROOT下、PATH上、/usr/local/bin和/opt/homebrew/bin里,以及~/Library/Android/sdk中查找——并且手机要打开 USB 调试、允许这台 Mac。password@0.0.0.0:6170则对网络开放,供连接远程设备使用。和 iOS 一样,能从网络访问到的监听器用空密码或默认密码是拒绝启动的。
保存,然后启动(或重启)VPN。之后控制面板的外部访问开关会显示它监听的地址,VPN 运行期间也可以用它关闭和重新打开监听器。
连接
Dashboard 启动时打开新建仪表盘窗口;每个连接各占一个窗口,所以可以同时打开好几台设备。三种进入方式:
| 字段 | 适用场景 | |
|---|---|---|
| 连接本机 | 无 | 同一台 Mac 上的 Chute Mac。Dashboard 直接与引擎的本地套接字对话——不填主机、不填端口、不填密码,也不用写 external-controller-access。 |
| 连接远程设备 | 主机、端口、密码 | 设备的 Wi-Fi 地址(iPhone:设置 → Wi-Fi → ⓘ),或另一台 Mac 的地址。手机上需要打开允许通过 Wi-Fi 访问。 |
| 通过 USB 连接 | 设备、端口、密码 | iPhone 用数据线连着这台 Mac 并已信任它,或者 adb 能看到的 Android 设备。在设备:里选中它,填你配置的那个端口即可——Dashboard 自己会找到 USB 通道,Android 的端口转发也由它自己执行。允许通过 Wi-Fi 访问关着也能用,而且还能看到蜂窝网络的流量,因为设备根本不必连 Wi-Fi。 |
远程机器只有你主动保存才会被记住:保存会把主机、端口和密码存到你起的名字下,下次已保存的设备标签页列出的就是这些名字。
密码不对时窗口会提示密码不匹配,经 USB 和经网络都一样。设备连不上时,窗口照样会打开并显示连接中…:经 USB 连接的 iPhone 会一直停在这里,Dashboard 不断重试,直到手机应答或你点关闭;其他连接最后都会显示连接已断开。连上之后设备又不见了——隧道停了、线被拔了、手机换了网络——Dashboard 窗口会报告连接已断开并提供重新连接。
主窗口
工具栏在五个视图之间切换——最近、活跃、DNS、UDP和MitM——右侧的筛选字段是按主机模式搜索的搜索框,与筛选栏共用。筛选栏本身只在最近和活跃上单独出现,DNS、UDP 和 MitM 上是隐藏的。左下角的面板是实时上传与下载速度;点它可以展开图表。
最近和活跃视图各有一个重新加载按钮,最近还多一个清空列表的清空。挨着它们的是两个作用于运行中引擎的开关,和各端应用里的开关完全一样:
- 启用流量捕获 → 停用流量捕获:打开请求与响应正文的捕获(即
replica设置)。不开的话,行仍然会出现并带着选路信息,但数据标签页无法选中。设备还没有报回当前状态时,按钮显示为流量捕获。 - 启用 MitM(N 条规则) → 停用 MitM(N 条规则):对 MitM 主机列表里的 N 个主机打开 HTTPS 解密;列表为空时不显示数量。设备上没有受信任的 CA 且至少一个主机之前,这个开关没有实际作用——见 HTTPS 解密页。
两个开关都不改配置文件;重启后回到文件所写的状态。
侧栏按客户端给连接分组:所有客户端,然后是本地(设备自身上的客户端)和远程(把这个 Chute 当代理用的其他机器)。选中一项,所有列表都只显示它。设备是 Chute Mac 时,本地客户端就是各个应用,带名称和图标,右键菜单里有在访达中显示。
活跃与最近
活跃是此刻打开着的连接;最近是设备的历史,从本次运行的记录里读回,按连接编号排列——最新的在最下面。点列头可以改按该列排序。两者共用同一组列:
| 列 | |
|---|---|
| ID | 引擎的连接编号——控制台和各端应用显示的是同一个数字 |
| 日期、持续时间 | 什么时候开始的,已经持续或总共持续了多久 |
| 客户端 | 进程(Chute Mac)、应用的包名(Chute Android)或本地地址 |
| 方法、服务器、状态 | 方法是连接类型——HTTP、HTTPS、SOCK、TCP 或 UDP,不是请求的动词;服务器是目的地 host:port;状态是连接的状态:活跃、已完成或中断 |
| 策略 | 规则选中的策略 |
| 上传、下载 | 两个方向的字节数 |
| 标记 | Chute 对这条连接做了什么——见下面的图例 |
标记列是判断你写的规则有没有生效最快的方法:
| 标记 | 含义 |
|---|---|
M |
已解密(MitM 已拦截) |
H |
某个头被修改了 |
B |
某个正文被 Body 重写规则或脚本改动了 |
R |
有改写规则命中 |
K |
由模拟响应规则应答,而不是服务器 |
B 只看正文内容有没有变:Chute 只是为了对照规则而暂存的正文,或只是重新分块、重新压缩而内容没变的正文,都不会标上。
最近列表最多保留 5,000 行;列表底部的加载更早记录会从设备取下一页,列表本身每隔几秒自动刷新。当活跃列表长到一个控制包装不下时,表格下方会有一行说明引擎截断了它——这些行仍在设备上,关闭后会出现在最近列表里。
在行上右键可以复制 curl 命令、将所选导出为 HAR… / CSV…、全部导出为 HAR… / CSV…以及筛选 <主机>;活跃的行还多一个终止连接,会在设备上把它关掉。在多行选区内右键会保留选区,所以将所选导出为 HAR… / CSV…会导出所有选中的行;只针对一条连接的菜单项作用于你右键点中的那一行。另有四项直接作用于设备上该主机的规则,是从眼前这条连接走到改动它的规则最短的一条路:为其添加 MitM 规则、为其启用 MitM、为其添加 Header 重写和为 <主机> 添加 Body 重写。
注意:一行是一条连接,不是一个请求。一条 keep-alive 连接上跑了好几个请求,仍然只是一行,捕获到的数据里前后相接地装着所有这些消息;显示出来的头是其中一个请求的。所以浏览器打开一个页面产生的行数,比页面的资源数要少。
筛选栏
筛选栏收窄的是显示的内容。它不改变设备记录什么——要控制记录,用设备上的 [Replica]。
| 控件 | 可选项 |
|---|---|
| 筛选主机/URL… | 对主机、host:port、进程或应用、策略、规则和连接类型做文本匹配——不匹配 URL 的路径 |
| 方法 | GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、CONNECT |
| 状态 | 1xx – 5xx |
| 流量 | 活跃、已完成、中断 |
| 类型 | JSON、HTML、XML、图片、文本、二进制——按响应的内容类型 |
| 时长 | < 100ms、100ms–1s、1s–5s、> 5s |
| 大小 | < 1 KB、1–100 KB、100 KB–1 MB、> 1 MB |
| 仅 MitM | 只看已解密的连接 |
| 已修改 | 头被规则改过、或正文被规则或脚本改过的连接——H 或 B。只有 R 或只有 K 的行不算。 |
清除筛选回到全部。
连接详情
选中一行,它的详情就在列表下方的面板里展开。标签页从左到右:
常规 —— 列表上有的东西,摊开来看:连接类型与状态码;出站模式、策略和匹配到的规则;流量与最高速度;本地与远端地址;开始时间;SSL/MitM 状态(已拦截、头已修改、正文已修改、已模拟);以及命中的规则列表——改动过这条连接的改写与模拟响应规则,用规则自己的原文引出。这份列表两头都有上限:引擎每条连接最多留 16 次命中,Dashboard 只显示其中 8 条,再补一句 … 还有 N 条,所以一条在每个数据块上都命中的规则会把其余的挤掉。
时间 —— 连接建立的时间花在了哪里,按引擎的测量:
| 行 | 从 → 到 |
|---|---|
| 代理就绪耗时 | 客户端的连接到达 → Chute 准备好处理它 |
| DNS 解析 | → 域名解析完成(规则不需要地址时这一行不出现) |
| 规则匹配耗时 | → 规则表得出结论 |
| 远端就绪耗时 | → 选中的出站已连上并就绪 |
| 活跃 | 连接的整个生命周期,从到达到关闭 |
值为零的行会被略去,而不是显示成零,所以规则不需要地址的连接根本没有DNS 解析这一行。一个慢请求通常只慢在其余某一行,慢在哪一行就说明该往哪里看:DNS 看手册的 DNS 一章,远端就绪看策略或它背后的服务器。
请求头 / 响应头 —— 表格形式的头,请求侧另拆出查询参数和Cookie,响应侧拆出Cookie。被规则修改过的头会高亮。复制所选复制选中的行。
请求数据 / 响应数据 —— 捕获到的正文,以十六进制、文本、JSON(可展开的树,带搜索)或图片(适应窗口 / 实际大小)查看;不论正文是什么,都先以文本打开;multipart 正文会拆成各个部分。导出为 bin保存原始字节,装了 Sublime Text 或 VSCode 时,文本视图还提供用 Sublime Text 打开和用 VSCode 打开。只有存在捕获数据时这两个标签页才能选中:连接运行时记录是开着的,并且主机通过了 [Replica] 的过滤。
注意:正文按捕获时的样子显示。压缩过的响应——
Content-Encoding: gzip——在这里不会被解压,所以它的文本和 JSON 视图是乱码;十六进制视图和导出为 bin能给你原始字节,拿到别处解压。设备拒绝交出大于 2 MiB 的正文——此时标签页里显示 无法加载此正文——十六进制视图只显示前 1 MiB。
DNS 与 UDP
DNS是设备解析器的缓存:每个域名及其解析到的地址、最先应答的服务器(Chute 会同时查询所有配置的服务器——见 DNS)、TTL,以及这条记录的来源。最后那一列说的是来源——配置、系统或动态——不是 DNS 记录类型。TTL 报出来至少是 600 秒,比这短的也读作 600。
右键可以复制域名、复制 IP、复制 DNS 服务器和筛选 <域名>;动态解析出来的记录还多一个删除 <域名> 的 DNS 记录。底部的清除 DNS 缓存直接把缓存清空。后面这两项作用于设备上的缓存,不是 Dashboard 里的这份显示。
UDP列出 UDP 会话——主机、服务器、策略和状态。UDP 没有正文。
MitM 工具
MitM视图管理设备上的五族规则,分五个面板:MitM 规则、Header 重写、Body 重写、模拟响应和URL 重写。它们共有的性质:
- 列表是运行中引擎手里的那份规则,起点是配置文件声明的内容。
- 添加规则会发送到设备,设备像解析配置行一样解析它;解析不了的行会被拒绝并报错,而不是存下来。MitM 规则里的主机是例外——它是一个模式,不是一条规则行,任何非空字符串都会照原样追加进去。
- 改动只存在于运行中的引擎里。它们不会写回配置文件,重载或重启都会回到文件所写的状态。用这些面板找到能用的规则,再把它写进配置。
- 规则有没有被应用,看列表的标记列(
R、K)和详情面板的命中的规则。
MitM 规则 —— 一条规则一个主机模式,host[:port][/path],前缀 - 表示排除:*.google.com、api.example.com:8443、api.example.com/v2/*、-*.apple.com。语法与 HTTPS 解密页上 hostname 键的一样。工具栏 MitM 开关上的数字就是这个列表的长度。
Header 重写 —— 一个表单:URL 正则、请求或响应、添加 / 替换 / 删除 / 替换(正则)、头名称、头值;选替换(正则)时多一个值正则,头值里被它匹配的部分换成替换为的内容。Dashboard 替你拼出配置行;语法见 Header 重写页。
Body 重写 —— 一行配置,照你在文件里写的样子输入,引擎认的写法都可以:Surge 的 http-response url-regex pattern replacement(或 http-request)、它的 http-response-jq url-regex jq-program(或 http-request-jq)、url-regex response regex pattern replacement(或 request)、url-regex jsonpath-response jsonpath $.path value(或 jsonpath-request)。见 Body 重写。
模拟响应 —— URL 正则;响应体的类型:file(一个路径,可浏览…)、text、base64 或 tiny-gif(内置的 1×1 透明 GIF,不用填内容);可选的状态码;可选的响应头,写成用 | 分隔的 Name: Value。
注意:
file路径由运行 Chute 的设备在请求时读取。Dashboard 连的是同一台 Mac 上的 Chute Mac 时,Mac 上的路径有意义;连的是 iPhone 时就毫无意义——手机上没有/Users/…。对远程设备,选text或base64,让内容随规则一起过去(见 模拟响应);或者把文件放到某个 URL 上,改用 URL 重写。
URL 重写 —— URL 正则、目标和类型:header 就地改写请求(Surge 的 Map Remote),302 和 307 让客户端重定向,reject、reject-200、reject-img、reject-dict、reject-array、reject-tinygif 不联系服务器直接应答。见 URL 重写。
导出
- HAR —— 在列表上右键:所选行或全部,导出为 HAR 1.2 文件,可用浏览器开发者工具(Network → 导入)、Charles 或 Proxyman 打开。每个捕获到 HTTP 请求的行对应一个条目;其余的行——比如纯 TCP——不会导出,文件的注释(comment)里会写明略去了几行。记录开着时包含正文:Dashboard 会先从设备取回正文,期间显示一个写着正在导出为 HAR…——正在从设备获取已捕获的正文。——的面板,带进度条和取消,点它会放弃这次导出。超过 512 KiB 的正文只记录大小,一次导出最多带 64 MiB 的正文。
- CSV —— 给电子表格用的一组固定列:
ID,Method,URL,Status Code,Status,Duration,Upload,Download,Process,Start Time。它不是列表自己的那些列,里面没有日期、客户端、服务器、策略和标记列。Method是请求的方法,URL是完整 URL,与 HAR 导出一致:经 HTTP 代理而没有解密的 HTTPS 给出的是CONNECT和https://host。没有 HTTP 请求的行——纯 TCP,或者 TUN 转发而没有解密的 HTTPS——在这两列里给出的是连接类型和主机。 - 复制 curl 命令 —— 一条
curl命令,带着原请求的方法、头和正文,在你的 Mac 上重放这个请求;正文会先从设备取回。Content-Length交给 curl 自己计算。只是一条隧道的行——没有解密的 CONNECT,或纯 TCP——只给出curl加 URL。 - 导出为 bin —— 一个正文,按捕获时的样子。
Dashboard 的 HAR 是用列表和它从设备取回的正文拼的。引擎也能自己生成一份——每个条目带一个 _kl 对象,装着命中的规则、策略和生效的改写,发送/接收耗时取自捕获本身——入口是控制台的 导出 HAR 或 GET /api/connections/export?format=har。
Dashboard 无法触及的功能
Dashboard 说的是引擎的二进制控制通道,而引擎能做的一部分事只存在于 HTTP 控制 API 上。这些要用 Web 控制台或 API:
- 诊断包、健康状态、拒绝计数和事件;
- 控制台「规则」页的每条规则命中总数,以及它们给出的「这条规则到底有没有命中过」的答案;
- 上面说的引擎自己生成的 HAR;
- 日志。
依赖它之前还有一件事值得知道:
- 在iPhone、Apple TV 和 Android上,HTTPS 解密和正文捕获是需要许可证的功能。没有许可证时 Dashboard 仍能连接,也能看到每条连接及其规则与策略,但 HTTPS 行永远不会被解密——没有
M标记——数据标签页也无法选中。在 iPhone 和 Android 上,应用里的 MitM 开关打不开,而是弹出购买提示;Apple TV 的控制界面上根本没有 MitM 这一行。见许可证与激活。
本页为英文版的翻译。如内容有出入,以英文版为准。