先确认适用范围:这是 OpenClash 覆写,不是直接改订阅

本文只处理「在 OpenClash 中添加一条自定义路由规则」。步骤按 OpenWrt LuCI、OpenClash v0.47.156 稳定版与 Mihomo 内核编写;不适用于 Clash for Windows、Clash Verge Rev、FlClash 或直接运行的 Mihomo 配置。旧版 LuCI 的标签名称也可能不同。

开始前先把代理模式设为 rule。Mihomo 只在 rule 模式下按规则从上到下匹配;global 和 direct 模式不能用来证明普通规则是否生效。在 LuCI 中进入「服务 → OpenClash → 覆写设置 → 规则设置」,开启「自定义规则」后会显示官方简体中文界面的「(优先匹配)」和「(候补匹配)」两个编辑区;源码中的英文标签分别是 (Priority) 与 (Extended)。

覆写的意义:OpenClash 在启动时把自定义内容注入临时运行 YAML,不会直接把一行规则写进原订阅文件。这正是订阅更新后仍应从覆写入口维护自定义规则的原因。

优先和扩展的区别:关键在最终插入位置

两个区域都保存 YAML,但合并时的位置不同。官方模板推荐保留顶层 rules:,也可在同一对象中定义 rule-providers: 或 sub-rules:。v0.47.156 也接受直接以列表项开头的根 YAML 数组,但这种写法只能承载规则。rule-providers 必须使用对象结构,并同时保留数组类型的 rules(可以为空);sub-rules 同样要写在对象结构中,但不要求同时存在 rules。为了便于检查和扩展,新手应沿用官方模板。

编辑区保存文件v0.47.156 的合并位置适合用途
优先匹配(Priority)/etc/openclash/custom/openclash_custom_rules.list插到最终 rules 顶部需要抢在订阅规则之前匹配的精确例外
候补匹配(Extended)/etc/openclash/custom/openclash_custom_rules_2.list先放到原规则中最后一个包含 DST-PORT,80 的条目之前;否则放在首条 MATCH/FINAL 前,再否则放在首条两位国家代码的 GEOIP 规则前;都没有才追加到末尾希望保留订阅前部细分规则的补充项

v0.47.156 的端口锚点是字符串匹配:DST-PORT,8080 也可能因包含 DST-PORT,80 而被识别为锚点;GEOIP 回退只识别类似 GEOIP,CN,... 的两位国家代码规则。升级后应重新核对运行规则的实际顺序。

「扩展」不等于无条件放到 MATCH 后面。合并脚本会先记录原订阅中的锚点,再放入自定义项。由于规则自上而下首次命中即停止,优先区只应放范围明确的规则,不要随手放入宽泛的 MATCH 或 FINAL。

先加一条可验证的优先规则

下面只演示一条完整域名直连规则。app.example.net 是占位域名,操作时必须替换成你在连接日志中确认的真实主机名。DIRECT 是 Mihomo 内建出口,可避免因自定义策略组不存在而干扰第一次测试。

OpenClash 优先规则rules:
  - DOMAIN,app.example.net,DIRECT
  1. 在原配置下重现问题,记录目标域名、当前命中规则和策略组。
  2. 按文末命令备份两个自定义文件;若文件尚不存在,就记录开关为关闭和编辑区为空。
  3. 进入「覆写设置 → 规则设置」,开启自定义规则,在「优先匹配(Priority)」区粘贴上面的 YAML。
  4. 确认两个空格缩进未被破坏,且没有同时添加其他规则、DNS 覆写或模式变更。
  5. 直接点击「应用配置」启动一次可验证的重启。

规则目标必须真实存在:最后一列必须是 DIRECT、REJECT、GLOBAL、REJECT-DROP、PASS、COMPATIBLE 等受支持的内建目标,或精确匹配当前代理组、代理、子规则名称。它们并非都代表网络出口,例如 PASS 会继续匹配后续规则,REJECT 会拒绝请求。目标不存在时,OpenClash 会跳过该条并在日志写入 Skiped The Custom Rule Because Group & Proxy Not Found。

只在需要保留订阅前部顺序时使用扩展规则

扩展区适合「先让订阅的精细规则匹配,再用自定义项补缺」。下面是一个独立测试例子;不要和上一节的优先规则同时测试,否则无法判断是哪个区域命中。updates.example.net 同样必须替换为真实域名。

OpenClash 扩展规则rules:
  - DOMAIN-SUFFIX,updates.example.net,DIRECT
  1. 先移除上一节的优先测试项,保持其他变量不变。
  2. 把这段 YAML 放入「候补匹配(Extended)」区,点击「应用配置」。
  3. 在最终运行规则中定位该条,对照原订阅中最后一个包含 DST-PORT,80 的条目、首条 MATCH/FINAL,或首条类似 GEOIP,CN,... 的两位国家代码规则。
  4. 发起真实请求并核对日志;如果订阅中更靠前的规则已经命中,扩展项不会再被执行,这是正常顺序而不是保存失败。

扩展区的判断标准是「最终位置」:不要仅看编辑框内有没有文字。必须查运行规则顺序,再用一次实际连接证明。

应用后同时查启动日志、最终规则和真实请求

v0.47.156 的「保存配置」只提交当前表单与自定义文件,不重启 OpenClash;「应用配置」会保存、启用并重启 OpenClash。准备立即测试时点一次「应用配置」即可,无需先另点一次保存。重启期间的短暂断流是预期现象,持续无法运行则不是。

  1. 等待 OpenClash 回到运行状态,先查启动日志中第一个 YAML、规则或策略组错误。
  2. 查看实际运行配置或规则列表,确认 DOMAIN,app.example.net,DIRECT 已出现在预期位置。
  3. 从一台真实设备访问该完整域名,在连接日志中核对规则类型、规则值和最终处理路径。
  4. 再测试一个未被该规则匹配的站点,确认原订阅的其他分流没有被误伤。

「文件保存成功」不等于「规则已运行」,而「运行配置中存在」也不等于「请求真正命中」。只有启动日志、最终顺序和实际连接三层都对上,才能证明修改完成。

规则不生效时,从模式和 YAML 开始排查

现象优先检查处理方向
自定义区保存后无变化是否只点了「保存配置」在可接受短暂断流时点「应用配置」
规则在配置中但不命中当前是否为 rule 模式,上方是否已有更早命中项切回 rule,用完整域名做单变量测试
启动时报 YAML 错误缩进、冒号、列表短横线和字符串结构恢复官方模板,只加一条 rules 项
日志提示 Group & Proxy Not Found规则最后一列的名称和大小写改为当前配置确实存在的规则目标
RULE-SET 规则失效对应 provider 是否定义、下载成功且 behavior 兼容先用普通 DOMAIN 证明路径,再单独引入 provider

两份自定义 YAML 也可定义 rule-providers 和 sub-rules,但这会引入第二个维护面。合并时的同名定义存在覆盖风险,所以不要在没有对照最终 YAML 时把网上整段 provider 配置粘贴到两个区域。本文的单域名测试不需要 provider。

一次只改一个变量:如果优先规则不命中,不要同时切换内核、DNS、Fake-IP、节点和订阅。先证明模式、YAML、规则目标和域名四项。

备份两份自定义文件,留下明确回退路径

首次修改前可通过 SSH 分别备份两个文件。下面命令只在源文件存在时复制,但会覆盖同名 .bak;已有备份时请改用新文件名。

OpenWrt Shelltest -f /etc/openclash/custom/openclash_custom_rules.list &&   cp /etc/openclash/custom/openclash_custom_rules.list /root/openclash_custom_rules.list.bak
test -f /etc/openclash/custom/openclash_custom_rules_2.list &&   cp /etc/openclash/custom/openclash_custom_rules_2.list /root/openclash_custom_rules_2.list.bak

确认备份内容正确后,可用下列命令把存在的备份复制回原路径:

OpenWrt Shell · 恢复test -f /root/openclash_custom_rules.list.bak &&   cp /root/openclash_custom_rules.list.bak /etc/openclash/custom/openclash_custom_rules.list
test -f /root/openclash_custom_rules_2.list.bak &&   cp /root/openclash_custom_rules_2.list.bak /etc/openclash/custom/openclash_custom_rules_2.list

需要回退时,也可在 LuCI 中恢复原文本,或关闭「自定义规则」,然后点击「应用配置」重建运行配置。若通过 SSH 恢复备份,复制后先刷新 LuCI 页面核对文本,再应用,避免旧表单反向覆盖文件。不要删除订阅,也不要直接编辑启动后生成的临时运行 YAML 来当作长期方案。

完成标准:自定义文件语法正确,规则位置与优先/候补选择一致,规则目标存在,OpenClash 正常重启,真实请求命中预期处理路径,且两份原文本都可恢复。

如需核对 OpenClash、Mihomo 相关平台与客户端,可从本站下载页面查看当前入口;更换客户端不能替代本文的规则顺序与日志验证。

官方来源与版本边界

版本号、文件名和界面文字可能随项目更新而变化,操作前请以链接中的项目文档为准。