oynix

于无声处听惊雷,于无色处见繁花

如何在ClashX Pro上优雅地管理多个订阅服务

虽然相关的作者都已经陆陆续续删库,但不可否认的是,ClashX Pro依然是MacOS上代理客户端的首选。网上下载安装程序时需要注意,区分ClashX和ClashX Pro,前者使用的是开源的Clash内核,后者使用的是Clash Premium闭源内核。相比之下Pro的功能更加强大,特别是它支持RULE-SET语法,是管理多订阅必不可少的。

鉴于工作和日常的需要,代理必不可少,同时出于这一需求的特殊,我很少在同一个代理商购买长期服务,多数是只买一个月或者一个季度,若是好用到期后继续续费,若是不好用,直接换下一家,甚至中途商家跑路,损失也不惨重,可以接受。是以,手里经常同时存在多个代理。

网上可以查到常用的管理方案是,自建一个节点聚合服务,在这个服务里管理多订阅节点,然后生成一个新的订阅地址,所有需要的地方,订阅这个地址。这种方式的特点是十分便捷,尤其是多设备的场景,若有变动,只需修改聚合服务即可。但是,显然的是,这里需要一个自建的服务,对于我来说,这就是个门槛。

今天偶然看了看clash的配置文件,发现也可以将多订阅放到本地聚合,几经验证后,这条路能跑通,在此记录一下。

1. clash配置文件结构

clash配置文件使用yaml的格式,按照我的理解,将其分为里两大部分,一个是静态配置部分,一个是动态配置部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mixed-port: 7890
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
external-controller: '127.0.0.1:9090'
dns:
enable: true
ipv6: false
default-nameserver: [223.5.5.5, 119.29.29.29]
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
use-hosts: true
nameserver: ['https://doh.pub/dns-query', 'https://dns.alidns.com/dns-query']
fallback: ['https://doh.dns.sb/dns-query', 'https://dns.cloudflare.com/dns-query', 'https://dns.twnic.tw/dns-query', 'tls://8.8.4.4:853']
fallback-filter: { geoip: true, ipcidr: [240.0.0.0/4, 0.0.0.0/32] }

静态配置部分如上,不同的服务订阅大差不差,基本都是这个样子,细小的差别也不会影响使用,我采用的就是如上的配置,主要配置就是dns,如果禁用自带的dns,将enable设置为false,那么就可忽略其选项。

动态配置部分是围绕代理节点和规则这两个展开的。代理部分的配置是所有可用的节点,而规则部分则是访问不同地址时需要采用什么规则,走代理、走直接连接,还是拒绝访问,按需配置。结合clash的语法规则,我们需要配置4个选项,

  • proxy-providers
  • proxy-groups
  • rules-providers
  • rules

proxy-providers中是所有订阅地址提供的所有可用的节点,而proxy-groups则是我们如何管理/分组这些节点,比如将所有美国的节点分到一个组里,按照测速排序,使用延迟最低的,这是种常用的分组模式。

rules-providers则是提供了所有的域名规则、IP规则、域名分组、IP分组、进程分组,等等,而rules则将上面的proxy-groups和这些规则关联到一起。比如,出于风控需要,我们将所有ChatGPT相关的域名、IP分到一组,然后将其和上面的美国节点关联,形成一条规则,也就是说,每当请求规则里的ChatGPT的域名/IP时,都会走美国的节点,诸如此类,我们可以灵活配置各种规则。

以上是笼统的介绍,接下来将逐一详细说明。

2. proxy-providers

简单来说,一个provider对应一个订阅链接,而订阅链接的实质主要就是一个或者多个节点信息,所以,一个provider对应一组节点。节点的来源支持两种形式:URL和本地yaml文件。使用URL时,会通过URL将配置文件下载到本地,然后再从配置文件中获取节点信息,如此看到,两种方式的差别并不大。

1
2
3
4
5
6
7
8
9
10
proxy-providers:
provider1:
type: http
url: 'https://sub.service.provider'
path: './proxies/provider1.yaml'
interval: 3600
health-check:
enable: true
url: 'http://www.gstatic.com/generate_204'
interval: 300

http类型的配置项如上,provider1是这组节点的名字,其中的url则是服务商提供的订阅地址,path则是下载下来的配置文件保存到的本地路径,interval表示每隔3600秒更新一次这个配置文件到本地,health check是用来测试节点延迟的,一般用谷歌的这个地址,也有用其他地址的,按需配置就好。

这里有一点需要注意,当在浏览器直接访问订阅地址,返回的内容是base64转换过的内容时,clash是解析不了的,这个时候只需要在订阅地址末尾加上&flag=clash,即可返回yaml格式的配置文件。

1
2
3
4
5
6
7
8
proxy-providers:
provider2:
type: file
path: './proxies/provider2.yaml'
health-check:
enable: true
url: 'http://www.gstatic.com/generate_204'
interval: 300

file类型与http类型类似,区别在于少了请求的url和间隔,前提是path指定的配置文件需要存在,否则会报错。

不管以上哪种类型,path的相对路径就是clash配置文件所在的目录,通过clash菜单可直接打开。此外,对于yaml配置文件,只会使用其中proxies的值,而不关心是否有其他配置项。

如果都是订阅链接,那么都用http类型就好,每个服务商的订阅地址对应一个provider,有几个就配置几个,名字不可重复。

3. proxy-groups

首先需要说明一点,一个group中可能会包含多个节点,同一时刻的流量只能走组内的一个节点,至于使用哪个节点,有两种模式:手动选择和自动选择。

手动选择模式,需要我们自己勾选使用的节点,选中之后不会自动改变,而自动模式则是根据延迟测速排序,自动选中最快的节点,测速会按照配置的间隔持续执行,每次测速结束后,都会更新选中的节点。

我的配置大概长这个样子,配置了3个订阅地址,yunti、yiyuan和shadow,每个订阅设置了一个手动选择模式的组,yunti-select、yiyuan-select和shadow-select,select组中包含了对应订阅的所有节点。

此外,针对较为好用的yunti订阅,我又将其按照地区单独建了几个自动的组,yunti-sg-auto、yunti-us-auto、yunti-jp-auto,等,其中,yunti-sg-auto中包含yunti订阅下所有在新加坡的节点,且该组为自动选择模式,始终选中最快的节点,其他组同理。

在规则模式下,所有需要走代理的流量都会走PROXY组,而PROXY组的流量又会走我选中的组,平常多数时候都会选中一个auto的组,如有特殊需要,比如某个订阅的全部节点都挂了(这可能是常有的事),这个时候切换到其他订阅的select组,临时过渡,等到恢复再次切换回来。

配置如下,

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
proxy-groups:
- name: PROXY
type: select
proxies:
- DIRECT
- REJECT
- yunti-select
- yiyuan-select
- shadow-select
- yunti-sg-auto
- yunti-us-auto
- yunti-jp-auto
- yunti-hk-auto
- name: yunti-sg-auto
type: url-test
filter: '.*新加坡.*'
use:
- yunti-all
- name: yunti-us-auto
type: url-test
filter: '.*美国.*'
use:
- yunti-all
- name: yunti-jp-auto
type: url-test
filter: '.*日本.*'
use:
- yunti-all
- name: yunti-hk-auto
type: url-test
filter: '.*香港.*'
use:
- yunti-all
- name: yunti-select
type: select
use:
- yunti-all
- name: yiyuan-select
type: select
use:
- yiyuan-all
- name: shadow-select
type: select
use:
- shadow-all

这里配置的顺序,就是在clash菜单栏显示的顺序。name是节点组的名字,不可重复,type是节点组的类型,正如上面所说,有select和url-test两种模式,use表示对上面配置的proxy provider的引用,如果不加过滤则是引用所有节点,就像select类型的节点组,filter则是通过正则表达式过滤了一下,表示这个节点组只需要provider中名字符合过滤条件的节点,proxies则是流量转发的代理,DIRECT和REJECT是clash内置的两种模式,直接连接和拒绝连接,也可将流量转发至节点组,所以将下面配置的自动和手动的所有节点组,都添加到了PROXY组中,供其选择。

4. rules-providers

上面的proxy providers提供的是节点,这里的rules providers提供的是域名、IP,也可以是进程名称,等。同样,rules provider也支持两种模式,一种是远程的http模式,一种是本地的file模式。

根据需要,我们可以创建多个provider,例如将所有谷歌相关的域名聚集到一个provider中,也可以将所有广告的域名聚集到一个provider中,由于一些域名集合的名单在不断更新,所以,我们常将动态的规则集合使用http模式,而固定不变的规则集合使用file模式。

而那些远程的规则集合,多数都不需要自己维护,那些有些互联网精神的人在热心维护着这些规则,如果没有特殊需求,我们就可以在这些大树下面好乘凉。如果还有额外的需求也没关系,再添加新的规则集合就可以了。这些规则网上有着不少,搜一搜就能出来不少,没有什么好与不好的标准,根据自己的需要找到合适的就是最好的。文末会贴上我在用的。

1
2
3
4
5
6
7
8
9
10
11
rule-providers:
profile-reject:
type: file
behavior: domain
path: './ruleset/profile-reject.yaml'
reject:
type: http
behavior: domain
url: 'https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt'
path: './ruleset/reject.yaml'
interval: 86400

如上,两种模式分别配置了一个,file本地配置是我自己的特殊需求,而http配置则是别人总结的需要拒绝访问的一些域名。这里的yaml配置文件,只会使用其中的payload选项的值,而不关心其他配置。例如我配置的profile-reject.yaml内容如下:

1
2
3
4
5
6
7
8
9
10
payload:
- adobe.io
- adobe.com
- swdist.apple.com
- swscan.apple.com
- swcdn.apple.com
- gdmf.apple.com
- xp.apple.com
- mesu.apple.com
- updates.cdn-apple.com

前文提到过,我为了禁止nsurlsessiond进程偷跑流量,针对它请求的域名做了一些处理,而adobe则是因为我装的破解版的PS总是访问这两个域名,来对我做出一些干扰,所以一同禁止掉了。

5. rules

所谓rules,就是将前面已经配置好的proxy group和rules provider关联起来。比如我自己写的profile-reject的域名集合,当产生这些域名的访问请求时,我希望clash可以拒绝掉,那么就如下配置即可,

1
2
rules:
- RULE-SET,profile-reject,REJECT

语法很清晰,RULE-SET表明这是一条规则的集合,因为有多个域名,后面的profile-reject则是上面配置的rules provider的名字,结尾的REJECT则是对这些域名的操作。我的完整配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
rules:
- RULE-SET,profile-direct,DIRECT
- RULE-SET,profile-reject,REJECT
- RULE-SET,applications,DIRECT
- DOMAIN,clash.razord.top,DIRECT
- DOMAIN,yacd.haishan.me,DIRECT
- RULE-SET,private,DIRECT
- RULE-SET,reject,REJECT
- RULE-SET,icloud,DIRECT
- RULE-SET,apple,DIRECT
- RULE-SET,google,PROXY
- RULE-SET,proxy,PROXY
- RULE-SET,direct,DIRECT
- RULE-SET,lancidr,DIRECT
- RULE-SET,cncidr,DIRECT
- RULE-SET,telegramcidr,PROXY
- GEOIP,LAN,DIRECT
- GEOIP,CN,DIRECT
- MATCH,PROXY

除了RULE-SET语法,还有DOMAIN语法,用来匹配完整域名,DOMAIN-SUFFIX语法来匹配域名后缀,GEOIP匹配IP的所在地理位置。上面提到过,clash在规则模式下,所有的流量都会走到PROXY这个proxy group,原因就在此,因为rules配置的除了DIRECT、REJECT就是PROXY,这种配置的特点是,针对所有规则内的域名、IP,要么直接连接,要么拒绝连接,要么走PROXY代理。

如果一个请求进来,所有的规则都没有命中,也就是漏网之鱼,那么就会走到最后一行,MATCH规则,这里配置的PROXY,意思是,所有规则外的请求,都走PROXY代理,这种模式安全性高,避免暴露自己的IP,但是会消耗更多的代理流量。如果没有过高的这方面要求,也可以配置成MATCH,DIRECT,使其直接连接。甚至,还可以为MATCH专门建一个proxy group供其使用

参考链接

  • 规则集合
  • ClashX使用入门
  • rules-provider介绍
------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2024/05/8af5ad586665/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道