全平台统一代理——Clash

subconverter合并多个订阅及自定义规则和策略组以及配置多个平台的客户端

代理软件的使用历程

  • 使用赛风 VPN
    • 听人提及到 SSR ,转用 SSR
  • 每个设备分别使用 SSR
    • 由于 SSR 封锁严重,跟随购买的机场换为 V2ray
  • 每个设备分别使用 V2ray
    • 困扰于每个平台都要运行代理软件 + V2ray 客户端不怎么好使+ Linux 运行代理程序需要命令行+手中刚好有树莓派,决定换用 Openwrt
  • Openwrt 单臂路由 + SSRPlus
    • 因为是单臂路由,有的设备不能自定义网关 + SSRPlus 自定义程度不够+ PassWall 莫名其妙的不能用+住校+主流机场换用了 Clash ,决定每个平台分别使用 Clash
  • 决定全平台使用 Clash

Subconverter 的调教过程

虽然用了 Clash ,但机场提供的配置方案不是很符合个人需求(而且主用的机场没有 ipv6 的配置),且手中有多个机场(主用机场 + 便宜的备用机场 + 按流量付费,使用特殊节点的机场),于是使用了 subconverter 来制作 Clash 配置文件。

目的

  1. 多个 机场的订阅合并为一个
  2. 国内直连( ipv4 + ipv6 ),游戏平台自选直连和代理,哔哩哔哩自选直连和代理, Netflix 自选直连和代理,其他国外一律代理
  3. 有一个单独的文件用以手动添加一些直连的域名(用于 DDNS NAS 的域名)
  4. 使用 Doh 进行域名解析

配置

以默认为主,修改部分条目

/pref.ini
添加多条机场订阅并设置API密钥

[common]
  api_mode=true
  api_access_token=API密钥 
  default_url=机场订阅地址1|机场订阅地址2|机场订阅地址3
  enable_insert=false
  insert_url=如果需要在上面几个订阅地址外额外添加节点,可以将enable_insert设置为true并把配置地址放在这里,同样以“|”分隔

从 url 获取规则片段,并分成几个策略组
这里需要注意的是:
因为clash匹配规则是自上而下匹配,当匹配上一条规则后,后面的规则就不再进行匹配了,所以需要将一些匹配范围小的放在上面,匹配范围大的放在下面
曾经犯的错误:仅有部分节点可以使用22端口(平时是专门用一个节点代理ssh流量的),而匹配22端口的“SSHRules.list”放在了“已墙域名”(已墙域名里面有 Github 的域名)的后面,导致了无法通过ssh连接上 Github 。

[rulesets]
    ruleset=DIRECT,rules/DirectDomain.list
    ;DirectDomain.list  手动添加的直连域名


    ruleset=Proxy,rules/ProxyDomain.list
    ;ProxyDomain.list  手动添加的代理域名

    ruleset=拦截,https://github.com/ACL4SSR/ACL4SSR/raw/master/Clash/BanAD.list,86400
    ruleset=拦截,https://github.com/ACL4SSR/ACL4SSR/raw/master/Clash/BanProgramAD.list,86400
    ;广告域名

    ruleset=DIRECT,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list,86400
    ;直连域名

    ruleset=DIRECT,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/LocalAreaNetwork.list,86400
    ;局域网IP段

    ruleset=DIRECT,https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/ChinaIPs/ChinaIPs.list,86400
    ruleset=DIRECT,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaIp.list,86400
    ruleset=DIRECT,[]GEOIP,CN
    ;中国IP段

    ruleset=SSH,rules/SSHRules.list
    ;针对22端口的分流

    ruleset=Bilibili,https://github.com/ACL4SSR/ACL4SSR/raw/master/Clash/Ruleset/Bilibili.list,86400
    ;Bilibili域名
    ruleset=Netflix,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Netflix.list,86400
    ;Netflix域名 IP段
    ruleset=OpenAI,https://github.com/blackmatrix7/ios_rule_script/raw/master/rule/Clash/OpenAI/OpenAI.list,86400
    ;openai域名
    ruleset=微软服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Microsoft.list,86400
    ;微软服务
    ruleset=PT Trackers,https://github.com/ACL4SSR/ACL4SSR/raw/master/Clash/Ruleset/PrivateTracker.list,86400
    ;PT Trackers
    ruleset=Game,https://github.com/blackmatrix7/ios_rule_script/raw/master/rule/Clash/Steam/Steam.list,86400
    ;steam域名
    ruleset=Game,https://github.com/blackmatrix7/ios_rule_script/raw/master/rule/Clash/Epic/Epic.list,86400
    ;epic域名
    ruleset=Game,https://github.com/blackmatrix7/ios_rule_script/raw/master/rule/Clash/Xbox/Xbox.list,86400
    ;Xbox域名
    ruleset=Game,https://github.com/blackmatrix7/ios_rule_script/raw/master/rule/Clash/EA/EA.list,86400
    ;EA域名


    ruleset=Proxy,https://github.com/ACL4SSR/ACL4SSR/raw/master/Clash/ProxyGFWlist.list,86400
    ;已墙域名

    ruleset=Proxy,[]FINAL

为策略组添加节点

[proxy_groups]
    custom_proxy_group=Proxy`select`.*
    custom_proxy_group=SSH`select`[]DIRECT`[]Proxy`.*
    custom_proxy_group=Game`select`[]DIRECT`[]Proxy`.*
    custom_proxy_group=微软服务`select`.*
    custom_proxy_group=PT Trackers`select`[]DIRECT`[]Proxy`.*
    custom_proxy_group=Bilibili`select`[]DIRECT`[]Proxy`.*
    custom_proxy_group=OpenAI`select`[]DIRECT`[]Proxy`.*
    custom_proxy_group=Netflix`select`[]Proxy`.*
    custom_proxy_group=拦截`select`[]REJECT`[]DIRECT`[]Proxy

/base/all_base.tpl

{% if request.target == "clash" or request.target == "clashr" %}
    dns:
        enable: true
        ipv6: false
        listen: 0.0.0.0:53
        enhanced-mode: fake-ip
        fake-ip-range: 198.18.0.1/16
        fake-ip-filter:
            - '*.lan'
            - 'localhost.ptlogin2.qq.com'
            - 'dns.msftncsi.com'
            - 'www.msftncsi.com'
            - 'www.msftconnecttest.com'
        nameserver:
            - https://223.5.5.5/dns-query
        fallback:
            - https://223.5.5.5/dns-query
        fallback-filter:
            geoip: true
            ipcidr:
            - 240.0.0.0/4

最后将其部署在了服务器上,并用 Nginx 配置了反向代理和 SSL 加密,得益于 Clash 的在多个平台上都有其客户端,将每个客户端的订阅地址修改为 subconverter 提供的配置文件地址,就可以实现了全平台的代理统一
使用 docker 部署,避免subconverter 的漏洞

可用于 subconverter 的规则片段

Linux 平台的调教过程

系统为 Debian 12,X86架构

因为我的主力机是 Windows,Linux主要是作为服务器使用,故而并没有安装图形化桌面,使用的是命令行,所以这部分教程也会是命令行的版本
首先,下载Clash Meta 核心,并解压

参考命令,文件名要根据实际替换

wget https://github.com/MetaCubeX/mihomo/releases/download/v1.18.3/mihomo-linux-amd64-v1.18.3.gz && gunzip mihomo-linux-amd64-v1.18.3.gz
chmod +x mihomo-linux-amd64-v1.18.3

写这一部分的时间是2024-04-10,已经经历过了Clash生态的全面封杀,原本的Clash内核已经不再更新了,所以这里选择了Clash Meta内核

接下来,下载Country.mmdb ,并放到mihomo-linux-amd64的同一目录下
然后下载配置文件

wget https://域名或IP:端口/sub?target=clash&token=API密钥

最后,就可以启动了

./mihomo-linux-amd64-v1.18.3 -d ./

到了这一步就可以正常使用了,默认的端口应该是7890(央视,7890.jpg)
可以到其他程序中指定,也可以使用命令设置环境变量

export https_proxy="http://127.0.0.1:7890"
export http_proxy="http://127.0.0.1:7890"

将Clash Meta设置为服务,并开机自启

参考下面的配置文件在 /etc/systemd/system 创建文件
clash_meta.service

[Unit]
Description=Clash_Meta
After=network.target

[Service]
Type=simple
Restart=always
ExecStart=/home/debian/clash_meta/mihomo-linux-amd64-v1.18.3 -d /home/debian/clash_meta
User=debian

[Install]
WantedBy=multi-user.target

重载并启动

sudo systemctl daemon-reload
sudo systemctl start clash_meta
sudo systemctl enable clash_meta # 开机自启

自动更新配置文件

脚本

随便找个地方,放更新脚本(这里是和mihomo-linux-amd64-v1.18.3放在了一起
update_config.sh

#!/bin/bash
cd /home/debian/clash_meta
mv config.yaml config.yaml.back # 备份原有的配置文件
wget "https://域名或IP:端口/sub?target=clash&token=API密钥" -O config.yaml # 下载新的配置文件
sudo systemctl restart clash_meta.service # 重启 Clash Meta

设置执行权限

chmod +x update_config.sh

添加定时任务

使用命令编辑定时任务

crontab -e

在最后面新加一行

0 3 * * *   "/home/debian/clash_meta/update_config.sh" > /dev/null

其中前面的时间格式为 m h dom mon dow 即 分,时,日,月,周(可以参考Wiki

像上面的写法,就是每天的凌晨三点会执行一次(最好是选在没有人用的凌晨执行,毕竟需要重启Clash)


参考文章


最后修改于 2022-12-22