btpanel 发表于 2025-1-6 01:03:35

自行搭建 Subconverter 后端并自定义规则

## 前言

我们知道,大多数网络服务提供商都会根据节点状态和服务方式提供订阅链接,以便用户能够一键导入到相应的客户端中。然而,当用户需要在配置文件中添加自定义节点,或者修改、添加自定义规则时,就不得不手动编辑 `*.yml` 文件。这种操作方式存在以下几个问题:

1. **上手难度高**:对于新手用户而言,`*.yml` 文件通常体积庞大且结构复杂,仅仅为了添加节点和路由规则而去学习配置文件的结构,显得过于繁琐。
2. **操作不便**:服务商的节点经常会有变动,如果每次节点更新都需要用户手动修改配置文件,会给用户带来极大的不便。

在这种情况下,我们可以借助 Subconverter 工具来实现订阅链接的自动转换,从而简化操作流程。

Subconverter 是一款功能强大的订阅格式转换工具,用户可以通过它实现对订阅链接的高度自定义配置。与直接修改固定的 `*.yml` 文件相比,使用 Subconverter 具有以下优势:

1. **多格式转换**:能够将各种来源的订阅链接转换为不同类型的目标链接格式。
2. **节点管理**:支持将不同服务商的节点合并为单一链接,并允许用户自行添加节点。
3. **自定义配置**:通过编辑 `all_base.tpl` 文件,用户可以自定义上游 DNS 及域名嗅探等功能。
4. **灵活规则**:通过编辑 `\config\*.ini` 文件,用户可以根据需求重建适合自己的路由规则。

目前,网上关于搭建 Subconverter 后端的教程要么过于简略,缺乏对基本功能的详细说明;要么过于专业复杂,令初学者难以理解。本文旨在详细讲解如何搭建 Subconverter 后端并实现其基础功能,力求在全面介绍 Subconverter 后端功能的同时,确保内容易于理解,帮助用户快速上手。

## 搭建

### 下载 Subconverter 后端

目前知名的后端项目主要包括以下三个:

1. **原版 Subconverter 项目**:(https://github.com/tindy2013/subconverter)
2. **支持 hysteria/hysteria2 协议的项目**:(https://github.com/lonelam/subconverter)
3. **Meta 团队开发的 Vmess/Vless 协议支持项目**:(https://github.com/MetaCubeX/subconverter)

以下以 (https://github.com/MetaCubeX/subconverter) 的 Linux AMD64 平台为例进行说明:

#### 1. 下载并解压

首先,查看当前目录:

```bash
pwd
```

接着,下载并解压文件:

```bash
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 文件

```bash
nano /etc/systemd/system/subconverter.service
```

#### 2. 编辑 Subconverter.service 文件内容

```bash

Description=A API For Subscription Convert
After=network.target


Type=simple
WorkingDirectory=/root/subconverter # 请将此路径修改为实际的工作目录
ExecStart=/root/subconverter/subconverter # 请将此路径修改为实际的可执行文件路径
Restart=always
RestartSec=10


WantedBy=multi-user.target
```

编辑完成后,使用快捷键 `Ctrl+O` 保存文件,然后按 `Ctrl+X` 退出编辑器。

### 管理 Subconverter.service

#### 1. 开机启动

```bash
systemctl enable subconverter
systemctl start subconverter
```

#### 2. 查看日志

```bash
journalctl -fu subconverter
```

#### 3. 重启

```bash
systemctl restart subconverter
```

实际上,到了这一步,Subconverter 后端就已经初步搭建完成了。你可以随意选择一个 Sub-web 前端网站,例如:(https://link.zhihu.com/?target==https%3A%2F%2Facl4ssr-sub.github.io%2F) 或 (https://link.zhihu.com/?target==https%3A%2F%2Fsub.ops.ci%2F),然后在“后端地址”或“后端服务”一栏中填入:`http://IP地址:25500/sub?`。这样,你就可以自定义 Subconverter,使其输出你所需的配置。

### 配置

尽管 Subconverter 的[官方文档](https://link.zhihu.com/?target==https%3A%2F%2Fgithub.com%2Ftindy2013%2Fsubconverter%2Fblob%2Fmaster%2FREADME-cn.md)详细列举了众多用法和配置文件说明,但我们只需重点关注以下三个文件:`pref.toml`、`config/远程配置.ini` 和 `base/all_base.tpl`。

### 基础配置 pref.toml

在 `` 字段中,请根据你的实际情况修改以下内容:

```bash

# 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` 的配置文件。

#### 配置文件

```ini


;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 官方项目 (https://github.com/MetaCubeX/meta-rules-dat) 的描述,其 geosite.dat、geosite.db、geosite-lite.dat 和 geosite-lite.db 等文件均源自 (https://github.com/blackmatrix7/ios_rule_script/tree/master/rule/Clash)。因此,在本配置文件中,我主要采用了 `ios_rule_script` 的规则,而在局域网和广告过滤等方面,则使用了更为精简的 `ACL4SSR` 规则。

##### ruleset

在 *.ini 配置文件中,Subconverter 会按照 `ruleset=` 从上到下的顺序生成规则。因此,像 `🔒 局域网`、`🛑 广告域名`、`🧲 BT Tracker` 这样的域名优先级较高,应置于最前面。而 `🇨🇳 大陆域名及IP` 和 `兜底策略` 优先级较低,应放在最后。

以下是每个 `ruleset=` 的简要说明:

- 🔒 局域网:本地/局域网地址,等同于 `GEOIP,LAN`
- 🧲 下载工具:常见下载软件的进程,但不包括 BitComet。
- 🚀 BT Tracker(合并到 🚀 节点选择):整合了 (https://trackerslist.com/#/zh?id=xiu2trackerslistcollection) 和 (https://github.com/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 在输出配置文件时所参考的基准文件。尽管[官方中文教程](https://link.zhihu.com/?target==https%3A%2F%2Fgithub.com%2Ftindy2013%2Fsubconverter%2Fblob%2Fmaster%2FREADME-cn.md)对该文件的具体使用方法介绍有限,但本文将重点探讨如何通过该文件修改“DNS解析方式”和“自定义GeoIP GeoSite MMDB”的设置。

#### 修改 DNS 字段

首先,搜索 `{% if request.target == "clash" or request.target == "clashr" %}`,删除从 `{% if request.target == "clash" or request.target == "clashr" %}` 到 `{% endif %}` 之间的内容,并将其替换为以下配置:

```tpl
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:
      override-destination: true
    TLS:
      ports:
    QUIC:
      ports:
```

- **`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。

```tpl
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"
```

这里采用 (https://github.com/MetaCubeX/meta-rules-dat) 作为规则数据源。你可以通过替换配置文件来自定义规则集。

### snippets

Sunconverter 的 emoji 配置文件位于 `snippets/emoji.toml` 和 `snippets/emoji.txt` 中,但默认提供的配置似乎存在一点问题。

emoji.toml:

```toml
[]
match = "(?i:\\bTW?\\b|Taiwan|新北|彰化|\\bCHT\\b|台湾|[^-]台|\\bHINET\\b)"
emoji = "🇹🇼"
```

emoji.txt:

```txt
(?i:\bTW?\b|Taiwan|新北|彰化|\bCHT\b|台湾|[^-]台|\bHINET\b),🇹🇼
```

### 重启

配置完成后重启 Subconverter。该服务会在 IP地址:25500 监听转换请求。

```bash
systemctl restart subconverter
```

## 转换

打开任意一个订阅转换网站,这里以 (https://acl4ssr-sub.github.io/) 为例。

- 远程配置:选择“不选,由接口提供方提供”
- 后端地址:填入 `http://IP地址:25500/sub?`。如果你开启了 API 模式并配置了 `api_access_token=`,则应填入 `http://IP地址:25500/sub?token=密码`

如果配置文件没有问题,就说明 Subconverter 后端已成功搭建。

## 反向代理

一般来说,即便使用了 API模式 并配置了Token,这种方法仍然存在安全隐患。为了提高安全性,可以配置Nginx并进行反向代理Sunconverter。

### 前提条件

1. 已购买域名,并将域名解析至服务器IP地址。
2. 已通过`certbot`为即将使用的域名申请SSL证书。

由于Nginx的安装与配置并非本文重点,因此仅提供站点配置文件供参考。

### 配置

新建一个站点配置文件 `sub.example.com`

```nginx
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;
    }

}
```

### 转换

重新打开任意一个订阅转换网站,这里以 (https://link.zhihu.com/?target==https%3A%2F%2Facl4ssr-sub.github.io%2F) 为例。

- 远程配置:选择“不选,由接口提供方提供”
- 后端地址:填入 `https://sub.example.com/sub?`。如果你开启了 API 模式并配置了 `api_access_token=`,则应填入 `https://sub.example.com/sub?token=密码`

如果配置文件没有问题,就说明 Subconverter 后端已成功搭建。
页: [1]
查看完整版本: 自行搭建 Subconverter 后端并自定义规则