Chapter 01 / Baseline
配置骨架与调试基线
Clash 配置不是一张彼此独立的设置清单,而是一条有先后关系的处理链。客户端先读取监听端口、运行模式和 DNS 等基础项,再装载代理节点与策略组,随后加载规则和规则集,最后由系统代理或 TUN 把流量送进内核。任何一层引用不存在的名称,都会影响后续行为。最常见的例子是规则指向了已经改名的策略组:配置可能仍能解析,但命中的流量无法按预期选择出口。因此,进阶调整的第一步不是增加更多参数,而是先建立一份能解释、能验证、能回退的基线配置。
先分清客户端设置与内核配置
Clash Plus、Clash Verge Rev、FlClash、Clash Nyanpasu 等图形客户端通常把设置分成两层。第一层属于应用本身,例如开机启动、系统代理开关、配置更新周期、界面主题和服务安装状态;第二层才是传给 mihomo 内核的 YAML。系统代理按钮通常不会改写订阅文件,它只改变操作系统的代理入口。TUN 开关则可能由客户端生成一段运行时覆写,所以在原始订阅里找不到完全相同的字段。排查时应同时查看当前生效配置与订阅原文,不能只盯着下载下来的 YAML。
一份适合调试的基础段落应保持克制。日志级别先用 info,足以看到连接、规则命中和 DNS 错误;只有需要追踪具体请求时再临时切换到 debug。端口是否需要显式填写取决于客户端的管理方式,桌面客户端可能在启动时注入自己的端口。若手工维护裸配置,可以使用下面的结构,但应确认端口没有被其他代理程序占用。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
unified-delay: true
profile:
store-selected: true
store-fake-ip: true
mode: rule 表示按规则决定直连、代理或拒绝;unified-delay 让测速口径更接近完整连接过程,但它不会改变真实网络质量;store-selected 用于保存策略组选择,重新启动后不必逐组重选;store-fake-ip 保存 Fake-IP 映射,减少重启后短时间内映射变化带来的连接波动。移动端若由系统回收应用进程,持久化设置尤其重要,但仍要由客户端授予正常的后台运行条件。
用最短链路建立验证闭环
每次改动后先确认配置能被内核载入,再确认代理节点能建立连接,然后看一条测试请求命中了哪条规则,最后才检查目标应用。若日志在配置解析阶段已经报错,继续切换节点没有意义;若节点握手失败,优先处理订阅和网络,不要先改 DNS;若浏览器正常而某个应用失败,再检查该应用是否绕过系统代理、使用了独立 DNS 或 QUIC。这样的顺序可以把问题锁定在单一层级。
| 检查层 | 应看到的结果 | 失败时优先处理 |
|---|---|---|
| 配置解析 | 配置成功载入,没有字段或缩进错误 | YAML 缩进、重复键、无效引用 |
| 节点连接 | 策略组内存在可选代理并能建立会话 | 订阅有效性、网络权限、协议参数 |
| 规则匹配 | 日志显示请求命中预期规则与策略 | 规则顺序、策略组名称、规则集加载 |
| 系统接管 | 目标应用流量进入系统代理或 TUN | 系统代理、VPN 权限、路由冲突 |
配置文件中的缩进只使用空格,不要混入制表符。包含冒号、井号或特殊字符的文本可以加引号,策略组名称一旦被规则引用就应保持稳定。若需要更换客户端,先到下载页选择对应平台;全平台优先考虑 Clash Plus,再根据系统和操作习惯选择其他客户端。迁移时先导入同一订阅验证基础连接,再迁移本地覆写,避免把旧客户端生成的运行时字段直接当作通用配置复制。
Chapter 02 / Policy
策略组类型与组合方式
策略组位于节点和规则之间。规则通常不直接绑定某个节点,而是把请求送到一个稳定的策略名称,再由策略组决定使用哪个出口。这样可以在节点变化时保持规则不动,也可以把手动选择、自动测速、故障切换和负载分配拆成不同层次。设计策略组时最重要的原则是名称清晰、层级有限、用途单一。一个组同时承担地区选择、业务分类和自动切换,短期看起来省事,后续排查时却很难知道最终选中了哪条链路。
select、url-test、fallback 与 load-balance
select 是手动选择组,适合总入口和需要人为固定出口的业务。它不会主动判断节点质量,当前节点失效后仍可能保持原选择。url-test 会按指定地址进行连通测试,并根据结果选择表现合适的节点,适合日常自动选择。fallback 按列表顺序优先使用前面的可用节点,适合对出口稳定性要求高、希望主备关系明确的场景。load-balance 会把连接分配到多个节点,适合能容忍出口变化的并行请求,但登录会话、风控敏感服务和依赖固定来源地址的业务通常不适合。
proxy-groups:
- name: 总选择
type: select
proxies:
- 自动选择
- 故障切换
- DIRECT
- name: 自动选择
type: url-test
use:
- main-provider
url: https://www.gstatic.com/generate_204
interval: 600
tolerance: 80
lazy: true
- name: 故障切换
type: fallback
use:
- main-provider
url: https://www.gstatic.com/generate_204
interval: 600
lazy: true
interval 是检测间隔,设置过短会增加节点和设备的唤醒频率,移动端还可能增加后台耗电;设置过长则会延迟发现故障。tolerance 用于减少相近结果之间的频繁切换,它不是速度加成,而是稳定性阈值。lazy: true 表示组在实际使用时再进行检测,适合降低空闲时开销。测试地址应返回轻量且稳定的响应,不要把文件下载地址当作健康检查目标,也不要以一次测试结果代替长时间稳定性判断。
策略组应围绕业务语义命名
推荐先保留一个“总选择”作为统一出口,再按业务建立“流媒体”“开发服务”“即时通信”等策略。业务组内部可以引用“总选择”、地区组或 DIRECT,规则只引用业务组。这样更换节点来源时只需要调整底层组,规则层保持稳定。组名允许中文,但修改名称时要同步检查 rules、rule-providers 的行为字段,以及其他策略组中的引用。名称大小写和空格都属于标识的一部分,多一个空格也会成为不同名称。
- name: 开发服务
type: select
proxies:
- 总选择
- 自动选择
- DIRECT
- name: 流媒体
type: select
proxies:
- 总选择
- 自动选择
rules:
- DOMAIN-SUFFIX,github.com,开发服务
- DOMAIN-SUFFIX,githubusercontent.com,开发服务
- MATCH,总选择
节点较多时,不必把所有名称逐个写入 proxies,可以通过代理提供者的 use 引入,再配合筛选表达式缩小范围。筛选依赖订阅中的节点命名质量,若不同供应源命名规则不一致,单靠地区关键词容易误选。应先在客户端查看实际节点名,再编写过滤条件;更新订阅后也要检查是否出现新命名。排除测试节点、过期提示节点和倍率标记时,要避免表达式过宽导致正常节点一起消失。
| 组类型 | 适用目标 | 主要边界 |
|---|---|---|
| select | 人工固定出口、总入口、业务选择 | 不会自动绕开失效节点 |
| url-test | 日常自动选择、节点较多的订阅 | 测试结果不等同于业务实际体验 |
| fallback | 明确主备顺序、稳定出口 | 列表顺序需要持续维护 |
| load-balance | 可并行且不依赖固定出口的连接 | 可能触发会话或来源地址变化 |
策略组排错应从引用关系开始。先确认规则命中的组名,再打开该组查看当前选择,继续向下追踪到实际节点。若自动组看似没有切换,检查测试地址是否可达、检测间隔是否尚未到期,以及客户端是否暂停后台活动。若某项服务频繁重新登录,把它从负载分配组移到固定出口组测试。策略层的目标不是堆叠更多自动化,而是让每一次选择都能从日志和组结构中解释。
Chapter 03 / Rules
规则集订阅化管理
当规则从十几条增长到数百条后,把所有内容继续塞进主配置会迅速失去可维护性。rule-providers 用于把不同主题的规则拆成独立资源,由主配置声明下载地址、格式、更新周期和匹配行为。主文件只保留调用顺序,规则内容由对应规则集维护。这样可以单独更新广告拦截、局域网、开发服务或流媒体规则,也能在某个规则集异常时快速停用,而不必重写完整订阅。
provider 定义与 RULE-SET 调用
规则提供者的名称只是本地引用标识,真正影响解析的是 behavior、format 与资源内容。behavior: domain 适合只包含域名类条目的集合;ipcidr 面向 IP 网段;classical 可以容纳带类型前缀的经典规则。格式要与远端文件一致,常见文本规则可使用 text,YAML 规则使用 yaml。不要把 classic 内容声明成 domain,否则加载成功也不代表匹配语义正确。
rule-providers:
private-domain:
type: http
behavior: domain
format: yaml
path: ./ruleset/private-domain.yaml
url: https://example.com/rules/private-domain.yaml
interval: 86400
developer:
type: http
behavior: classical
format: text
path: ./ruleset/developer.list
url: https://example.com/rules/developer.list
interval: 86400
rules:
- RULE-SET,private-domain,DIRECT
- RULE-SET,developer,开发服务
- GEOIP,LAN,DIRECT,no-resolve
- MATCH,总选择
示例域名只表示字段结构,实际使用时应替换成已确认可访问且内容可信的规则来源。path 是本地缓存位置,不同提供者不要共用同一路径。interval 以秒为单位,公共规则通常没有必要数分钟更新一次;过于频繁只会增加请求和写入。更新失败时,内核一般会继续使用已有缓存,因此排查时要区分“首次下载失败”和“更新失败但旧规则仍在生效”。删除缓存后重试会失去这个回退条件,不应作为第一步操作。
规则顺序就是优先级
Clash 从上到下寻找第一条匹配规则,命中后不再继续。具体规则应放在宽泛规则之前:私有域名和局域网通常先直连,业务域名再进入对应策略,IP 规则放在需要解析地址的位置,最后由 MATCH 接住其余流量。把大范围代理规则放在顶部,后面的直连例外就永远不会执行。排查错误分流时,日志中的“命中哪条规则”比猜测域名属于哪个分类更可靠。
no-resolve 表示匹配 IP 类规则时不要为了得到 IP 主动触发 DNS 解析。它可以避免不必要的解析,但不适合机械地加在所有规则后面。域名请求若前面没有域名规则,而后续又依赖 GEOIP 判断,完全阻止解析可能使这条规则无法获得所需地址。是否添加应根据规则类型和 DNS 模式决定。对于已经直接拿到目标 IP 的连接,IP 规则仍可正常匹配。
本地少量例外可以直接写在 rules 顶部,不必为三五条条目创建远端规则集。例如某个工作域名必须直连,或某个应用接口必须固定到“开发服务”,把这些规则放在订阅规则集之前即可。若例外数量持续增长,再迁移到本地 provider。这样既保持主配置可读,也避免为每次微调发布远端文件。
rules:
- DOMAIN,router.local,DIRECT
- DOMAIN-SUFFIX,corp.example,DIRECT
- DOMAIN-SUFFIX,github.com,开发服务
- RULE-SET,private-domain,DIRECT
- RULE-SET,developer,开发服务
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- MATCH,总选择
规则集故障的定位顺序
先查看 provider 状态是否完成加载,再确认远端响应内容与声明格式相符,随后检查规则集名称是否与 RULE-SET 引用一致,最后检查调用位置。状态正常但始终不命中,常见原因是行为类型错误、规则被前面的宽泛条目截获,或目标连接只暴露 IP 而规则集只有域名。若更新后突然出现大量错误分流,可以恢复上一份本地缓存或临时注释该规则集,验证问题是否来自上游内容变化。
规则来源越多,更新节奏和命名越难统一。更稳妥的结构是按用途选择少量规则集,每个业务只设一个主要来源,本地例外作为最高优先级。不要同时引入多个覆盖范围近似的全集规则,再期待顺序自动解决冲突。需要同步多设备时,可参考多设备配置同步方案,将主配置、订阅链接和本地规则分开管理。
Chapter 04 / DNS
DNS 配置优化与泄漏排查
DNS 决定域名如何转换为地址,也直接影响域名规则能否准确匹配。Clash 开启 DNS 模块后,应用的查询可以先进入本地监听,再由内核根据配置选择上游解析器。这里要解决三个问题:查询是否真正进入 Clash、不同域名应该交给哪个上游、解析结果是否能和后续连接保持对应。单纯堆叠很多公共 DNS 地址不会自动提高稳定性,反而可能让结果来源和故障边界变得模糊。
nameserver、default-nameserver 与 proxy-server-nameserver
nameserver 是主要解析上游。default-nameserver 用于解析 DoH 或代理服务器自身的域名,因此通常填写可以直接访问的 IP 形式解析器,避免为了连接解析器而再次需要解析域名。proxy-server-nameserver 可专门处理代理节点域名,避免节点地址解析受业务 DNS 规则影响。若订阅节点使用域名而这一层解析失败,界面可能表现为所有节点同时不可用,但根因并不在节点协议。
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
use-hosts: true
respect-rules: true
default-nameserver:
- 223.5.5.5
- 1.1.1.1
nameserver:
- https://dns.alidns.com/dns-query
- https://1.1.1.1/dns-query
proxy-server-nameserver:
- https://dns.alidns.com/dns-query
fake-ip-filter:
- "*.lan"
- "*.local"
- "time.*.com"
- "ntp.*.com"
respect-rules 让 DNS 请求参考代理规则,但这要求代理解析链已经能工作,否则可能形成先有代理还是先有解析的循环依赖。配置初期如果遇到上游不可达,可以先关闭这一项验证基础解析,再逐步启用。listen 需要与客户端的 DNS 接管方式配合,桌面端由 TUN 接管时通常不需要让局域网设备访问该端口;若设置为对外监听,还应同时检查防火墙与局域网访问范围。
解析器数量与 fallback 逻辑
主解析器选择两到三个稳定来源通常已经足够。不同解析器返回的地址可能受网络位置、CDN 调度和缓存影响,列表越长并不意味着结果越准确。若使用 fallback,需要同时理解过滤条件,否则所有查询都可能进入多路解析,增加等待和网络请求。对于规则清晰的配置,优先使用 nameserver-policy 按域名指定解析器,比依赖宽泛的回退判断更容易解释。
nameserver-policy:
"geosite:private":
- system
"+.corp.example":
- 10.0.0.53
"geosite:cn":
- https://dns.alidns.com/dns-query
策略中的域名匹配应与实际规则集能力一致。企业内网域名只能由内部 DNS 解析时,必须确保访问内部解析器的路由是直连或能到达办公网络。把内网解析器放进通用 nameserver 会导致离开办公网络后查询持续超时,更合适的方式是仅对特定后缀使用它。若系统同时运行其他 VPN、网络过滤器或安全软件,还要确认它们没有先于 Clash 重写 DNS。
DNS 泄漏要先定义观察范围
所谓 DNS 泄漏通常指本应由指定链路处理的查询,仍被系统或应用直接发送到其他解析器。检查时不能只看一个网页给出的解析器名称,应结合系统网络设置、Clash 日志和抓包结果判断。浏览器可能启用自己的安全 DNS,移动应用也可能内置 DoH;这类请求看起来像普通 HTTPS 流量,不一定经过系统的 53 端口。若希望统一交给 Clash,应关闭应用内独立解析,或通过规则明确处理其 DoH 域名。
| 现象 | 可能断点 | 检查动作 |
|---|---|---|
| 所有节点域名解析失败 | default 或 proxy-server-nameserver 不可达 | 用 IP 解析器建立最小启动链 |
| 浏览器正常,单个应用失败 | 应用内置 DNS、QUIC 或绕过系统代理 | 查看 TUN 接管与应用网络设置 |
| 内网域名无法解析 | 内部 DNS 未按域名分流 | 增加 nameserver-policy 并检查路由 |
| 解析正常但连接到错误地址 | 缓存、CDN 调度或 Fake-IP 映射异常 | 核对日志后再清理对应缓存 |
修改 DNS 后应重新加载配置,并确认日志里 DNS 模块成功监听,再分别测试普通域名、内网域名和节点域名。不要一遇到打不开网页就清空全部缓存,这会同时改变系统缓存、浏览器缓存和 Fake-IP 映射,使前后结果难以对比。若客户端显示已连接但完全无法上网,可以按已连接却无法上网排查清单从节点、订阅、DNS、系统代理和 TUN 依次检查。
Chapter 05 / Network stack
TUN 模式与 Fake-IP 协同
系统代理只能覆盖主动遵循代理设置的应用。命令行工具、部分游戏、独立网络栈应用以及直接发起 UDP 的程序,可能完全绕过系统代理。TUN 模式通过虚拟网络接口接管系统路由,把这些流量送入 Clash 内核,因此覆盖范围更完整。Fake-IP 则在 DNS 阶段返回一段映射地址,让内核在收到连接时恢复原始域名并执行域名规则。两者经常一起使用,但承担的是不同职责:TUN 负责把流量带进来,Fake-IP 负责保留域名语义。
TUN 字段与系统权限
tun:
enable: true
stack: mixed
dns-hijack:
- any:53
- tcp://any:53
auto-route: true
auto-detect-interface: true
strict-route: true
mtu: 1500
dns:
enable: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
stack 决定 TUN 使用的网络栈实现。mixed 在支持的内核中兼顾兼容性与性能,若特定平台出现异常,可分别测试 system 或 gvisor,但不要在没有对照的情况下频繁切换。auto-route 自动写入路由,auto-detect-interface 尝试识别当前出口网卡;设备在 Wi-Fi、移动网络和有线网络之间切换时,这一项能减少手工指定接口的维护。strict-route 会更严格地防止流量绕过,但可能暴露与其他 VPN、虚拟机和容器网络的路由冲突。
TUN 启动需要系统级 VPN 或网络扩展权限。Windows 客户端可能通过服务模式提升网络操作权限;macOS 需要允许网络扩展;Android 与 iOS 会显示系统 VPN 授权。权限被拒绝时,界面开关可能短暂开启后恢复,日志中也会出现设备创建或路由写入错误。此时反复导入订阅没有作用,应先处理系统授权。macOS 的具体弹窗与恢复步骤可参考网络扩展与钥匙串处理指南。
Fake-IP 的映射过程
Fake-IP 模式收到域名查询后,不立即把真实地址直接交给应用,而是从保留地址段分配一个映射值。应用连接该地址时,内核根据映射表还原域名,然后匹配 DOMAIN、DOMAIN-SUFFIX 或规则集。它的优势是即使应用只把目标地址交给网络层,Clash 仍能掌握原域名。映射地址不是远端服务器地址,也不应拿去做公网路由测试。看到 198.18.0.0/16 范围的结果通常表示 Fake-IP 正常参与了解析。
某些局域网发现、时间同步、打印设备、游戏平台或依赖真实 DNS 回答的程序不适合 Fake-IP,需要加入 fake-ip-filter。过滤范围应尽量具体。直接排除过大的域名集合会让大量请求回到真实地址模式,削弱域名还原效果,也可能使规则依赖 IP 匹配。出现兼容问题时先从日志确定域名,再增加单条后缀并复测,不要复制一份来源不明的超长过滤表。
MTU、UDP 与网络切换
页面能打开但部分图片、上传或特定应用卡住时,可能是路径 MTU 不合适。TUN 封装会增加额外开销,底层网络若已存在 VPN、PPPoE 或移动网络限制,1500 字节可能导致分片或丢包。可以在保留其他配置不变的前提下逐步降低 MTU,例如先测试 1400 左右的范围,并观察问题是否稳定消失。MTU 不是越小越安全,过小会增加包数量和处理开销,确认有效后应选择能够稳定工作的较大值。
UDP 问题要区分三个层面:应用是否发出 UDP、TUN 是否接管、节点协议和网络是否支持对应传输。DNS 查询、QUIC、游戏和语音都可能使用 UDP。关闭 QUIC 后浏览器恢复,只能说明故障集中在 UDP 路径,不代表 DNS 或节点整体不可用。移动设备在 Wi-Fi 与蜂窝网络切换后,旧会话可能仍绑定原接口,必要时重新连接 TUN,而不是立即清除全部配置。
| 接管方式 | 覆盖范围 | 适合场景 |
|---|---|---|
| 仅系统代理 | 遵循 HTTP 或 SOCKS 代理设置的应用 | 浏览器、常规桌面应用、低权限环境 |
| TUN + redir-host | 更广泛的 TCP/UDP 流量,DNS 返回真实地址 | 需要真实地址兼容性的环境 |
| TUN + Fake-IP | 广泛接管并保留域名匹配能力 | 规则分流复杂、应用绕过系统代理的设备 |
启用顺序建议是:先用系统代理确认节点和规则可用,再单独开启 TUN,确认路由和权限正常,最后启用 Fake-IP 并处理少量兼容例外。若 TUN 开启后整机断网,先关闭它恢复网络,再检查默认路由、DNS 劫持和其他 VPN。Windows 的服务模式、端口冲突与系统代理步骤可查看Windows 安装配置全流程。
Chapter 06 / Sniffer
域名嗅探与规则还原
有些连接进入 Clash 时只携带目标 IP,没有可直接用于域名规则的主机名。域名嗅探会检查连接初期可识别的信息,例如 TLS ClientHello 中的 SNI 或 HTTP 请求中的 Host,再把得到的域名用于规则匹配。它不是读取完整业务内容,也不能保证每条连接都有可恢复域名;加密客户端握手、非标准协议、直接使用 IP 的请求以及部分 UDP 流量,都可能没有适合嗅探的字段。
基础配置与协议范围
sniffer:
enable: true
force-dns-mapping: true
parse-pure-ip: true
override-destination: false
sniff:
HTTP:
ports:
- 80
- 8080-8880
override-destination: true
TLS:
ports:
- 443
- 8443
QUIC:
ports:
- 443
skip-domain:
- "+.push.apple.com"
- "Mijia Cloud"
parse-pure-ip 允许对仅显示 IP 的目标尝试解析协议特征;force-dns-mapping 与 Fake-IP 映射配合,帮助恢复连接和 DNS 查询之间的关系。override-destination 决定嗅探得到域名后是否重写目标。全局开启重写可能改善域名规则命中,也可能让依赖原始地址的连接出现兼容问题,因此更稳妥的方式是全局保持关闭,仅在确认适合的 HTTP 等协议范围内开启。
端口范围不应无限放大。HTTP 嗅探通常覆盖明确的网页端口,TLS 主要关注 443 与业务使用的加密端口,QUIC 则集中在 UDP 443。把所有端口都交给所有协议解析器,会增加无效判断,也可能把非标准二进制协议误识别。遇到使用特殊端口的业务时,先从日志确认协议和端口,再添加范围。端口段写得过宽不会增加真实可见信息,只会扩大解析尝试。
嗅探与 Fake-IP 的关系
Fake-IP 已经能为多数经 DNS 发起的连接保留域名,嗅探更像补充路径:应用绕过系统 DNS、直接连接缓存 IP,或连接信息未能关联到映射时,嗅探可能重新获得域名。两者同时启用不意味着重复执行同一件事。Fake-IP 在解析阶段建立映射,嗅探在连接阶段观察协议元数据。排查规则命中时,应看日志最终使用的是映射域名、嗅探域名还是原始 IP。
若关闭嗅探后某个服务总是落到 MATCH,开启后能够命中域名规则,说明原连接缺少可用域名上下文。反过来,若开启后连接被送到错误策略,应检查嗅探到的域名是否属于共享 CDN、跳转域名或第三方接口。一个应用往往同时访问多个域名,不能只凭主站域名推断全部连接。可以临时提高日志级别,完成一次短测试后恢复 info,避免长期记录大量连接细节。
跳过列表与兼容边界
skip-domain 用于排除已知不适合改写或解析的域名。条目应来自实际故障验证,而不是一次性加入大范围列表。某些设备发现和推送服务会使用证书域名、连接地址与业务标识不完全一致的机制,错误重写可能造成重复连接。增加跳过项后要重新连接对应应用,因为旧连接不会自动按新规则重建。
| 日志表现 | 解释 | 下一步 |
|---|---|---|
| 只看到目标 IP | 未获得域名或协议不可嗅探 | 检查 DNS 接管、协议与端口范围 |
| 获得域名但仍命中 MATCH | 规则缺少该域名或顺序被截获 | 核对实际域名并调整规则位置 |
| 开启重写后连接失败 | 目标依赖原始地址或识别结果不适合重写 | 关闭全局重写或加入精确跳过项 |
| 浏览器正常,QUIC 异常 | UDP 路径、节点能力或 QUIC 嗅探问题 | 关闭 QUIC 做对照并检查 TUN UDP |
验证嗅探配置时,选择一个规则明确的域名,先记录关闭嗅探时的命中结果,再开启后重新建立连接进行对比。不要同时改 DNS、规则集与目标策略,否则无法判断变化来自哪一层。若只是在系统代理模式下测试浏览器,浏览器本身通常已经向代理提供域名,嗅探带来的差异可能很小;它更适合 TUN 接管、纯 IP 连接和绕过系统 DNS 的场景。
域名嗅探不能替代规则设计。恢复出域名后,仍需要具体规则在宽泛规则之前,并确保对应策略组存在。若应用访问大量动态子域名,优先使用经过核对的后缀规则或规则集,不要持续追加单个完整域名。相关术语可在术语手册中查阅,包含 SNI、Fake-IP、TUN 与规则模式之间的关系。
Chapter 07 / Merge
本地覆写与多订阅合并
订阅负责提供远端维护的节点和基础配置,本地覆写负责保存设备或个人环境特有的调整。把两者直接改在同一文件里,下一次订阅更新很可能覆盖本地内容;完全复制成静态配置又会失去节点更新。更合理的结构是把订阅视为上游输入,把端口、DNS、策略组补充、规则前置和 TUN 设置放进可重复应用的覆写层。客户端支持的覆写机制名称不同,可能叫 Merge、Mixin、Script 或全局扩展,但目标都是在更新后重新生成生效配置。
区分替换、追加与深度合并
YAML 对象可以按键合并,数组却存在不同语义。修改 dns.enable 通常只替换单个字段;处理 rules 时则要明确是前置规则、后置规则还是替换全部数组。若合并器把新数组直接覆盖旧数组,一段只含三条本地规则的覆写可能让订阅原有规则全部消失。使用客户端内置合并前,应查看最终生效配置,而不是只看覆写片段是否保存成功。
prepend-rules:
- DOMAIN,router.local,DIRECT
- DOMAIN-SUFFIX,corp.example,DIRECT
append-rules:
- MATCH,总选择
override:
mode: rule
log-level: info
ipv6: false
上面的结构用于说明“前置、后置、替换”三种意图,具体键名取决于客户端的合并实现,不能未经确认直接当作 mihomo 原生配置载入。mihomo 最终接收的仍是一份完整配置。验证方法是打开客户端生成的运行时配置,确认本地规则位于预期位置、策略组没有重复、最终只保留一个 MATCH。若客户端提供配置检查功能,应在每次更新后执行一次。
多订阅合并以节点层为主
同时使用多个订阅时,最稳定的方式通常是把它们声明为不同的 proxy-providers,由本地策略组通过 use 引入,而不是把多个完整配置文件直接拼接。完整配置往往都带有自己的端口、DNS、策略组和规则,同名键会覆盖,同名组会冲突,最后结果取决于合并工具的实现。节点提供者只负责节点集合,本地主配置负责统一策略和规则,职责更清楚。
proxy-providers:
primary:
type: http
url: https://example.com/subscription/primary
path: ./providers/primary.yaml
interval: 86400
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 600
backup:
type: http
url: https://example.com/subscription/backup
path: ./providers/backup.yaml
interval: 86400
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 900
proxy-groups:
- name: 总选择
type: select
use:
- primary
- backup
proxies:
- DIRECT
示例中的订阅地址是结构示意,使用时应换成自己的有效地址,并避免把带访问凭据的链接公开到文档、截图或共享仓库。两个 provider 必须使用不同的缓存路径。健康检查间隔可以根据设备与节点数量调整,移动端不宜高频轮询大量节点。若上游节点名称重复,界面可能难以区分来源,可以在合并层使用客户端支持的前缀能力,或让不同 provider 进入独立地区组,而不是直接混在一个长列表中。
更新失败与配置漂移
多订阅环境常见的问题不是某次配置无法载入,而是运行一段时间后逐渐偏离预期。上游可能修改节点命名,导致筛选表达式失效;删除某个地区后,策略组变成空组;新增同名节点后,手动选择指向了另一来源。更新后应检查 provider 状态、策略组成员数量是否合理、关键业务规则是否仍指向存在的组。不要用虚构的固定节点数量作为监控条件,应关注“组是否为空”“引用是否存在”和“关键请求是否命中”。
跨设备同步时,不建议直接同步客户端整个数据目录。桌面端和移动端的权限、路径、TUN 接口名以及缓存位置都不同。更适合同步的是订阅入口、本地主配置模板、规则集和覆写逻辑,设备专属项留在各自客户端。WebDAV、订阅分发与手动导入的差异可继续阅读Clash 多设备配置同步方案。
| 内容 | 适合远端维护 | 适合本地保留 |
|---|---|---|
| 节点集合 | 订阅或 proxy-provider | 临时测试节点 |
| 公共规则集 | rule-provider | 少量设备与内网例外 |
| 策略组骨架 | 受控主配置 | 手动选择状态与设备差异 |
| TUN、端口、权限相关项 | 通常不直接跨平台同步 | 按设备和系统维护 |
Chapter 08 / Controller
外部控制面板与运行维护
mihomo 提供外部控制接口,客户端界面和浏览器控制面板可以通过它读取策略组、切换节点、查看连接、刷新 provider 和观察日志。控制接口只负责管理正在运行的内核,不会替代配置文件。面板中临时切换策略可以立即生效,但新增规则、调整 DNS 或改变 TUN 参数仍需要修改配置并重新载入。把控制接口理解为运行状态入口,比把它当作配置编辑器更准确。
监听地址、密钥与访问范围
external-controller: 127.0.0.1:9090
secret: "your-password"
external-ui: ./ui
external-ui-name: dashboard
仅在本机使用时,控制地址应监听 127.0.0.1。设置为 0.0.0.0 会接受来自其他网络接口的连接,只有明确需要局域网管理并配置防火墙时才应采用。secret 用于接口鉴权,应使用自己生成的独立值,不要与订阅访问参数或其他账户共用。面板页面与控制接口可以部署在不同位置,但浏览器仍必须能够访问接口地址,并满足协议、安全上下文和跨域条件。
远程管理不应直接把控制端口暴露到公共网络。更稳妥的方式是在可信局域网中访问,或先通过受控的安全隧道进入设备网络。若只需要查看家中路由器上的 Clash 状态,应限制来源地址并保留防火墙规则。控制接口能够切换出口、终止连接和读取运行信息,访问范围应与路由器管理页面同等谨慎。
连接页与日志如何配合
连接列表通常显示来源、目标、协议、规则、策略链和流量状态。排查某个应用时,先清空观察范围或按目标筛选,再重新触发一次请求。策略链能说明请求先进入哪个业务组,最终落到哪个节点;规则字段能说明是哪条规则完成匹配。如果页面打不开但连接列表完全没有记录,问题通常发生在流量进入内核之前,应回到系统代理、TUN 路由或应用自身代理设置检查。
日志级别保持 info 适合日常使用。需要定位 DNS、握手或嗅探细节时,可以短时间切换到 debug,复现一次后立即恢复。长期开启详细日志会增加输出量,也会让真正的错误被大量正常记录淹没。分享日志前应检查其中的订阅地址、内网域名、目标地址和认证字段,只截取与故障时间点相关的片段。
provider 刷新与策略状态
控制面板通常允许手动刷新代理提供者和规则提供者。刷新按钮只触发对应资源更新,不等于重载整个配置。代理 provider 更新后,新节点会进入引用它的策略组,但当前连接不会全部自动迁移;规则 provider 更新后,新请求按新规则匹配,已有长连接仍可能维持原策略。验证更新结果时应重新建立测试连接,并查看 provider 的最后错误状态,而不是只看按钮是否完成旋转。
保存策略选择依赖 profile.store-selected 以及客户端的数据目录权限。若每次重启都回到默认节点,先确认该字段是否在最终配置中,再检查客户端是否能写入运行目录。多份配置使用相同组名时,持久化状态也可能让切换后的结果看起来与默认配置不一致。测试时可以新建一个名称明确的组,确认保存机制正常后再处理旧状态。
| 面板能力 | 适合用途 | 不能替代 |
|---|---|---|
| 策略切换 | 即时选择出口与对照测试 | 策略组结构设计 |
| 连接查看 | 确认规则、策略链和协议 | 系统层抓包与路由检查 |
| Provider 刷新 | 更新节点集合或规则资源 | 完整配置重载 |
| 日志观察 | 定位解析、连接与规则错误 | 长期性能结论 |
一套可重复的维护顺序
日常维护可以固定为四步:先更新订阅与 provider,确认所有资源加载完成;再验证“总选择”和关键业务组仍有可用成员;随后用一个域名请求和一个需要 TUN 的应用检查规则链;最后恢复常用日志级别并导出当前可用配置。若更新后异常,先比较变更范围:只有节点变化就检查 provider 和策略组,只有规则集变化就检查命中顺序,客户端升级或系统网络变化后才重点检查权限与路由。
当控制面板无法连接时,先确认内核仍在运行,再检查控制地址、端口占用和密钥。浏览器访问本机面板却连接远端设备接口时,还要确认地址不是写成浏览器所在设备的 127.0.0.1。如果客户端自身已经内置控制页面,优先使用内置入口,它通常会自动处理当前端口和认证信息。需要重新选择客户端时,可前往选型指南查看平台差异,安装包统一从下载页进入。