先确认适用范围:这是 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
- 在原配置下重现问题,记录目标域名、当前命中规则和策略组。
- 按文末命令备份两个自定义文件;若文件尚不存在,就记录开关为关闭和编辑区为空。
- 进入「覆写设置 → 规则设置」,开启自定义规则,在「优先匹配(Priority)」区粘贴上面的 YAML。
- 确认两个空格缩进未被破坏,且没有同时添加其他规则、DNS 覆写或模式变更。
- 直接点击「应用配置」启动一次可验证的重启。
规则目标必须真实存在:最后一列必须是 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
- 先移除上一节的优先测试项,保持其他变量不变。
- 把这段 YAML 放入「候补匹配(Extended)」区,点击「应用配置」。
- 在最终运行规则中定位该条,对照原订阅中最后一个包含
DST-PORT,80的条目、首条MATCH/FINAL,或首条类似GEOIP,CN,...的两位国家代码规则。 - 发起真实请求并核对日志;如果订阅中更靠前的规则已经命中,扩展项不会再被执行,这是正常顺序而不是保存失败。
扩展区的判断标准是「最终位置」:不要仅看编辑框内有没有文字。必须查运行规则顺序,再用一次实际连接证明。
应用后同时查启动日志、最终规则和真实请求
v0.47.156 的「保存配置」只提交当前表单与自定义文件,不重启 OpenClash;「应用配置」会保存、启用并重启 OpenClash。准备立即测试时点一次「应用配置」即可,无需先另点一次保存。重启期间的短暂断流是预期现象,持续无法运行则不是。
- 等待 OpenClash 回到运行状态,先查启动日志中第一个 YAML、规则或策略组错误。
- 查看实际运行配置或规则列表,确认
DOMAIN,app.example.net,DIRECT已出现在预期位置。 - 从一台真实设备访问该完整域名,在连接日志中核对规则类型、规则值和最终处理路径。
- 再测试一个未被该规则匹配的站点,确认原订阅的其他分流没有被误伤。
「文件保存成功」不等于「规则已运行」,而「运行配置中存在」也不等于「请求真正命中」。只有启动日志、最终顺序和实际连接三层都对上,才能证明修改完成。
规则不生效时,从模式和 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 相关平台与客户端,可从本站下载页面查看当前入口;更换客户端不能替代本文的规则顺序与日志验证。
官方来源与版本边界
- OpenClash v0.47.156 官方 Release
- OpenClash v0.47.156 覆写界面源码
- OpenClash v0.47.156 官方简体中文界面翻译
- OpenClash v0.47.156 自定义规则合并源码
- OpenClash v0.47.156 优先自定义规则模板
- OpenClash v0.47.156 扩展自定义规则模板
- Mihomo 官方路由规则文档
- Mihomo 官方基础配置文档
版本号、文件名和界面文字可能随项目更新而变化,操作前请以链接中的项目文档为准。