疑难解答

遇到问题先拆成两个提问:流量到底有没有进入 Chute(接管问题),以及Chute 能不能把它转发出去(转发问题)?实时流量视图能直接回答——打开仪表盘(iOS)或主窗口的流量标签页(Mac),随便浏览一个网站:什么都不出现,说明流量没有进入 Chute;出现了连接但失败,说明 Chute 无法转发。这两类问题的修法完全不同。

这一页管的是「它不工作」。如果问题是「它在干什么」——读请求、留正文、改响应、模拟故障——请从调试网络开始。

什么都不出现:接管问题

Chute iOS

  • 开关拨不开、配置栏在抖动——没有选中配置。点配置栏,点按一份配置使其出现对勾,再点完成(「请先选择配置」)。
  • VPN 授权弹窗被拒绝了——再拨一次开关并允许。如果 VPN 描述文件卡住(开关立刻弹回),在应用设置里用重置 VPN 配置,下次启动会重新创建并重新请求授权。
  • 另一个 VPN 应用正在连接——iOS 同一时间只运行一条 VPN 隧道。断开另一个应用(并留意它的按需连接规则,可能会悄悄把隧道抢回去)。

Chute Mac

  • 系统代理已开但某个应用不走代理——不少工具(尤其是终端程序)不遵循系统代理。让它们显式指向 Chute 的监听端口(菜单里的 Copy Shell Export Command 为 shell 准备好了命令),或改用增强模式在网络层接管。
  • 增强模式无法启动——网络扩展或 Helper 需要批准;确切的系统设置路径、「系统扩展已被阻止」的处理和 VPN 配置卡住的重置方法见增强模式的故障排除
  • 发往局域网地址的流量本来就会绕过 Chute——先检查杂项选项中的 skip-proxytun-excluded-routes,再判断是不是接管坏了。

出现连接但失败:转发问题

  • 先隔离路径。 把策略组切到 DIRECT:直连能打开而走代理失败,问题就在代理服务器——主机/端口/凭据/加密方法写错,或服务器不可用。对策略组跑一次延迟测试;别的策略都能通过而某一个始终超时,元凶就是它。
  • 命中了预期之外的规则。 在实时流量视图里查看失败连接实际命中的规则,再对照规则匹配顺序:规则分两轮评估,对主机名请求来说,靠后的非 IP 规则可能先于靠前的 IP 规则命中。no-resolveFINAL 的位置是最常见的原因。
  • DNS 结果不对。 检查 DNS 配置:使用加密 DNS 时,确认 DoH/DoT 服务器本身不经代理也可达;换过服务器后清一次 DNS 缓存(iOS 控制面板里的开关、脚本里的 flushDNS,或 HTTP 控制 APIDELETE /api/dns/cache)。
  • 依赖 UDP 的应用异常——确认所选策略支持 UDP 中继(见代理策略的能力矩阵),并记得 Tailscale 不转发 ICMP,经出口节点 ping 不会有回应。

HTTPS 解密解不出来

  • CA 证书必须已安装且已信任——在 iOS 上这是两个独立步骤,第二步(设置 → 通用 → 关于本机 → 证书信任设置)最容易被漏掉。见安装并信任 CA 证书
  • 主机必须命中 [MITM]hostname 列表——只有声明过的主机才会被解密,且默认只有 443 端口,除非用 :port/:0 后缀放开。
  • 有些应用固定(pin)了自己的证书,被解密就会失败——用 - 前缀把它们的主机排除掉,不必硬碰。
  • QUIC/HTTP-3 无法被解密——用 block-quic 把兼容的客户端逼回 TCP。
  • 在 iPhone 和 Apple TV 上,解密是需要许可证的功能:没有许可证时不会解密任何内容,MitM 开关也没有效果——见许可证与激活

查看日志

上面几节都没解决时,日志通常能给出答案:

  • 临时调高日志级别:loglevel = verbose(用完记得改回来——verbose 很拖性能)。
  • Chute Mac:主窗口的日志标签页。Chute iOS:会话日志页面,导航栏上有分享按钮——它会把本次运行的全部分片一并递出。Chute tvOS:会话日志页面,上方有等级过滤(全部 / 通知及以上 / 警告及以上 / 严重),用遥控器就能缩小范围。
  • 任意平台:控制台的 Logs 页,或通过 HTTP 控制 API 调用 GET /api/logs
  • 重点看警告行:未知策略、被拒绝的选项、无法解析的规则,都会在配置加载时以警告形式写进日志。
  • 日志会按几 MB 切成分片。Chute 会保留一次运行中最近的若干片,所以最新那个文件只是故事的结尾,不是全部——请把它们都带上。(Chute Android 则把本次运行的日志放在内存里,磁盘上没有分片文件。)
  • 在 macOS 上,这些文件本身位于 ~/Chute/Share/<run id>/——见文件位置(macOS)

发送诊断包

当你需要别人帮忙看时,一个压缩包胜过从分享面板里翻出来的六个文件加一段凭记忆的崩溃描述。应用区分两种诊断包:由运行中的引擎生成的运行时诊断包,以及由应用自己生成的离线诊断包。两种里的密码、令牌、Cookie 与 URL 里的凭据都被替换成 <redacted>,请求与响应的报文体都包含在内。

运行时诊断包——由运行中的引擎生成:一份脱敏的配置、引擎的健康快照(含上次运行是怎么结束的)、本次运行的关键事件、已加载的规则与策略、DNS、流量,以及日志尾部(在 Android 上是本次运行的内存日志环,因为磁盘上没有分片)。它需要隧道处于运行状态。

  • Chute iOS:控制面板 → 「本地代理」分区的最后一行 运行时诊断包——始终显示,隧道连上之前呈灰色,不需要 external-http-controller;点按即开始生成并弹出分享面板
  • Chute Android:控制面板 → 运行时诊断包,位于 HTTP API 各行之下——VPN 运行起来之前不可用
  • Chute Mac:菜单栏 → 保存诊断包…——引擎就运行在应用内部,所以这一个包同时覆盖两种,且无论引擎在运行还是已停止都可用
  • Chute tvOS:这台设备既没有分享面板也没有文件浏览器,控制台的 Download diagnostic bundle(下载诊断包) 是唯一途径——扫描应用里的二维码,在一台你能发邮件的设备上打开 Diagnostics 页
  • 任意平台,从控制台:Diagnostics 页有下载按钮,或直接 POST /api/diagnostics/bundle

离线诊断包——由应用在没有引擎的情况下生成,所以隧道断开或从未启动时也能用:应用的宿主报告(版本、设备、VPN 状态、配置摘要,以及以文本形式呈现的「网络 / 代理 / 路由表」诊断页)、上次运行的退出标记(如果引擎其实正在运行,则报告为「running」),以及应用能够到的日志文件。

  • Chute iOS:设置 → 「诊断」分区 → 离线诊断包
  • Chute Android:设置 → 「诊断」分区 → 保存离线诊断包
  • Chute tvOS:设置 → 离线诊断包——Apple TV 会生成诊断包并显示一个二维码;用同一网络里的手机扫描它(或在电脑上打开屏幕显示的地址)即可下载 zip——这个链接只在该界面打开期间有效
  • Chute Mac:不需要单独的离线诊断包——菜单栏的 保存诊断包… 在引擎停止时也能用,而且它取材的都是普通文件,可以直接附上:~/Chute/Share/<run id>/ 下的日志分片和运行标记 ~/Chute/Share/last-run.json——见文件位置(macOS)

文件名会告诉你拿到的是哪一种:运行时诊断包是 diagnostics-<timestamp>.zip,离线诊断包是 diagnostics-offline-<timestamp>.zip;两者都包含一个 manifest.json,其中的 kind 字段标明它是哪一种。

发出去之前,控制台 Diagnostics 页上的上次退出那一行值得先看一眼:疑似因内存被终止Killed for memory)意味着是系统回收了 Chute,而不是 Chute 自己出错,这会改变接下来该查什么。

我的改写为什么没反应?

一条从未匹配的改写规则没有任何症状——什么都没发生,这和「匹配了但没有可见变化」看起来一模一样。控制台能直接回答:Rules(规则) 页列出本次运行命中过的每一条改写与 Mock 规则及次数。这张表最多跟踪 512 条不同的规则;超出后它会报告还有多少条命中了但没记上(API 里的 rewrite_hit_dropped_rules),此时它只是一份部分视图。

  • 不在那张表里的规则从未匹配过——前提是那张表没有报告未记账的规则。请对照 URL 改写里的 URL 形式检查你的模式;Header 改写匹配的是整个 URL,而不是子串。
  • 命中了却看不出变化,那是另一个问题——在控制台里展开该连接,读它的 命中的改写 行,那里会用规则原文点名。
  • 只有对该主机启用了 HTTPS 解密,规则才看得到 HTTPS 流量。
S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-05 00:39:12

本页为英文版的翻译。如内容有出入,以英文版为准。

results matching ""

    No results matching ""