LOG LAYERS
先判断日志来自哪一层
Clash 客户端出现“连接失败”时,界面提示通常只是最终结果,运行日志才会记录失败发生在哪个阶段。开始分析前要先区分三层信息:客户端界面层、代理核心层和操作系统网络层。客户端负责配置管理、托盘菜单和系统代理开关;Clash、Clash Meta 或当前使用的 mihomo 核心负责监听端口、解析规则、建立代理连接和处理 DNS;操作系统则管理网卡、路由、防火墙、权限以及本地端口。三层中的任何一层失败,都可能在界面上表现为“无法连接”。
不同客户端对同一条核心日志的显示形式可能不同。有的保留时间、日志级别和模块名称,有的只展示消息正文。mihomo 版本更新后,字段名称与措辞也可能变化。因此不要只搜索一整句报错,应提取其中稳定的对象,例如配置文件路径、监听地址、端口号、域名、节点名称、网络类型和系统错误。
| 日志级别 | 通常含义 | 处理方式 |
|---|---|---|
| debug | 连接建立、规则匹配和 DNS 查询的详细过程 | 只在复现问题时临时开启,重点查看失败前后的连续记录 |
| info | 核心启动、配置加载、监听端口和正常连接状态 | 确认功能是否按预期启用,不把普通状态当成错误 |
| warning | 存在异常条件,但核心可能仍可继续运行 | 结合实际功能判断影响范围,继续查看后续记录 |
| error | 某个配置、监听、解析或连接操作已经失败 | 从该行向前回看触发条件,再向后确认是否重试成功 |
| fatal | 核心无法继续启动或关键组件初始化失败 | 优先处理,修复后重新启动核心并重新读取日志 |
单独出现 warning 或 error 不一定代表所有代理流量都已中断。例如某个节点连接超时,只影响当次连接或对应策略组;一个备用 DNS 服务器失败,也可能由其他服务器完成查询。判断影响范围时,要同时查看错误对象、发生频率和后续是否出现成功记录。
REPRODUCE FIRST
按时间顺序复现问题
有效的日志分析需要明确的复现过程。不要在客户端连续运行数小时后,从混合了配置更新、延迟测试和后台程序连接的记录中猜测原因。更可靠的方法是清空当前日志或记下起始时间,然后只执行一个触发问题的动作。这样可以把用户操作与日志时间对应起来。
- 记录当前环境。确认客户端名称、核心类型、操作系统、当前配置文件、代理模式以及是否启用 TUN。刚完成客户端或核心更新时,也要记下更新前后状态。
- 停止无关测试。暂时关闭自动测速、配置自动更新和会持续产生连接的程序,减少日志噪声。
- 从较低日志量开始。先使用 info 级别复现;如果只能看到连接失败结果,再临时切换到 debug。问题定位后恢复常用级别,避免日志快速增长。
- 只执行一个动作。例如更新一次订阅、打开一个确定的网页、切换一次节点,或者单独启用 TUN。
- 定位第一条异常。从操作发生的时间点向下查看,找到最早的 warning、error 或明显超时,再检查它前面的配置与路由信息。
- 修改一个变量后重试。每轮只更换节点、端口、DNS 或运行模式中的一项,否则无法确认是哪项修改生效。
日志中的时间顺序比错误数量更有价值。假设先出现配置解析失败,随后出现控制端口连接失败,最后界面提示核心未运行,那么根因通常是第一条配置错误,而不是最后的控制端口错误。又如 TUN 初始化失败之后,应用仍能通过系统代理访问网络,说明代理核心可能正常,只是透明接管路径没有建立。
启动客户端
→ 读取配置
→ 初始化 DNS 与规则
→ 监听本地代理端口
→ 初始化 TUN(如启用)
→ 接收应用连接
→ 匹配规则
→ 选择节点
→ 建立远端连接
可以把这条链路当成检查顺序。错误发生在哪一步,就先处理该步骤以及它依赖的前置步骤,不要直接跳到更换节点或重装客户端。
CONFIG PARSER
配置解析与核心启动错误
配置错误通常发生在核心正式监听端口之前。常见关键词包括 parse、yaml、unmarshal、invalid config、field、duplicate 和 not found。这类错误出现时,继续测试节点或系统代理没有意义,因为核心可能尚未加载出可运行的配置。
YAML 结构无法解析
YAML 依赖缩进表达层级。使用 Tab、列表项层级不一致、冒号后缺少空格、引号没有闭合,都会导致解析停止。日志一般会给出行号和列号,但实际问题也可能位于提示行之前,例如上一行字符串没有结束,解析器到下一行才发现结构不合法。
proxies:
- name: Example
type: ss
server: example.test
port: 443
proxy-groups:
- name: SELECT
type: select
proxies:
- Example
检查时先确认缩进全部使用空格,再查看报错行前后数行。节点名称包含冒号、井号或其他具有 YAML 语义的字符时,应由配置提供方正确引用。手动编辑过配置后出现错误,可以先回退修改,验证原始配置能否加载。
字段存在但当前核心不支持
Clash 配置并不是所有核心版本都完全通用。某些字段只由 mihomo 支持,旧核心读取时可能报告未知字段、类型错误或缺少必要参数。反过来,客户端更新核心后,过时字段也可能触发警告。此时要确认客户端实际调用的核心,而不是只看客户端产品名称。配置适用于 mihomo 时,应使用支持相应语法的客户端与核心版本。
引用对象不存在
策略组引用了不存在的节点、规则指向未定义的策略组、规则集合路径无法读取,都会造成加载失败或部分功能不可用。重点对照错误中的对象名称,检查大小写、空格和全角字符。名称必须精确匹配;看起来相同的前后空格也可能造成引用失败。
LISTENER STATUS
端口占用与系统代理错误
端口错误的典型关键词是 address already in use、bind、listen、permission denied 或 connection refused。Clash 核心通常需要监听 HTTP、SOCKS、混合端口或外部控制端口。如果另一个核心实例、旧客户端进程或其他网络工具已经占用相同地址,新进程就无法完成监听。
address already in use 表示指定地址与端口已经被其他进程占用。先退出所有同类客户端,再检查任务管理器或系统进程列表中是否仍有核心进程。不要仅关闭窗口,因为部分客户端会继续在托盘运行。确认没有残留进程后重新启动;如果端口仍被占用,再修改为未使用端口,并同步更新依赖该端口的浏览器或应用设置。
permission denied 要结合监听位置判断。普通本地高位端口通常不需要特殊权限,但系统安全策略、防火墙规则或受限制的运行目录仍可能阻止操作。若日志提到的是 TUN、路由或服务注册,则属于系统权限问题,不应通过反复更换代理节点处理。
connection refused 的方向也很重要。客户端界面连接外部控制端口被拒绝,常表示核心没有启动、控制地址不一致,或核心已经退出;代理核心连接远端服务器被拒绝,则表示目标地址可达,但对应远端端口没有接受连接。两者包含相同措辞,故障位置却完全不同,要看日志中的源地址、目标地址和模块名称。
| 日志对象 | 优先检查 |
|---|---|
| 127.0.0.1 或 ::1 | 本地核心是否启动、端口是否一致、是否有残留进程 |
| 0.0.0.0 | 监听设置、防火墙与局域网访问配置 |
| 外部控制端口 | 控制地址、认证信息以及界面与核心的连接状态 |
| 远端节点地址 | 节点可用性、网络阻断、端口与协议参数 |
系统代理开启失败不等于核心端口没有工作。可以先确认日志中本地代理监听成功,再检查操作系统代理设置是否已指向对应端口。如果手动配置的浏览器可以连接,而普通应用不能连接,问题更可能位于系统代理设置、应用是否遵循系统代理,或应用自身的网络配置。
DNS PIPELINE
DNS 查询与解析异常
DNS 问题常表现为网页提示找不到域名、部分站点可用而部分站点失败、TUN 启用后所有域名连接超时,或日志反复出现 lookup、resolve、no such host、timeout、SERVFAIL。分析时先区分“域名没有得到地址”和“已经得到地址但后续连接失败”。如果日志已经显示目标 IP 并进入拨号阶段,根因通常不再是最初的域名解析。
传统 DNS、DNS over HTTPS 与 DNS over TLS 的依赖不同。加密 DNS 服务器本身使用域名时,核心可能需要通过 bootstrap 或默认解析器先得到服务器地址。这个前置解析失败,就会造成后续所有查询无法发送。日志中若反复对 DNS 服务器域名进行查询并超时,应检查默认解析器、网络可达性以及配置中的 nameserver-policy,而不是只更换代理节点。
Fake IP 模式下,应用先收到保留地址,核心再依据内部映射恢复原始域名并执行规则匹配。看到保留地址不代表解析错误。真正需要关注的是映射是否存在、目标域名是否被正确接管,以及某些不适合 Fake IP 的局域网域名或设备发现域名是否需要过滤。Redir Host 模式则直接向应用返回解析结果,故障日志的表现会有所不同。
DNS 超时的定位顺序
- 确认配置能够正常加载,DNS 模块已经初始化。
- 查看失败的是所有服务器,还是某一个备用服务器。
- 确认查询使用直连还是代理路径,相关策略是否形成循环依赖。
- 检查 DNS 服务器的地址与协议格式是否被当前核心支持。
- 关闭 TUN 后使用系统代理重试,判断问题是否只存在于接管路径。
- 查看域名解析成功后是否继续出现 TLS、连接超时或路由失败。
TUN DEVICE
TUN 模式启动失败
TUN 模式通过虚拟网卡和系统路由接管更多应用流量,涉及权限、驱动、网络接口和路由表,因此它的错误范围比普通系统代理更广。常见关键词包括 tun、interface、route、adapter、device、service 和 operation not permitted。
第一步是判断“核心整体失败”还是“只有 TUN 初始化失败”。如果本地 HTTP 或 mixed 端口已经监听成功,并且关闭 TUN 后系统代理可以工作,说明节点、规则和基础核心大概率可用,故障集中在虚拟网卡路径。此时应检查客户端要求的服务组件、运行权限以及系统中其他 VPN、虚拟机或网络过滤工具。
出现接口创建失败时,先彻底退出其他可能创建虚拟网卡的程序,再重启客户端。出现路由添加失败时,检查是否存在同网段冲突、旧路由残留或权限不足。日志若指出找不到指定网络接口,则可能是配置中固定了已经变化的接口名称;笔记本从有线切换到无线、网络设备重装后,接口标识可能发生变化。
macOS、Windows 和 Linux 的 TUN 实现与权限模型不同,不能直接套用另一平台的处理命令。桌面客户端若提供服务模式或辅助服务,应先确认该组件状态正常。Linux 环境还要确认 TUN 设备与网络管理权限。无论在哪个平台,都应先用客户端自身提供的启停入口测试,不要同时叠加多个接管工具。
TUN 开启后断网但日志没有致命错误
这种情况要检查默认路由、DNS 接管和规则结果。若日志显示连接进入 DIRECT,但直连流量无法从正确接口发出,可能是出口接口自动识别失败。若所有域名查询超时,则先处理 DNS 路径。若只有局域网设备不可访问,则检查局域网网段是否被错误接管,以及私有地址规则是否按预期直连。
排查 TUN 时建议保留一个对照组:关闭 TUN,仅开启系统代理并访问同一目标。如果系统代理成功、TUN 失败,继续检查网卡与路由;如果两种模式都失败,再回到 DNS、节点和远端连接层分析。
OUTBOUND CONNECTION
连接失败、超时与 TLS 报错
核心完成规则匹配后,会通过选定的出站节点连接目标。此阶段的日志通常包含目标域名或 IP、端口、网络类型、策略组、节点名称和耗时。最重要的问题是:连接的是节点服务器,还是节点已经建立后继续连接目标站点。日志模块与地址可以帮助区分两段链路。
i/o timeout 或 context deadline exceeded
超时表示操作在限定时间内没有完成,但不能单独说明原因。节点服务器不可达、网络丢包、DNS 查询迟迟没有结果、目标站点不响应,都可能产生超时。先看超时对象:若是节点服务器地址,切换同订阅中的其他节点进行对照;若多个不同地区节点同时超时,优先检查本地网络、DNS 和防火墙;若只有特定目标失败,则查看规则结果和目标可达性。
connection reset by peer
该信息表示连接建立后被对端或链路中的设备重置。偶发一次可能是网络波动或服务端主动结束连接;持续发生则要核对节点协议、端口、传输层参数和服务器状态。不能仅凭 reset 判断是客户端故障。使用另一个节点访问相同目标,或使用同一节点访问不同目标,可以快速缩小范围。
TLS handshake timeout 与证书错误
TLS 握手超时常见于链路质量差、目标不可达或协议参数不匹配。证书错误还要确认系统日期和时区是否正确,因为错误时间会让有效证书被判断为尚未生效或已经过期。节点配置包含服务器名称、传输层安全参数时,应保持订阅下发内容完整,不要在不了解用途时手动删除。
network is unreachable 与 no route to host
这类日志指向路由层。可能是当前网络没有对应的 IPv4 或 IPv6 出口、TUN 路由未建立、指定接口不可用,或目标地址所在网络无法到达。如果日志显示尝试 IPv6 而本地网络没有稳定 IPv6,可以检查 DNS 结果和核心的地址选择;如果 IPv4、IPv6 均失败,则返回检查系统网络与路由。
| 现象 | 对照测试 | 可能范围 |
|---|---|---|
| 只有一个节点失败 | 同策略组切换其他节点 | 节点状态、协议参数或远端端口 |
| 所有节点都失败 | 关闭 TUN 后使用系统代理测试 | 本地网络、DNS、核心配置或接管路径 |
| 只有一个域名失败 | 访问其他域名并查看规则结果 | 目标站点、域名解析或特定规则 |
| 浏览器可用,其他应用失败 | 检查应用是否遵循系统代理 | 应用代理支持或 TUN 接管范围 |
| 连接一段时间后中断 | 查看中断时的 reset、timeout 与切换记录 | 链路波动、节点切换或连接保活 |
RULE MATCH
规则匹配与流量去向
有时连接本身没有报错,但流量走向不符合预期,例如应代理的域名被直连,局域网地址被送入节点,或策略组选择了失效节点。这类问题要查看规则匹配日志,而不是只搜索 error。debug 或详细连接日志通常会展示目标、命中的规则和最终策略。
Clash 规则按配置顺序匹配,命中后通常停止继续检查。较宽泛的规则放在前面,可能覆盖后面的精确域名规则。最终的 MATCH 规则负责承接此前未命中的连接。如果日志显示命中了错误策略,应回到配置中查找该规则的位置、规则集合内容以及策略组当前选择。
策略组名称不等于实际节点。日志可能先显示某连接交给名为“自动选择”的策略组,再由该组选择具体节点。排查时既要看规则把连接送到了哪个组,也要看该组当时的实际选项。延迟测试成功只说明测试 URL 在测试时可达,不保证节点能访问所有目标,也不代表长连接始终稳定。
DIRECT 同样是一种明确的出站策略。命中 DIRECT 后失败,应检查本地网络、DNS 和目标站点,而不是期待代理节点解决。REJECT 则表示规则主动终止连接,日志中的拒绝属于配置预期结果。应用反复请求被 REJECT 的域名时,可能产生大量记录,但这并非核心异常。
INCIDENT CHECKLIST
日志收集与故障排查清单
需要向客户端维护者、订阅提供方或其他技术人员反馈时,日志应包含足够上下文,同时移除敏感信息。有效反馈不应只有一张“连接失败”截图,也不需要导出数小时的完整记录。保留复现动作前后几十秒的连续日志,通常更容易定位。
应一并记录的信息
- 操作系统及版本、客户端名称与版本、实际核心类型与版本。
- 当前使用规则模式、全局模式或直连模式,是否启用系统代理与 TUN。
- 问题出现前执行的动作,例如更新配置、切换节点、休眠恢复或升级客户端。
- 可重复的操作步骤,以及问题是持续发生还是偶发。
- 第一条异常前后的连续日志,而不是只截取最后一行。
- 关闭 TUN、切换节点或更换网络后的对照结果。
分享前应处理的内容
日志与配置可能包含订阅地址、认证参数、节点服务器地址、局域网设备地址、访问域名和本地文件路径。公开发布前应逐项检查并遮盖这些内容,但要保留错误类型、端口范围、协议类别和时间顺序。不要把所有地址替换成同一个值,否则会丢失“本地地址还是远端地址”“同一目标还是多个目标”等关键关系。
从现象到根因的固定顺序
- 确认操作系统本身可以联网。
- 确认配置解析完成,核心没有在启动阶段退出。
- 确认本地代理端口与控制端口监听成功。
- 确认 DNS 查询能够返回结果。
- 启用 TUN 时,确认虚拟网卡与路由初始化成功。
- 确认目标连接命中了预期规则与策略组。
- 确认策略组选择了可用节点,并能连接节点服务器。
- 最后再检查目标站点、TLS 握手和应用自身代理设置。
这套顺序的核心是先处理上游依赖。配置未加载时不测试端口,端口未监听时不检查应用代理,DNS 未完成时不判断目标连接,TUN 未建立时不把所有超时归因于节点。每次只改变一个条件,并保留修改前后的日志对照,通常比反复切换多项设置更快找到根因。
下载客户端与继续排查
按设备平台选择支持当前核心的客户端,安装后通过使用指南完成订阅导入、代理启用与连接验证。