OpenClash配置教程:如何让多个订阅配置文件使用统一的规则

OpenClash配置教程:如何让多个订阅配置文件使用统一的规则

每天都能看到各种新的AI产品和功能,我总忍不住想一一体验,但很多国外的AI产品都仅限国外用户使用。

Clash的默认规则能匹配国外大厂的域名走国外节点,但新产品如果是小厂,如果不怕麻烦,就每次试用新产品时用全局模式,指定都走美国节点。

如果经常体验各种新产品,建议把相关域名规则直接写入Clash配置中。以我最近使用的Dia浏览器为例,我在订阅配置文件的规则中添加了:

1
2
3
4
5
rules:
# > DIA
- DOMAIN,api.segment.io,US
- DOMAIN-SUFFIX,launchdarkly.com,US
- DOMAIN-SUFFIX,diabrowser.engineering,US

由于众所周知的原因,单个订阅配置文件访问国外网站并不稳定。许多需要经常访问国外网站的用户都准备了多个订阅配置文件以便随时切换。这就带来一个问题:不同配置文件中美国节点的名称并非统一使用”US”。如果要在每个订阅配置文件中分别写规则,不仅麻烦,而且每次添加新域名都需要修改所有配置文件。

为了能用一个配置文件兼容所有情况,我在OpenClash中探索出了三种方案,从简单到复杂,从需要经常维护到一劳永逸。

方案1:使用配置文件预处理统一节点组名

我们在【复写设置】→【规则设置】中,先勾选【自定义规则】,然后在下放的文本框里把规则写上。

这里我们依然用US代指美国节点。遇到订阅配置中美国节点不叫US的情况,我们在【配置管理】里自定义一个叫US的节点组就行了。

点开【配置管理】在【配置文件列表】里找到美国节点不叫US的文件,点【修改】

然后在【proxy-groups:】里面,按照规则自已定义一个名叫US的代理组就行。

1
2
3
4
5
6
7
- name: "US"
type: load-balance
proxies:
- 美国01
- 美国02
url: http://cp.cloudflare.com/
interval: 300

注意【proxies:】里的节点名称复制上方【proxies:】里的名称

之后就是【保存】,然后【应用配置】,待OpenClash重启之后,就能看到效果了。

是否生效,我们打开YACD面板查看规则和连接就知道了。

这个方法操作最简单,但是有2个缺点:

  1. 订阅配置文件并不是一成不变的。更新之后,要么原来自己写的【proxy-groups:】没了,要么订阅配置文件提供商自己把节点名字都改了。就不得不每次更新订阅之后,重新再写一次
  2. 网上有很多大佬分享自己做的规则文件,这些规则非常完善,但文件里只有域名,并没有指定用哪个节点。你每次得手动复制别人的规则,都得自己加上US,频繁更新规则有点麻烦。

大佬的规则只有域名,没有直接指定节点名称,毕竟每个人用的订阅配置文件节点名称不一样。

备注:使用正则表达式匹配节点组无效

Claude AI建议在方案1的基础上,在【自定义规则】中使用正则表达式来匹配所有包含US、America、美国的节点组。但经实测此方法无效,这可能是因为不同Clash内核的支持的功能特性存在差异。

1
2
3
4
rules:
- DOMAIN-SUFFIX,api.segment.io,/US|America|美国/
- DOMAIN-SUFFIX,launchdarkly.com,/US|America|美国/
- DOMAIN-SUFFIX,diabrowser.engineering,/US|America|美国/

接下来我们讲方案2,稍微复杂一点,但能解决方案1的第一个缺点。

方案2:自定义规则集

首先我们必须要准备好规则集,可以去网上找别人做好的优秀的规则集,也可以自己在本地新建。

网上找规则集

可以去GitHub上找,后续网上规则集有更新,我们本地也能获得更新,比如:

1
https://gh.catmak.name/https://raw.githubusercontent.com/shangrenxi/Rules/refs/heads/master/rules/AI.yaml

本地新建规则集

打开OpenClash,进入【配置管理】→【规则集文件列表】。

在底部点【新建文件】,新建一个规则集。

在文件编辑里输入规则,注意,这里的规则只有域名,不要在域名后面指定节点组名称。

1
2
3
4
5
payload:
# > DIA
- DOMAIN,api.segment.io
- DOMAIN-SUFFIX,launchdarkly.com
- DOMAIN-SUFFIX,diabrowser.engineering

不同的设备软件版本,规则集的保存位置不一样,保险起见,我们通过文件管理功能查看一下本地规则集的文件路径。

让规则集生效

打开OpenClash,进入【配置管理】→【配置文件列表】,后续要用的配置文件,我们都得挨个点【修改】,都改一遍。

在【文本编辑】里输入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
rule-providers:
#本地文件规则集
DiaBrowser: #这里是名称
type: file #本地类型是file
behavior: classical #这里是规则类型,建议用classical,即使你只有域名也不要用domain,会有兼容性问题
path: /etc/openclash/rule_provider/DiaBrowser #规则文件的本地文件路径,建议提前拿文件管理器查一下,不同设备不同版本路径有差异

#在线规则集
AI: #这里是名称
type: http #在线类型是http
behavior: classical #和本地规则集一样
path: /etc/openclash/rule_provider/AI #在线文件保存到本地的路径建议选和本地规则同目录,选其他地方可能没权限写入失败。文件名不要和其他规则集重名,文件名有没有格式后缀不影响。
url: https://gh.catmak.name/https://raw.githubusercontent.com/shangrenxi/Rules/refs/heads/master/rules/AI.yaml #在线规则集的地址
interval: 86400 #在线规则集多久更新一次,单位秒

注意看本地文件规则集和在线规则集格式是不一样的。具体差异我写在代码注释中了。

此外配置文件对空格、缩进的要求很严格,注释要么就没缩进, 跟在正常内容后面就得空格。否则很容易格式报错。

和方案1一样,我们也得自定义一个节点组,让规则都走这个节点。

最后一步,我们在【rules:】之后,加上

1
2
- RULE-SET,DiaBrowser,US
- RULE-SET,AI,US

注意,一定要紧跟在【rules:】之后,不要放在其他规则之后,否则可能会被覆盖失败。

之后就是【保存】,然后【应用配置】,待OpenClash重启之后,就能看到效果了。

相比于方案1,方案2把规则集和规则集使用那个节点组分开来了。规则集里只有规则不需要指定节点组,而且可以使用在线规则集,做到自动更新。要改规则集使用哪个节点,只用在【rules:】里改一处就行了。

但是方案2还是没解决一个问题——如果订阅配置文件更新,我们又得在订阅配置文件里把规则集名称、地址、使用哪个节点组又得写一遍。

方案1和方案2之所以这么折腾,说到底还是因为不同的订阅配置文件里的节点组名称不一样导致了。那接下来讲的方案3就能彻底解决这个问题。

方案3:合并订阅配置文件

这是终极解决方案,几乎可以一劳永逸。尽管初次配置较为复杂且容易出错,但原理其实很简单:使用一个订阅配置文件整合所有现有订阅,通过正则表达式对节点进行分组,然后引入多个规则集,为每个规则集分配相应的节点组。系统会定时自动测速,并为每个规则集自动选择其对应节点组中速度最快的节点。

网上虽然有许多类似的配置文件可供参考,也可以用AI生成,但由于软路由的文件权限问题和OpenClash的内核版本限制,我尝试了很多个配置文件都无法正常使用。最终,我通过参考多个配置文件并结合AI的建议,才成功拼凑出一个真正可用的配置文件。

具体配置方法请参考配置文件中的注释说明。如遇到问题,可以查看日志记录,并将日志发送给AI协助解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# 基于 https://github.com/666OS/YYDS/blob/main/mihomo/config/OneTouch.yaml 二次修改
# 之前一直订阅配置获取不到节点,参考了 https://jamesdaily.life/rule-proxy-provider 的语法才解决
# 解决了openclash的兼容性问题,通过修改PProviders实现

#锚点
PProviders: &PProviders {type: http, interval: 86400, health-check: {enable: true, url: 'https://cp.cloudflare.com', interval: 300, timeout: 1000, tolerance: 100}, filter: '^(?!.*(群|邀请|返利|循环|官网|客服|网站|网址|获取|订阅|流量|到期|机场|下次|版本|官址|备用|过期|已用|联系|邮箱|工单|贩卖|通知|倒卖|防止|国内|地址|频道|无法|说明|使用|提示|特别|访问|支持|教程|关注|更新|作者|加入|USE|USED|TOTAL|EXPIRE|EMAIL|Panel|Channel|Author))'}
UrlTest: &UrlTest {type: url-test, interval: 60, tolerance: 20, lazy: true, url: 'https://www.gstatic.com/generate_204', disable-udp: false, timeout: 2000, max-failed-times: 3, hidden: true, include-all: true}
FallBack: &FallBack {type: fallback, interval: 60, lazy: true, url: 'https://www.gstatic.com/generate_204', disable-udp: false, timeout: 2000, max-failed-times: 3, hidden: false}
FilterHK: &FilterHK '^(?=.*(?i)(港|🇭🇰|HK|Hong|HKG))(?!.*(排除1|排除2|5x)).*$'
FilterSG: &FilterSG '^(?=.*(?i)(坡|🇸🇬|SG|Sing|SIN|XSP))(?!.*(排除1|排除2|5x)).*$'
FilterJP: &FilterJP '^(?=.*(?i)(日|🇯🇵|JP|Japan|NRT|HND|KIX|CTS|FUK))(?!.*(排除1|排除2|5x)).*$'
FilterKR: &FilterKR '^(?=.*(?i)(韩|🇰🇷|韓|首尔|南朝鲜|KR|KOR|Korea|South))(?!.*(排除1|排除2|5x)).*$'
FilterUS: &FilterUS '^(?=.*(?i)(美|🇺🇸|US|USA|JFK|LAX|ORD|ATL|DFW|SFO|MIA|SEA|IAD))(?!.*(排除1|排除2|5x)).*$'
FilterTW: &FilterTW '^(?=.*(?i)(台|🇼🇸|🇹🇼|TW|tai|TPE|TSA|KHH))(?!.*(排除1|排除2|5x)).*$'
FilterEU: &FilterEU '^(?=.*(?i)(奥|比|保|克罗地亚|塞|捷|丹|爱沙|芬|法|德|希|匈|爱尔|意|拉|立|卢|马其它|荷|波|葡|罗|斯洛伐|斯洛文|西|瑞|英|🇧🇪|🇨🇿|🇩🇰|🇫🇮|🇫🇷|🇩🇪|🇮🇪|🇮🇹|🇱🇹|🇱🇺|🇳🇱|🇵🇱|🇸🇪|🇬🇧|CDG|FRA|AMS|MAD|BCN|FCO|MUC|BRU))(?!.*(排除1|排除2|5x)).*$'
FilterOther: &FilterOther '^(?!.*(DIRECT|美|港|坡|台|新|日|韩|奥|比|保|克罗地亚|塞|捷|丹|爱沙|芬|法|德|希|匈|爱尔|意|拉|立|卢|马其它|荷|波|葡|罗|斯洛伐|斯洛文|西|瑞|英|🇭🇰|🇼🇸|🇹🇼|🇸🇬|🇯🇵|🇰🇷|🇺🇸|🇬🇧|🇦🇹|🇧🇪|🇨🇿|🇩🇰|🇫🇮|🇫🇷|🇩🇪|🇮🇪|🇮🇹|🇱🇹|🇱🇺|🇳🇱|🇵🇱|🇸🇪|HK|TW|SG|JP|KR|US|GB|CDG|FRA|AMS|MAD|BCN|FCO|MUC|BRU|HKG|TPE|TSA|KHH|SIN|XSP|NRT|HND|KIX|CTS|FUK|JFK|LAX|ORD|ATL|DFW|SFO|MIA|SEA|IAD|LHR|LGW))'
FilterAll: &FilterAll '^(?!.*(DIRECT|群|邀请|返利|循环|官网|客服|网站|网址|获取|订阅|流量|到期|机场|下次|版本|官址|备用|过期|已用|联系|邮箱|工单|贩卖|通知|倒卖|防止|国内|地址|频道|无法|说明|使用|提示|特别|访问|支持|教程|关注|更新|作者|加入|USE|USED|TOTAL|EXPIRE|EMAIL|Panel|Channel|Author))'
SelectFB: &SelectFB {type: select, proxies: [故障转移, 香港自动, 台湾自动, 新加坡自动, 日本自动, 韩国自动, 美国自动]}
SelectUS: &SelectUS {type: select, proxies: [美国自动, 台湾自动, 新加坡自动, 日本自动, 韩国自动]}
SelectOne: &SelectOne {type: select, proxies: [一键连, 故障转移, 香港自动, 台湾自动, 新加坡自动, 日本自动, 韩国自动, 美国自动]}

# 填写订阅,名称不能重复
# 订阅太多,复制一行,改名,订阅少了直接删掉一行也行
# additional-prefix的属性可以显示节点来自哪个机场,显示效果举例:[sub2] 香港标准 IEPL 中继 5
#我没有加path,是不同的设备目录权限不一样,担心强行加path,别人用会有兼容性问题,你可以根据自己的实际目录加
proxy-providers:
sub1: { <<: *PProviders, url: "你的第1个订阅地址", override: {additional-prefix: '[sub1] '} }
sub2: { <<: *PProviders, url: "你的第2个订阅地址", override: {additional-prefix: '[sub2] '} }
sub3: { <<: *PProviders, url: "你的第3个订阅地址", override: {additional-prefix: '[sub3] '} }

mode: rule
port: 7890
socks-port: 7891
redir-port: 7892
mixed-port: 7893
tproxy-port: 7895
ipv6: true
allow-lan: true
unified-delay: true
tcp-concurrent: true
log-level: warning
bind-address: "*"
find-process-mode: 'off'
global-client-fingerprint: chrome
keep-alive-interval: 15
keep-alive-idle: 600
authentication:
- mihomo:yyds666
skip-auth-prefixes:
- 192.168.1.0/24
- 192.168.31.0/24
- 192.168.100.0/24
- 127.0.0.1/8

external-ui-url: https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip
external-ui-name: zashboard
external-ui: ui
external-controller: 0.0.0.0:9090
secret: yyds666

profile:
store-selected: true
store-fake-ip: true

sniffer:
enable: true
override-destination: false
force-dns-mapping: true
parse-pure-ip: true

tun:
enable: true
stack: mixed
dns-hijack:
- "any:53"
- "tcp://any:53"
auto-route: true
auto-redirect: true
auto-detect-interface: true

dns:
enable: true
ipv6: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
default-nameserver:
- tls://223.5.5.5
- tls://223.6.6.6
nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
fake-ip-filter:
- rule-set:connectivity-check
- rule-set:private_domain
- rule-set:cn_domain
- +.miwifi.com
- +.docker.io
- +.market.xiaomi.com
- +.push.apple.com
- beiyong.dynuddns.net
- "*.lan"
- localhost.ptlogin2.qq.com
- +.srv.nintendo.net
- +.stun.playstation.net
- +.msftconnecttest.com
- +.msftncsi.com
- +.xboxlive.com
- msftconnecttest.com
- xbox.*.microsoft.com
- "*.battlenet.com.cn"
- "*.battlenet.com"
- "*.blzstatic.cn"
- "*.battle.net"

proxy-groups:
- {name: 一键连, <<: *SelectFB, include-all: true, icon: https://github.com/666OS/YYDS/raw/main/mihomo/image/mihomo.png}
- {name: 故障转移, <<: *FallBack, proxies: [香港自动, 台湾自动, 新加坡自动, 日本自动, 韩国自动, 美国自动], icon: https://github.com/Koolson/Qure/raw/master/IconSet/Color/ULB.png}
- {name: AI平台, <<: *SelectUS, include-all: true, icon: https://github.com/Koolson/Qure/raw/master/IconSet/Color/AI.png}
- {name: 国际媒体, <<: *SelectOne, icon: https://github.com/Koolson/Qure/raw/master/IconSet/Color/DomesticMedia.png}
- {name: 香港自动, <<: *UrlTest, filter: *FilterHK, icon: https://github.com/Koolson/Qure/raw/master/IconSet/Color/Hong_Kong.png}
- {name: 台湾自动, <<: *UrlTest, filter: *FilterTW, icon: https://github.com/Koolson/Qure/raw/master/IconSet/Color/Taiwan.png}
- {name: 新加坡自动, <<: *UrlTest, filter: *FilterSG, icon: https://github.com/Koolson/Qure/raw/master/IconSet/Color/Singapore.png}
- {name: 日本自动, <<: *UrlTest, filter: *FilterJP, icon: https://github.com/Koolson/Qure/raw/master/IconSet/Color/Japan.png}
- {name: 韩国自动, <<: *UrlTest, filter: *FilterKR, icon: https://github.com/Koolson/Qure/raw/master/IconSet/Color/Korea.png}
- {name: 美国自动, <<: *UrlTest, filter: *FilterUS, icon: https://github.com/Koolson/Qure/raw/master/IconSet/Color/United_States.png}

#规则集默认使用GitHub链接,如果你打不开,可以试试把域名换成https://raw.githubusercontent.com 或者试试其他加速域名镜像,例如:url: https://git.imee.me/https://github.com/666OS/YYDS/raw/main/mihomo/rules/download.yaml
#我没有加path,是不同的设备目录权限不一样,担心强行加path,别人用会有兼容性问题,你可以根据自己的实际目录加,例如:./rule_provider/download.yaml
rule-providers:
download: {type: http, interval: 86400, behavior: classical, format: yaml, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/download.yaml}
fix-direct: {type: http, interval: 86400, behavior: classical, format: yaml, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/fix-direct.yaml}
XPTV: {type: http, interval: 86400, behavior: classical, format: yaml, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/XPTV.yaml}
category-ai-!cn: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/category-ai-!cn.mrs}
geolocation-!cn: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/geolocation-!cn.mrs}
youtube: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/youtube.mrs}
spotify: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/spotify.mrs}
netflix: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/netflix.mrs}
disney: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/disney.mrs}
hbo: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/hbo.mrs}
connectivity-check: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/connectivity-check.mrs}
private_domain: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/private.mrs}
cn_domain: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/cn.mrs}
apple-cn: {type: http, interval: 86400, behavior: domain, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/apple-cn.mrs}
cn_ip: {type: http, interval: 86400, behavior: ipcidr, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/cn_ip.mrs}
private_ip: {type: http, interval: 86400, behavior: ipcidr, format: mrs, url: https://github.com/666OS/YYDS/raw/main/mihomo/rules/private_ip.mrs}

rules:
- DST-PORT,123,DIRECT
- DOMAIN-SUFFIX,imee.me,DIRECT
- RULE-SET,category-ai-!cn,AI平台
- RULE-SET,youtube,国际媒体
- RULE-SET,spotify,国际媒体
- RULE-SET,netflix,国际媒体
- RULE-SET,disney,国际媒体
- RULE-SET,hbo,国际媒体
- RULE-SET,download,DIRECT
- RULE-SET,cn_domain,DIRECT
- RULE-SET,apple-cn,DIRECT
- RULE-SET,geolocation-!cn,一键连
# IP规则
- RULE-SET,private_ip,DIRECT,no-resolve
- RULE-SET,cn_ip,DIRECT,no-resolve
# Fix Direct
- RULE-SET,fix-direct,DIRECT
- RULE-SET,XPTV,DIRECT
- MATCH,一键连

把以上代码本地存成一个yaml格式的文件。然后在【配置管理】→【选择文件】→【上传】

之后就是切换到这个新上传的配置,然后启动就可以了。

这个方案除非你的订阅配置的链接变了,否则根本不用维护。唯一的风险是在线规则集的地址可能会变动,如果发现问题,可以去Github找新的规则替换即可。如果你想新加本地规则,可以参考方案2基础上做修改即可。

后记

这个事情其实在懂技术的朋友眼里非常简单,但在我这个半吊子身上就麻烦了,熬了3个通宵才解决。另外吐槽一下,AI生成的配置文件不太可靠,无法直接使用。最后还是靠我自己从各处寻找参考资料,在日志中发现错误后询问AI错误原因,然后手动替换问题部分,一步步调试出可用的配置。

OpenClash配置教程:如何让多个订阅配置文件使用统一的规则

https://www.ftium4.com/OpenClash-multi-proxy-providers-auto-rule-providers.html

作者

龙爪槐守望者

发布于

2025-06-04

更新于

2025-06-04

许可协议

评论