分流规则写了但不生效怎么办
Clash 分流规则按从上往下的顺序匹配,命中第一条就停。说明规则顺序、代理模式、DNS 和旧连接怎样让规则看起来不生效,以及怎么从连接列表确认命中哪条规则。
适用:Clash Verge RevFlClashClash PartyClash Meta for AndroidClashX MetaClash Mimihomo
你看到的现象
在配置里加了一条规则,例如想让某个网站走代理或直连,但访问时它还是走原来的路线。
先打开客户端的“连接”页,找到这个网站的连接,看它实际命中的是哪条规则(Clash Verge Rev 的连接列表有“规则”和“链路”两列)。知道命中了哪条,下面的原因就很好对上。
可能的原因和解决办法
前面有一条规则先命中了
怎么判断:mihomo 官方文档写明:规则按从上到下的顺序匹配,上面的规则优先级更高,命中第一条就不再往下看。连接页显示命中的不是你新加的那条,而是它上面的某条(例如一条更宽泛的 GEOSITE、RULE-SET 规则)。
怎么解决:把你的规则移到更靠前的位置,至少要在命中的那条之前。MATCH 是兜底规则,必须放在最后,写在它后面的规则永远不会生效。
客户端不在“规则”模式
怎么判断:模式选的是“全局”或“直连”。按官方文档,global 是全部走 GLOBAL 组里选中的代理,direct 是全部直连,这两种模式都不看规则。
怎么解决:切回“规则”模式。三种模式的区别见 规则、全局、直连三种模式怎么选。
新配置没有加载成功
怎么判断:规则写错了,配置根本没有加载,客户端还在用旧配置。例如规则指向的代理组名字不对,实测会报 rules[0] [MATCH,节点选泽] error: proxy [节点选泽] not found。
怎么解决:看日志里的报错,按 代理组引用了不存在的节点 修正;YAML 格式问题见 YAML 语法错误。
连接里只有 IP,没有域名
怎么判断:连接页里这条连接显示的是 IP 地址而不是域名。域名类规则(DOMAIN、DOMAIN-SUFFIX、GEOSITE 等)只能匹配带域名的连接。程序直接用 IP 连接,或者 DNS 请求没有经过客户端时,就会这样。
怎么解决:加一条匹配 IP 的规则(IP-CIDR 等),或者在客户端里开启域名嗅探(mihomo 的 sniffer,可以从 TLS、HTTP、QUIC 流量里识别域名)。开着 TUN 时确认 DNS 劫持正常工作,安卓上关闭“私人 DNS”,见 TUN 模式开启后无法上网。
旧连接还在用原来的路线
怎么判断:改完规则后,已经打开的网页、正在下载的连接还是走原来的路线。
怎么解决:关闭现有连接后再试。Clash Verge Rev 的托盘菜单里有“关闭所有连接”。
改在了订阅文件里,更新订阅后被覆盖
怎么判断:规则一开始生效,过一阵子(订阅自动更新后)又失效了。
怎么解决:不要直接改订阅下载下来的配置文件。用客户端的覆写或规则编辑功能:Clash Verge Rev 在订阅的菜单里有“编辑规则”,Clash Party 有“覆写”。
常见问题
写了 UDP 的规则,结果往下走了?
按官方文档:请求是 UDP、而命中的代理节点不支持 UDP 时(例如 ss 节点没写 udp: true),会继续向下匹配。
按程序名分流(PROCESS-NAME)不生效?
这类规则需要内核能识别连接来自哪个程序,由配置里的 find-process-mode 控制:默认 strict 由内核自行判断是否开启,always 强制开启,off 不匹配进程。详见 mihomo 官方文档:规则(在新窗口打开)。想快速写一组规则,可以用 分流规则生成器。
还是没解决?
把客户端名称、版本和完整的报错信息发给我们(不要包含订阅链接),我们会补充到这一页。提交反馈