前言
我们知道,大多数网络服务提供商都会根据节点状态和服务方式提供订阅链接,以便用户能够一键导入到相应的客户端中。然而,当用户需要在配置文件中添加自定义节点,或者修改、添加自定义规则时,就不得不手动编辑 *.yml
文件。这种操作方式存在以下几个问题:
- 上手难度高:对于新手用户而言,
*.yml
文件通常体积庞大且结构复杂,仅仅为了添加节点和路由规则而去学习配置文件的结构,显得过于繁琐。
- 操作不便:服务商的节点经常会有变动,如果每次节点更新都需要用户手动修改配置文件,会给用户带来极大的不便。
在这种情况下,我们可以借助 Subconverter 工具来实现订阅链接的自动转换,从而简化操作流程。
Subconverter 是一款功能强大的订阅格式转换工具,用户可以通过它实现对订阅链接的高度自定义配置。与直接修改固定的 *.yml
文件相比,使用 Subconverter 具有以下优势:
- 多格式转换:能够将各种来源的订阅链接转换为不同类型的目标链接格式。
- 节点管理:支持将不同服务商的节点合并为单一链接,并允许用户自行添加节点。
- 自定义配置:通过编辑
all_base.tpl
文件,用户可以自定义上游 DNS 及域名嗅探等功能。
- 灵活规则:通过编辑
\config\*.ini
文件,用户可以根据需求重建适合自己的路由规则。
目前,网上关于搭建 Subconverter 后端的教程要么过于简略,缺乏对基本功能的详细说明;要么过于专业复杂,令初学者难以理解。本文旨在详细讲解如何搭建 Subconverter 后端并实现其基础功能,力求在全面介绍 Subconverter 后端功能的同时,确保内容易于理解,帮助用户快速上手。
搭建
下载 Subconverter 后端
目前知名的后端项目主要包括以下三个:
- 原版 Subconverter 项目:tindy2013/subconverter
- 支持 hysteria/hysteria2 协议的项目:lonelam/subconverter
- Meta 团队开发的 Vmess/Vless 协议支持项目:MetaCubeX/subconverter
以下以 MetaCubeX/subconverter 的 Linux AMD64 平台为例进行说明:
1. 下载并解压
首先,查看当前目录:
pwd
接着,下载并解压文件:
wget https://github.com/MetaCubeX/subconverter/releases/download/Alpha/subconverter_linux64.tar.gz
tar zxvf subconverter_linux64.tar.gz
如果当前目录是 /root
,那么 Subconverter 的工作目录将是 /root/subconverter
,其可执行文件的路径为 /root/subconverter/subconverter
。
将 Subconverter 注册为系统服务
1. 创建 Subconverter.service 文件
nano /etc/systemd/system/subconverter.service
2. 编辑 Subconverter.service 文件内容
[Unit]
Description=A API For Subscription Convert
After=network.target
[Service]
Type=simple
WorkingDirectory=/root/subconverter # 请将此路径修改为实际的工作目录
ExecStart=/root/subconverter/subconverter # 请将此路径修改为实际的可执行文件路径
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
编辑完成后,使用快捷键 Ctrl+O
保存文件,然后按 Ctrl+X
退出编辑器。
管理 Subconverter.service
1. 开机启动
systemctl enable subconverter
systemctl start subconverter
2. 查看日志
journalctl -fu subconverter
3. 重启
systemctl restart subconverter
实际上,到了这一步,Subconverter 后端就已经初步搭建完成了。你可以随意选择一个 Sub-web 前端网站,例如:acl4ssr-sub.github.io 或 sub.ops.ci,然后在“后端地址”或“后端服务”一栏中填入:http://IP地址:25500/sub?
。这样,你就可以自定义 Subconverter,使其输出你所需的配置。
配置
尽管 Subconverter 的官方文档详细列举了众多用法和配置文件说明,但我们只需重点关注以下三个文件:pref.toml
、config/远程配置.ini
和 base/all_base.tpl
。
基础配置 pref.toml
在 [common]
字段中,请根据你的实际情况修改以下内容:
[common]
# API 模式, 如果你想在远程服务器上运行此后端则设置为true,否则为false
api_mode = false
# API模式的访问密钥
api_access_token = "password"
# 是否允许添加自定义节点,如需在订阅中添加自己的其他节点则设置为true
enable_insert = true
# 在订阅链接前插入的 URL,可用于向所有导出的订阅添加节点,支持本地文件/URL
insert_url = [""]
# 将插入的 URL 添加到订阅链接最前面。insert_url 中的节点将首先被添加到组中,使用非特定组的匹配模式
prepend_insert_url = true
# 排除备注与以下模式匹配的节点。支持正则表达式。
exclude_remarks = ["(到期|剩余流量|时间|官网|产品)"]
# 仅包含备注与以下模式匹配的节点。支持正则表达式。
#include_remarks = ["V3.*港"]
# 当未指定配置文件时将外部配置文件设置为默认值,支持本地文件/URL
default_external_config = "config/example_external_config.toml"
这里需要特别注意 default_external_config =
这个配置项。你需要将 "" 内的路径修改为你将要使用的配置文件的实际路径。例如,如果配置文件 ACL4SSR_Online.ini
位于 subconverter 所在目录中的 config/ACL4SSR_Online.ini
,那么这行配置应修改为 default_external_config = "config/ACL4SSR_Online.ini"
。
自定义 Config
根据前文的提示,我们在 Subconverter 目录下的 ./config 文件夹中新建了一个名为 ACL4SSR_Online.ini
的配置文件。
配置文件
[custom]
;ruleset=🔒 局域网,[]GEOIP,LAN
ruleset=🔒 局域网,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/LocalAreaNetwork.list
ruleset=🧲 下载工具,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Download.list
;ruleset=🧲 下载工具,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Download/Download.list
ruleset=🚀 节点选择,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/PrivateTracker/PrivateTracker.list
ruleset=🛑 广告域名,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanAD.list
;ruleset=🆎 广告增强,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanEasyList.list
;ruleset=🆎 广告增强,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanEasyListChina.list
ruleset=🍃 应用净化,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/BanProgramAD.list
ruleset=🅰️ Adobe 验证,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/AdobeActivation/AdobeActivation.list
ruleset=🔍 搜索引擎,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/GoogleSearch/GoogleSearch.list
ruleset=🔍 搜索引擎,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Bing/Bing.list
ruleset=🔍 搜索引擎,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Duckduckgo/Duckduckgo.list
ruleset=🔍 搜索引擎,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Yandex/Yandex.list
ruleset=🔍 搜索引擎,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Naver/Naver.list
ruleset=🤖 AI 域名,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/OpenAI/OpenAI.list
ruleset=🤖 AI 域名,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Copilot/Copilot.list
ruleset=🤖 AI 域名,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Gemini/Gemini.list
ruleset=🤖 AI 域名,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Claude/Claude.list
ruleset=🎮 游戏平台,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Game/Game.list
ruleset=🎞️ 国际媒体,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/GlobalMedia/GlobalMedia.list
ruleset=📺 大陆媒体,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/ChinaMedia/ChinaMedia.list
ruleset=🪟 Microsoft 域名,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Microsoft/Microsoft.list
ruleset=🍎 Apple 域名,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Apple/Apple.list
ruleset=🇬 Google FCM,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/GoogleFCM/GoogleFCM.list
ruleset=🚀 节点选择,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Telegram/Telegram.list
;ruleset=🚀 节点选择,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ProxyGFWlist.list
ruleset=🚀 节点选择,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Proxy/Proxy.list
;ruleset=🇨🇳 大陆域名及IP,[]GEOSITE,CN
ruleset=🇨🇳 大陆域名及IP,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/China/China.list
ruleset=🇨🇳 大陆域名及IP,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Cloud/CloudCN/CloudCN.list
ruleset=🇨🇳 大陆域名及IP,[]GEOIP,CN
;ruleset=🇨🇳 大陆域名及IP,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/ChinaIPs/ChinaIPs.list
ruleset=🐟 其他域名,[]FINAL
custom_proxy_group=🚀 节点选择`select`[]📈 自动选择`[]DIRECT`.*
custom_proxy_group=📈 自动选择`url-test`.*`http://www.apple.com/library/test/success.html`300,5,100
custom_proxy_group=🔍 搜索引擎`select`[]🚀 节点选择`[]DIRECT`[]📈 自动选择`.*
custom_proxy_group=🪟 Microsoft 域名`select`[]🚀 节点选择`[]DIRECT`[]📈 自动选择`.*
custom_proxy_group=🍎 Apple 域名`select`[]🚀 节点选择`[]DIRECT`[]📈 自动选择`.*
custom_proxy_group=🇬 Google FCM`select`[]🚀 节点选择`[]DIRECT`[]📈 自动选择`.*
custom_proxy_group=🤖 AI 域名`select`[]🚀 节点选择`[]DIRECT`[]📈 自动选择`.*
custom_proxy_group=🎮 游戏平台`select`[]🚀 节点选择`[]DIRECT`[]📈 自动选择`.*
custom_proxy_group=🎞️ 国际媒体`select`[]🚀 节点选择`[]DIRECT`[]📈 自动选择`.*
custom_proxy_group=📺 大陆媒体`select`[]DIRECT`[]🚀 节点选择`[]📈 自动选择`.*
custom_proxy_group=🇨🇳 大陆域名及IP`select`[]DIRECT`[]🚀 节点选择`[]📈 自动选择
custom_proxy_group=🔒 局域网`select`[]DIRECT`[]🚀 节点选择`[]📈 自动选择
custom_proxy_group=🧲 下载工具`select`[]DIRECT`[]🚀 节点选择`[]📈 自动选择`.*
custom_proxy_group=🅰️ Adobe 验证`select`[]REJECT`[]DIRECT`[]🚀 节点选择
custom_proxy_group=🛑 广告域名`select`[]REJECT`[]DIRECT`[]🚀 节点选择
;custom_proxy_group=🆎 广告增强`select`[]REJECT`[]DIRECT`[]🚀 节点选择
custom_proxy_group=🍃 应用净化`select`[]REJECT`[]DIRECT`[]🚀 节点选择
custom_proxy_group=🐟 其他域名`select`[]🚀 节点选择`[]DIRECT`[]📈 自动选择`.*
;启用规则生成器
enable_rule_generator=true
;是否覆写之前配置的基础配置内容
overwrite_original_rules=true
配置文件说明
来源
根据 MetaCubeX 官方项目 meta-rules-dat 的描述,其 geosite.dat、geosite.db、geosite-lite.dat 和 geosite-lite.db 等文件均源自 blackmatrix7/ios_rule_script。因此,在本配置文件中,我主要采用了 ios_rule_script
的规则,而在局域网和广告过滤等方面,则使用了更为精简的 ACL4SSR
规则。
ruleset
在 *.ini 配置文件中,Subconverter 会按照 ruleset=
从上到下的顺序生成规则。因此,像 🔒 局域网
、🛑 广告域名
、🧲 BT Tracker
这样的域名优先级较高,应置于最前面。而 🇨🇳 大陆域名及IP
和 兜底策略
优先级较低,应放在最后。
以下是每个 ruleset=
的简要说明:
- 🔒 局域网:本地/局域网地址,等同于
GEOIP,LAN
- 🧲 下载工具:常见下载软件的进程,但不包括 BitComet。
- 🚀 BT Tracker(合并到 🚀 节点选择):整合了 XIU2/TrackersListCollection 和 ngosang/trackerslist 的 Tracker。将其置于前列是为了让 Mihomo 内核优先处理 BT 下载软件的 Tracker 连接请求,避免将域名解析为 IP 地址后再判断应直连还是通过节点。若无此需求,可注释掉该行。
- 🛑 广告域名:仅包含常见广告关键字和广告联盟,基本无副作用。
- 🆎 广告增强:包含 EasyList 和 EasyListChina 的广告规则。开启后规则数量将大幅增加,且广告域名需尽量前置,可能导致终端设备负载过重,故默认关闭。
- 🍃 应用净化:包含常用应用的去广告规则。
- 🅰️ Adobe 验证:包含 Adobe 正版验证域名。
- 🔍 搜索引擎:包括 Google、Bing、DuckDuckGo、Yandex 和 Naver 五个搜索引擎。单独列出可防止搜索区域混乱。
- 🤖 AI 域名:包括 OpenAI、Copilot(含 Bing 和 MSN)、Gemini 和 Claude 的域名。
- 其他规则顾名思义,此处不再赘述。
all_base.tpl
all_base.tpl
是 Subconverter 在输出配置文件时所参考的基准文件。尽管官方中文教程对该文件的具体使用方法介绍有限,但本文将重点探讨如何通过该文件修改“DNS解析方式”和“自定义GeoIP GeoSite MMDB”的设置。
修改 DNS 字段
首先,搜索 {% if request.target == "clash" or request.target == "clashr" %}
,删除从 {% if request.target == "clash" or request.target == "clashr" %}
到 {% endif %}
之间的内容,并将其替换为以下配置:
dns:
enable: true
prefer-h3: false
listen: 0.0.0.0:53
ipv6: false
enhanced-mode: redir-host # 或 fake-ip
use-hosts: true
default-nameserver:
- tcp://223.5.5.5
- tcp://223.6.6.6
nameserver:
- https://223.5.5.5/dns-query # 阿里云公共DNS
- https://223.6.6.6/dns-query # 阿里云公共DNS
- https://1.12.12.12/dns-query # DNSPod
- https://120.53.53.53/dns-query # DNSPod
fallback:
- https://1.1.1.1/dns-query # Cloudflare Public DNS
- https://1.0.0.1/dns-query # Cloudflare Public DNS
- https://208.67.222.222/dns-query # OpenDNS
- https://208.67.220.220/dns-query # OpenDNS
- https://8.8.8.8/dns-query # Google Public DNS
- https://8.8.4.4/dns-query # Google Public DNS
- https://9.9.9.11:5053/dns-query # Quad9 Public DNS
- https://149.112.112.11:5053/dns-query # Quad9 Public DNS
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- '+.*'
- '*.lan'
- '*.local'
- '*.localhost'
- '*.localdomain'
- 'stun.*.*'
- 'stun.*.*.*'
- '+.stun.*.*'
- '+.stun.*.*.*'
- '+.stun.*.*.*.*'
- '+.stun.*.*.*.*.*'
- 'time.*.com'
- 'time1.*.com'
- 'time2.*.com'
- 'time3.*.com'
- 'time4.*.com'
- 'time5.*.com'
- 'time6.*.com'
- 'time7.*.com'
- 'ntp.*.com'
- 'ntp1.*.com'
- 'ntp2.*.com'
- 'ntp3.*.com'
- 'ntp4.*.com'
- 'ntp5.*.com'
- 'ntp6.*.com'
- 'ntp7.*.com'
- '*.msftconnecttest.com'
- '*.msftncsi.com'
- '*.steamcontent.com'
- '*.*.xboxlive.com'
- 'xbox.*.*.microsoft.com'
- 'localhost.ptlogin2.qq.com'
- 'localhost.sec.qq.com'
sniffer:
enable: true
sniff:
HTTP:
ports: [80, 8080-8880]
override-destination: true
TLS:
ports: [443, 8443]
QUIC:
ports: [443, 8443]
prefer-h3: false
:由于 H3 使用 UDP 传输层,容易被 QoS 限制,因此不建议开启。
enhanced-mode
:如果你有特殊需求,如 BT 下载、使用电视盒子,或担心 DNS 缓存被污染,建议使用 redir-host
并开启 sniffer:
。若无此类需求,可使用 fake-ip
并关闭 sniffer:
。
default-nameserver
、nameserver
、fallback
:这些公共 DNS 服务器仅为示例,请根据自身网络情况增删条目。
fake-ip-filter
:特别注意第 1 条 - '+.*'
,添加此条后,即使使用 fake-ip
模式,所有 DNS 解析也会回退到 redir-host
模式。添加此条仅为示例说明。
增加 geox-url 字段
在 DNS
字段之后 {% endif %}
之前插入以下内容,以自定义 GeoIP GeoSite MMDB。
geox-url:
geoip: "https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip-lite.dat"
geosite: "https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
mmdb: "https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/country.mmdb"
这里采用 meta-rules-dat 作为规则数据源。你可以通过替换配置文件来自定义规则集。
snippets
Sunconverter 的 emoji 配置文件位于 snippets/emoji.toml
和 snippets/emoji.txt
中,但默认提供的配置似乎存在一点问题。
emoji.toml:
[[emoji]]
match = "(?i:\\bTW[N]?\\b|Taiwan|新北|彰化|\\bCHT\\b|台湾|[^-]台|\\bHINET\\b)"
emoji = "🇹🇼"
emoji.txt:
(?i:\bTW[N]?\b|Taiwan|新北|彰化|\bCHT\b|台湾|[^-]台|\bHINET\b),🇹🇼
重启
配置完成后重启 Subconverter。该服务会在 IP地址:25500 监听转换请求。
systemctl restart subconverter
转换
打开任意一个订阅转换网站,这里以 ACL4SSR 为例。
- 远程配置:选择“不选,由接口提供方提供”
- 后端地址:填入
http://IP地址:25500/sub?
。如果你开启了 API 模式并配置了 api_access_token=
,则应填入 http://IP地址:25500/sub?token=密码
如果配置文件没有问题,就说明 Subconverter 后端已成功搭建。
反向代理
一般来说,即便使用了 API模式 并配置了Token,这种方法仍然存在安全隐患。为了提高安全性,可以配置Nginx并进行反向代理Sunconverter。
前提条件
- 已购买域名,并将域名解析至服务器IP地址。
- 已通过
certbot
为即将使用的域名申请SSL证书。
由于Nginx的安装与配置并非本文重点,因此仅提供站点配置文件供参考。
配置
新建一个站点配置文件 sub.example.com
server {
listen 80;
# listen [::]:80;
server_name sub.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# root /var/www/sub.humanristos.top/html;
# index index.html index.htm index.nginx-debian.html;
server_name sub.example.com;
location / {
proxy_redirect off;
proxy_pass http://localhost:25500;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
}
转换
重新打开任意一个订阅转换网站,这里以 ACL4SSR 为例。
- 远程配置:选择“不选,由接口提供方提供”
- 后端地址:填入
https://sub.example.com/sub?
。如果你开启了 API 模式并配置了 api_access_token=
,则应填入 https://sub.example.com/sub?token=密码
如果配置文件没有问题,就说明 Subconverter 后端已成功搭建。