网络中断结束后,本机直连往往已经恢复,但 Clash 仍可能停在全局直连、绑在旧网卡,或策略组沿用故障期间的选择。这类现象应先对照官方全局配置,而不是假定规则文件已经损坏。下面只说明如何把代理相关的全局项恢复到日常可用状态。
适用条件
适用于 mihomo 能够启动、配置文件可以加载,并且故障期间可能改过运行模式、出站接口、局域网入口,或通过 API 切换过策略组的情况。mode 拥有默认值,默认为规则模式。若进程未起来或配置未能加载,应先恢复内核运行,再改下列字段。本文不展开规则列表本身。
核对运行模式与出站接口
先看 mode。rule 表示规则匹配;global 表示全局代理,需要在 GLOBAL 策略组选择代理或策略;direct 表示全局直连。排查故障时若改成 direct,链路恢复后仍会直连,代理端口即使还在也不按规则出站。若停在 global,请求不再走规则列表。要恢复按规则分流,应把 mode 设为 rule。判断依据是:需要直连的目标与需要代理的目标是否重新出现差异;若全部直连或全部同一出口,应优先怀疑模式。
再检查 interface-name。该项指定 mihomo 的流量出站接口,文档示例为 en0。拨号重连、无线与有线切换、虚拟网卡启用后,接口名可能变化。字段仍指向旧网卡时,本机协议栈已恢复,Clash 出站却失败。不需要绑定特定网卡时,不要继续填写已经不存在的接口名。Linux 还要核对 routing-mark,它为出站连接提供默认流量标记,文档示例为 6666。标记与当前路由策略不一致时,恢复网络后仍可能走错路径。
恢复策略记忆、地址族与连接参数
profile 里 store-selected 为 true 时,会储存 API 对策略组的选择,供下次启动使用。故障期间若把组切到 DIRECT 或不可用节点,恢复后仍会使用该选择。需要回到故障前策略时,应通过 API 重新选择,或关闭该项后按配置启动。store-fake-ip 为 true 时储存 fakeip 映射表,域名再次发生连接时使用原有映射地址;网络抖动后旧映射可能与当前解析不一致,需结合是否仍要复用映射来决定。
ipv6 控制是否允许内核接受 IPv6 流量,可选 true/false,默认为 true。恢复后的链路若实际没有 IPv6,仍接受 IPv6 可能让部分连接停在不可达地址。tcp-concurrent 为 true 时,会使用 DNS 解析出的所有 IP 地址进行连接,并使用第一个成功的连接。故障刚结束时解析结果可能混有不可达地址,应按该行为判断,而不是只看单个地址。
移动网络可核对 keep-alive-interval、keep-alive-idle(单位为秒)以及 disable-keep-alive。文档说明修改 TCP Keep Alive 以减少移动设备耗电问题;在 Android 上 disable-keep-alive 强制为 true。若其他设备要经过代理端口访问,还需确认 allow-lan、bind-address、lan-allowed-ips 与 lan-disallowed-ips。bind-address 为 * 表示绑定所有 IP;若绑定了故障前的单个 IPv4 或 IPv6 地址,地址变化后入口会失效。黑名单优先级高于白名单,默认允许 0.0.0.0/0 和 ::/0。
失败时下一步
把 log-level 调到 info 或 debug。该项仅在控制台和控制页面输出:silent 不输出;error 仅输出发生错误至无法使用的日志;warning 输出发生错误但不影响运行的日志以及 error 级别内容;debug 尽可能输出运行中所有信息。用日志判断模式是否仍为 direct、出站接口是否无效、策略组选择是否被储存。进程匹配可看 find-process-mode:always 强制匹配所有进程,strict 为默认并由 Clash 判断是否开启,off 不匹配进程、推荐在路由器上使用。全局项已与当前网卡和模式一致后仍然异常,应停止反复修改全局配置,改为检查规则匹配与 DNS。