使用 proxy-providers 解决 ClashX 的 DNS 默认开启的问题

问题

公司部分服务部署在本地主机(使用物理机虚拟),通过在公司网络软路由中配置 DNS(域名转发到指定 IP)的方式,使可通过域名访问服务。

我使用 ClashX,订阅服务提供商默认配置中默认开启 DNS,我会手动关闭其 DNS,让公司网络 DNS 可用。但订阅每次更新后,其配置会被还原,DNS 又会开启,导致本地服务不可用,此时只能手动改为 enable: false,比较烦人。

dns:
enable: false
ipv6: false
default-nameserver: xxx
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
use-hosts: true
nameserver: xxx
fallback: xxx
fallback-filter: xxx

一直想找一种一劳永逸的办法解决这个问题。我在 ClashX 的 Discussions 中看到一位大佬的解决方式,经过尝试,确实解决了我的这个问题。

解决方式

使用 ClashX Pro + proxy-providers,proxy-providers 是 Clash Premium提供的功能,可使用 proxy-providers 功能直接配置订阅地址,「外面」的配置将覆盖订阅的配置,这样订阅地址的 DNS 就不会生效了。Clash Premium 是一个闭源的、有更多功能、但不收费的 Clash 分支,为了防止不当使用。ClashX Pro 是基于 Clash Premium 实现,ClashX Pro 下载比较隐蔽,在 README.md 中以下位置。

Download ClashX Pro With enhanced mode and Native Apple Silicon support at AppCenter for free permanently.

我的 ClashX Pro 配置文件格式:

## all.yml

port: 7890
socks-port: 7891

# Linux 和 macOS 的 redir 代理端口
redir-port: 7892

# 允许局域网的连接
allow-lan: false

# 默认规则模式:Rule(规则) / Global(全局代理)/ Direct(全局直连)
mode: rule

# 设置日志输出级别 (默认级别:silent,即不输出任何内容,以避免因日志内容过大而导致程序内存溢出)。
# 5 个级别:silent / info / warning / error / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启
log-level: info

# Clash 的 RESTful API
external-controller: '0.0.0.0:9090'

proxy-providers:
baobei: # provider 的名称,下面会用到
type: http
path: ./baobei.yaml # 订阅地址的配置文件
url: https://xxx&flag=clash # 你的订阅地址
interval: 172800 # 每 48 小时更新一次订阅
health-check:
enable: true # 是否自动进行 latency-test
interval: 3600
lazy: true
url: http://www.gstatic.com/generate_204
pqjc: # 我们可以同时使用多个订阅链接获取多个 proxies
type: http
path: ./pqjc.yaml
url: https://xxx&flag=clash # 你的订阅地址
interval: 172800
health-check:
enable: true
interval: 3600
lazy: true
url: http://www.gstatic.com/generate_204

# 当「Proxy Mode」使用 "PROXY" 时,它会使用 "baobei" 和 "pqjc" 两个规则组中的代理,并且如果这些代理都不可用,则使用 "DIRECT" 直连代理。
proxy-groups:
- name: PROXY
type: select
use: # 使用上面配置的订阅
- baobei
- pqjc
proxies: # 当节点不可用时,使用 DIRECT
- DIRECT


rule-providers:
reject:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
path: ./ruleset/reject.yaml # 链接地址会下载为 ./ruleset/reject.yaml
interval: 86400

icloud:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt"
path: ./ruleset/icloud.yaml
interval: 86400

apple:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt"
path: ./ruleset/apple.yaml
interval: 86400

google:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt"
path: ./ruleset/google.yaml
interval: 86400

proxy:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt"
path: ./ruleset/proxy.yaml
interval: 86400

direct:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt"
path: ./ruleset/direct.yaml
interval: 86400

private:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt"
path: ./ruleset/private.yaml
interval: 86400

gfw:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt"
path: ./ruleset/gfw.yaml
interval: 86400

greatfire:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt"
path: ./ruleset/greatfire.yaml
interval: 86400

tld-not-cn:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt"
path: ./ruleset/tld-not-cn.yaml
interval: 86400

telegramcidr:
type: http
behavior: ipcidr
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt"
path: ./ruleset/telegramcidr.yaml
interval: 86400

cncidr:
type: http
behavior: ipcidr
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt"
path: ./ruleset/cncidr.yaml
interval: 86400

lancidr:
type: http
behavior: ipcidr
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt"
path: ./ruleset/lancidr.yaml
interval: 86400

applications:
type: http
behavior: classical
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt"
path: ./ruleset/applications.yaml
interval: 86400

rules:
- 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,DIRECT
- 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

遇到的问题

1、错误提示:error: unsupported rule type RULE-SET

2、错误提示:read tcp4 ip1:65461->ip2:443: read: connection reset by peer

  • 原因:没有使用最新的订阅地址
  • 解决方式:使用最新订阅地址

3、错误提示:initial proxy provider pqjc error: yaml: unmarshal errors: line 1: cannot unmarshal !!str dHJvamF... into provider.ProxySchema

  • 原因:因订阅地址后面 token 一般使用 BASE64 编码,Clash 无法识别
  • 解决方式:订阅地址加 &flag=clash,示例:https://g.bbydy.org/api/v1/client/subscribe?token=82ec76201538xxx0f1a587f2f7c3&flag=clash
Depp Wang wechat
个人公众号