前言

Clash是目前流行的网络分流软件,通过正确的配置规则可以实现对不同网站使用相应的节点进行访问,大大提高了日常使用的感受。目前大多数网络服务提供商也提供了相应的订阅链接,方便用户一键配置。

然而,如果使用者想要添加自动的特殊规则,或是在原有订阅的基础上新增自定义节点,服务商提供的订阅链接的作用就显得捉襟见肘了,这时通常需要手动编写config.yml配置文件来实现响应的需求。然而服务商的节点时常有变动,而每变动一次都需要我们重新更改配置文件,对我们的使用造成严重的不便。

这时就轮到subconverter出场了,用户可以通过subconverter实现对订阅的高度自定义配置,并能够将其转化为多个客户端的配置文件,使订阅更新时能够继续继续保持原有规则。总的来说,其特点如下:

  • 订阅格式转化:能够将订阅转为多个客户端的配置文件
  • API模式:能够通过API模式搭建服务端
  • 订阅合并:可以合并多个订阅,亦可增加单独节点
  • 自定义规则:通过编辑配置文件,实现自定义分组与规则,做到一劳永逸

安装与使用

subconverter,

subconverter的安装十分简单,前往作者Github 的 Release界面下载好对应平台的最新版本的二进制软件即可开始使用:

  1. 安装64位版本或者32位版本
  2. 解压后运行subconverter\subconverter.exe即可
1
2
3
4
5
6
# 下载release
wget https://github.com/tindy2013/subconverter/releases/latest/download/subconverter_linux64.tar.gz
# 解压并授权
tar -xvzf subconverter_linux64.tar.gz subconverter && chmod +x subconverter/subconverter
# 运行即可
subconverter/subconverter

subconverter官方文档使用方法介绍的十分详细,这里就不再赘述,只说明一下其支持的订阅转换类型:

类型 作为源类型 作为目标类型 参数
Clash clash
ClashR clashr
Quantumult (完整配置) quan
Quantumult X (完整配置) quanx
Loon loon
Mellow mellow
SS (SIP002) ss
SS (软件订阅) sssub
SSD ssd
SSR ssr
Surfboard surfboard
Surge 2 surge&ver=2
Surge 3 surge&ver=3
Surge 4 surge&ver=4
Trojan trojan
V2Ray v2ray
类 TG 代理的 HTTP/Socks 链接 × 仅支持 &url= 调用
Mixed × mixed
Auto × auto

配置修改

如前文所言,官方文档已经完美解释了了配置文件的作用,因此本节仅体现博主进行修改过的配置内容:

编写博客时subconverter版本为:v0.6.4

common字段修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[common]
;API 模式, 如果你是在远程服务器上运行subconverter则将其设置为true,否则为false
api_mode=true

;API模式访问密钥,远程访问时用于验证身份使用
api_access_token=1234567989asdfg

;默认订阅链接, 如有多个连接需要使用"|"进行分割,用以在请求未提供订阅链接时处理订阅,可以为文件或者链接
default_url=https://sub.me/getsub.php?service=5568&id=5598|https://sub1.me/getsub.php?service=5568&id=5598

;是否允许注入自定义节点,如果需要在订阅中添加自己的其他节点则设置为true
enable_insert=true
;需要注入的节点,多个节点用"|"进行分割,
insert_url=vmess://sadjslakjdlsakjdlksajdlsakjdklasjdlkasndknsakcjsalkjdklasjldjalksjdlasjdlasd=

;默认外部配置文件,如未指定外部配置,则加载该配置。支持 本地文件 和 在线URL
default_external_config=https://external/pref.ini

rulesets字段

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
;是否开启自定义规则
enabled=true

;是否覆写之前配置的基础配置内容
overwrite_original_rules=false

;是否允许通过请求更改规则
update_ruleset_on_request=false

;从本地或 url 获取规则片段
;格式: Group name,[type:]URL[,interval]
; Group name,[]Rule
;支持的type(类型)包括:surge, quanx, clash-domain, clash-ipcidr, clash-classic
;type留空时默认为surge类型的规则
;[] 前缀后的文字将被当作规则,而不是链接或路径,主要包含 []GEOIP 和 []MATCH(等同于 []FINAL)
;博主使用的策略如下:
ruleset=🏴‍☠️ 独立代理,https:rule/duli.list
ruleset=🎯 强行直连,https:rule/zhilian.list
ruleset=⚔️ 专用代理,https:rule/zhuanyong.list
ruleset=DIRECT,https:rule/zhilian.list
ruleset=🐟 漏网之鱼,[]FINAL
;举例策略:
ruleset=🍎 苹果服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Apple.list
; 表示引用 https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Apple.list 规则
; 且将此规则指向 [proxy_group] 所设置 🍎 苹果服务 策略组
ruleset=Domestic Services,clash-domain:https://ruleset.dev/clash_domestic_services_domains,86400
; 表示引用clash-domain类型的 https://ruleset.dev/clash_domestic_services_domains 规则
; 规则更新间隔为86400秒
; 且将此规则指向 [proxy_group] 所设置 Domestic Services 策略组
ruleset=🎯 全球直连,rules/NobyDa/Surge/Download.list
; 表示引用本地 rules/NobyDa/Surge/Download.list 规则
; 且将此规则指向 [proxy_group] 所设置 🎯 全球直连 策略组
ruleset=🎯 全球直连,[]GEOIP,CN
; 表示引用 GEOIP 中关于中国的所有 IP
; 且将此规则指向 [proxy_group] 所设置 🎯 全球直连 策略组
ruleset=!!import:snippets/rulesets.txt
; 表示引用本地的snippets/rulesets.txt规则

这里通过ruleset来实现对不同地址的规则制定,个人建议将相应的网址存储在Github页面上来维护,这样也方便服务的搬迁或者重装,格式如下:

1
2
3
4
# 匹配类型,域名
DOMAIN,apple.comscoreresearch.com
DOMAIN-SUFFIX,mzstatic.com
IP-CIDR,17.0.0.0/8,no-resolve

proxy_group字段

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
;为 Clash 、Mellow 、Surge 以及 Surfboard 等程序创建策略组, 可用正则来筛选节点
;[] 前缀后的文字将被当作引用策略组
custom_proxy_group=Group_Name`url-test|fallback|load-balance`Rule_1`Rule_2`...`test_url`interval[,timeout][,tolerance]
custom_proxy_group=Group_Name`select`Rule_1`Rule_2`...
; 格式示例

custom_proxy_group=🍎 苹果服务`url-test`(美国|US)`http://www.gstatic.com/generate_204`300,5,100
; 表示创建一个叫 🍎 苹果服务 的 url-test 策略组,并向其中添加名字含'美国','US'的节点,每隔300秒测试一次,测速超时为5s,切换节点的延迟容差为100ms
custom_proxy_group=🇯🇵 日本延迟最低`url-test`(日|JP)`http://www.gstatic.com/generate_204`300,5
; 表示创建一个叫 🇯🇵 日本延迟最低 的 url-test 策略组,并向其中添加名字含'日','JP'的节点,每隔300秒测试一次,测速超时为5s
custom_proxy_group=负载均衡`load-balance`.*`http://www.gstatic.com/generate_204`300,,100
; 表示创建一个叫 负载均衡 的 load-balance 策略组,并向其中添加所有的节点,每隔300秒测试一次,切换节点的延迟容差为100ms
custom_proxy_group=🇯🇵 JP`select`沪日`日本`[]🇯🇵 日本延迟最低
; 表示创建一个叫 🇯🇵 JP 的 select 策略组,并向其中**依次**添加名字含'沪日','日本'的节点,以及引用上述所创建的 🇯🇵 日本延迟最低 策略组
custom_proxy_group=g1`select`!!GROUPID=0`!!INSERT=0
; 指订阅链接中的第一条订阅以及配置文件中 insert_url 中的第一条节点
custom_proxy_group=g2`select`!!GROUPID=1
; 指订阅链接中的第二条订阅
custom_proxy_group=g2`select`!!GROUPID=!2
; 指除了订阅链接中的第三条订阅
custom_proxy_group=g2`select`!!GROUPID=3-5
; 指订阅链接中的第四条到第六条订阅
custom_proxy_group=v2ray`select`!!GROUP=V2RayProvider
; 指订阅链接中组名(tag)为 V2RayProvider 的节点
custom_proxy_group=g1hk`select`!!GROUPID=0!!(HGC|HKBN|PCCW|HKT|hk|港)
; 订阅链接中的第一条订阅内名字含 HGC、HKBN、PCCW、HKT、hk、港 的节点

; 博主自用组名
custom_proxy_group=🎏 JMS`select`!!GROUPID=1`[]🎏 JMS-AUTO
custom_proxy_group=🐟 漏网之鱼`select`[]🎏 JMS`[]⚖️ 负载均衡`[]🤖 自动测试`!!GROUPID=0
custom_proxy_group=⚔️ 专用代理`select`!!GROUPID=1
custom_proxy_group=⚖️ 负载均衡`load-balance`!!GROUPID=0`http://www.gstatic.com/generate_204`300,,100
custom_proxy_group=🤖 自动测试`url-test`!!GROUPID=0`http://www.gstatic.com/generate_204`300,5
custom_proxy_group = 🎏 JMS-AUTO`url-test`!!GROUPID=1`http://www.gstatic.com/generate_204`300,5
custom_proxy_group=🎯 强行直连`select`[]DIRECT
custom_proxy_group=🏴‍☠️ 独立代理`select`!!INSERT=1

外部配置相关

由于博主服务器经常瞎折腾,机器经常重装系统,因此我会尽量将配置文件剥离到外部使用,避免因机器原因造成的配置丢失。所谓外部配置即将前文pref.ini中规则和分组的配置信息另起一个文件写入其中,在使用时调用该配置文件,也可以设置common字段中的default_external_config实现默认调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
;由外部配置中所定义的值覆盖 pref.ini 里的内容,必须以[custom开头]
[custom]
ruleset=🏴‍☠️ 独立代理,https:rule/duli.list
ruleset=🎯 强行直连,https:rule/zhilian.list
ruleset=⚔️ 专用代理,https:rule/zhuanyong.list
ruleset=DIRECT,https:rule/zhilian.list
ruleset=🐟 漏网之鱼,[]FINAL
custom_proxy_group=🎏 JMS`select`!!GROUPID=1`[]🎏 JMS-AUTO
custom_proxy_group=🐟 漏网之鱼`select`[]🎏 JMS`[]⚖️ 负载均衡`[]🤖 自动测试`!!GROUPID=0
custom_proxy_group=⚔️ 专用代理`select`!!GROUPID=1
custom_proxy_group=⚖️ 负载均衡`load-balance`!!GROUPID=0`http://www.gstatic.com/generate_204`300,,100
custom_proxy_group=🤖 自动测试`url-test`!!GROUPID=0`http://www.gstatic.com/generate_204`300,5
custom_proxy_group = 🎏 JMS-AUTO`url-test`!!GROUPID=1`http://www.gstatic.com/generate_204`300,5
custom_proxy_group=🎯 强行直连`select`[]DIRECT
custom_proxy_group=🏴‍☠️ 独立代理`select`!!INSERT=1

高级应用

开机自启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 编辑服务配置文件
vi /etc/systemd/system/subconverter.service
# 写入服务信息
[Unit]
Description=A API For Subscription Convert
After=network.target

[Service]
Type=simple
ExecStart=/root/subconverter/subconverter #subconverter 文件路径
WorkingDirectory=/root/subconverter #subconverter 所在目录
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

systemctl enable subconverter #启用服务
systemctl start subconverter #启动服务

该方法我并未验证是否可行

  1. 打开启动文件夹

    通过 win + r打开运行,输入shell:Common Startup打开启动文件夹

  2. 拖入subconverter的快捷方式

配置反向代理和SSL加密

如果你是在服务器端以API模式运行subconverter的,那么默认是通过http://158.165.45.23/sub?target=clash&token=123456 的方式进行访问的,我在基于 Swizzin 打造客制化种子盒译文中也提到过,使用该方法访问既不美观,也不安全。因此本节将介绍如何对subconverter启用反向代理并配置SSL加密。

这里介绍两种反向代理的软件:nginxCaddy,nginx功能更加强大切运行更快但是Caddy配置更加简单。博主建议如果你已配置了其他服务且想要整合subconverter则使用nginx,如果是仅需运行subconverter则使用Caddy更加简单。

  1. 通过任意方法安装nginx,如Swizzin

  2. 编辑nginx配置文件,这里以Swizzin安装的nginx为例

    1
    2
    3
    4
    5
    6
    7
    # 新建并编辑配置文件
    vi /etc/nginx/apps/subconverter.conf
    # 输入以下内容
    location /subconverter/ {
    proxy_pass http://127.0.0.1:25500; #端口号是配置文件中的端口号,默认为25500
    }

    这里默认你已经通过Swizzin获取了SSL证书,接下来你即可通过https://domain.com/subconverter/sub?target=clash&token=123456的方法获取订阅了。如果你并未获取SSL证书,请参考:基于 Swizzin 打造客制化种子盒

    或者你也可以采取二级域名的方式配置反向代理:

    1
    2
    3
    4
    5
    6
    7
    8
    # 通过certbot获取SSL证书,以Ubuntu 20.24 LTS 为例
    # Certbot官网:https://certbot.eff.org/
    sudo apt update
    sudo apt install snapd
    sudo snap install core; sudo snap refresh core
    sudo snap install --classic certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot
    sudo certbot certonly --webroot
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 修改nginx配置文件,添加subconverter
    sudo vi /etc/nginx/sites-enabled/default
    ## 添加以下内容
    server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/yourdomain/fullchain.pem; # SSL证书地址,通过certbot获取的证书默认在该位置
    ssl_certificate_key /etc/letsencrypt/live/yourdomain/privkey.pem; # SSL密钥地址,通过certbot获取的证书密钥默认在该位置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    server_name clash.domain.com; #需要使用的二级域名
    location / {
    proxy_redirect off;
    proxy_pass http://127.0.0.1:25500; #端口号是配置文件中的端口号,默认为25500
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    }
    }

    # 重启nginx
    sudo systemctl restart nginx
1
2
3
4
5
6
7
# 安装Caddy,以Ubuntu 20.24 LTS 为例
# Caddy也可以直接使用编译完成的二进制文件,这里采用的是包管理器的方式安装,该方法能自动配置系统服务,减少工作量
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 编写Caddyfile
vi /etc/caddy/Caddyfile

# 写入以下内容
# clash.domain.com为需要配置的域名
clash.domain.com {
encode gzip
tls email@mail.com # 邮箱是ACME account,随意填写也无所谓
# tls internal # 如果上文无法获取证书,则使用该方法获取自签名证书。自签名证书需要在cloudflare配置SSL为灵活或者完全后方能使用
reverse_proxy http://127.0.0.1:25500 #端口号是配置文件中的端口号,默认为25500
}

# 重启Caddy
sudo systemctl restart caddy

接下来即可通过https://domain.com/subconverter/sub?target=clash&token=123456方法安全的访问相关订阅了!

总结

本文介绍了如何通过subconverter合并、转换订阅并自定义相关规则,同时采用反向代理+SSL加密的方法确保访问的安全性。

本文并未安装网络上流行的前端页面,主要是由于该前端对于自用用户来说作用并不大,因此略过了前端的安装。

参考资料: