再开始阅读本篇文章之前,强烈建议各位同学优先看这篇文章:Mihomo 配置:自用配置文件与思路分享 再观看以下内容,理解起来可能更为顺畅!
1. 缘起 #
大部分同学接触 Clash 都是从客户端开始的,比如 Clash for Windows。发展至今,几乎所有主流客户端都支持了 覆写脚本/扩展脚本 功能,例如 Clash Party、Sparkle、FLClash、Clash Verge Rev 等,这也给了我们更多自定义的空间。
本文分享一下我的覆写思路与脚本,跟上篇一样,不想看碎碎念的可以直接去仓库取用:
- 仓库:https://github.com/yyhhyyyyyy/selfproxy
- 覆写/扩展脚本:https://github.com/yyhhyyyyyy/selfproxy/blob/main/Mihomo/Extension_Script/script.js
接下来分三个部分讲解:覆写内容、Mihomo Party 覆写、Clash Verge Rev 扩展脚本
⚠️ 我主要使用的是布丁狗还在担任 core dev 时期的 Mihomo Party,Sparkle 只短暂体验过,因此文中统一以 Mihomo Party 为例进行说明,同样适用于上述其他客户端。
2.覆写内容 #
2.1 覆写规则 #
规则是 Mihomo 中最核心的部分,所以放在最前面讲。
我的整体规则组成很简单 ,大体分成两个部分且请遵循我写的先后顺序:nonip(非ip类)>ip(ip类) 原因请看 Mihomo 分流规则配置
nonip
customRules>nonipRules最早,我支持在 rules 里补充去广告规则的,但随着使用加深,总会带来一些体验上的不便,因此不再主张在 rules 中补充去广告规则。
整体顺序是:先放自定义规则集(
customRules,用于保证特定规则的优先级,nonip 和 ip 类都可以放),再放非 ip 类规则集即可。ip
直接放入
ipRules即可最后的顺序也就是
customRules>nonipRules>ipRules
// 覆写规则
function overwriteRules(params) {
const customRules = [
// 在此添加自定义规则,比如对于百度这个域名使用直连:
// "DOMAIN,baidu.com,DIRECT",
]
const nonipRules = [
'RULE-SET,cdn_domainset,🎯 节点选择',
// ... 此处省略更多非 IP 规则项,具体请到仓库查看覆写脚本
]
const allNonipRules = [
...customRules,
...nonipRules
]
const ipRules = [
// 依据 ip 类规则顺序添加即可,具体请到仓库查看覆写脚本
]
const rules = [
// 非ip类规则
...allNonipRules,
// ip类规则
...ipRules
]
}2.2 覆写代理组 #
思路如下:
写好
包含正则以及排除正则两者合并构造总的国家正则写个找正则的函数
function getProxiesByRegex(params, regex) { const matchedProxies = params.proxies.filter (e => regex.test (e.name)).map (e => e.name) return matchedProxies.length > 0 ? matchedProxies : ['COMPATIBLE'] }生成自动选择代理组
const autoProxyGroups = autoProxyGroupRegexs .map (item => ({ name: item.name, type: 'url-test', url: 'https://cp.cloudflare.com', interval: 300, tolerance: 50, proxies: getProxiesByRegex (params, item.regex), hidden: true, })) .filter (item => item.proxies.length > 0)手动选择代理组类似,不过这边加入了图标icon,以显示的更佳美观~具体请看仓库,代码其实差不多
划分不同的代理组
贴个最后出来的效果图:
mihomo party:
clash verge rev:
2.3 覆写DNS #
DNS老生长谈了,这边就带过吧,如果还有疑问,可以看上篇文章 Mihomo自用配置
再简单说下我的观点,还是依旧,如果网络环境文明,那么直接使用运营商提供的DNS,如果网络环境不文明再用公共DNS。这边每个人都有每个人的见解,按照你自己的习惯想法来吧,我只不过是赞同我所理解的观点。
配置如下:
// 覆写DNS
function overwriteDns(params) {
const dnsList = [
'https://223.5.5.5/dns-query',
'https://doh.pub/dns-query',
]
const proxyDnsList = [
'https://223.5.5.5/dns-query',
'https://doh.pub/dns-query',
]
const dnsOptions = {
'enable': true,
'ipv6': false,
'prefer-h3': true, // 如果 DNS 服务器支持 DoH3 会优先使用 h3
'respect-rules': true, // 仅对符合规则的请求使用 DNS
'enhanced-mode': 'fake-ip', // 伪装 IP
'fake-ip-range': '28.0.0.1/8',
'nameserver': dnsList, // 其他网络请求都归他管
'proxy-server-nameserver': proxyDnsList, // 代理服务器的 DNS
}
params.dns = { ...dnsOptions }
}还需要补充一下其中的 fake-ip-filter
这个我留个坑,后面有空写个action自动同步上游的fake-ip-filter 然后更新整份覆写脚本
目前就先硬编码写死 具体看仓库
2.4 覆写基本配置项 #
这边就没啥好讲的了直接贴上来吧
// 覆写Basic Options
function overwriteBasicOptions(params) {
const otherOptions = {
'mixed-port': 7890,
'allow-lan': true,
'unified-delay': true,
'tcp-concurrent': true,
'find-process-mode': 'strict',
'global-client-fingerprint': 'chrome',
'profile': {
'store-selected': true,
'store-fake-ip': true,
},
'ipv6': false,
'mode': 'rule',
'log-level': 'warning',
'udp': true,
'sniffer': {
'enable': true,
'sniff': {
HTTP: {
'ports': [80, '8080-8880'],
'override-destination': true,
},
TLS: {
ports: [443, 8443],
},
QUIC: {
ports: [443, 8443],
},
},
'skip-domain': ['Mijia Cloud', '+.push.apple.com']
},
}
Object.keys (otherOptions).forEach ((key) => {
params[key] = otherOptions[key]
})
}这部份就是覆写的内容咯,具体脚本还是建议去我仓库看看,接下来就是如何在mihomo party上使用了。
2.5 覆写Tunnel #
我个人还是比较推崇Tunnel模式的,也建议大伙使用Tunnel模式,比系统代理香不少~
还是老生长谈,stack的选择请看这边文章tunnel stack如何选择 不想看也没事 结论就是 一个个测试过去 测试顺序 system>mixed>gvisor 哪个最先能用 用哪个。
// 覆写Tunnel
function overwriteTunnel (params) {
const tunnelOptions = {
enable: true,
stack: "system",
device: "tun0",
"dns-hijack": ["any:53", "tcp://any:53"],
"auto-route": true,
"auto-detect-interface": true,
"strict-route": true,
};
params.tun = { ...tunnelOptions };
}PS:Tunnel目前在mihomo party中没法覆写,只能通过GUI面板配置,留个占位坑,后续如果可以覆写了,直接用就行
但是在clash verge rev中是可以使用的
2.6 覆写FakeIpFilter #
这部分就是对这些地址,不使用fakeip的解析方式,而直接使用realip进行解析。
该部分已经实现了github action的自动更新上游的方式。具体是搭配仓库内的python脚本。有兴趣的同学可以去仓库里看看。
// 覆写DNS.Fake IP Filter
function overwriteFakeIpFilter(params) {
const fakeIpFilter = [
// 具体有哪些地址,请看上游,或者去仓库直接copy脚本使用即可
]
params.dns['fake-ip-filter'] = fakeIpFilter
}2.7 覆写NameserverPolicy #
实际上就是DNS分流,通俗易懂一些,你是阿里的域名,我就用阿里的DNS服务器解析自家的域名,这样更友好。
// 覆写DNS.Nameserver Policy
function overwriteNameserverPolicy(params) {
const nameserverPolicy = {
// 很多,具体映射看仓库脚本
}
params.dns['nameserver-policy'] = nameserverPolicy
}2.8 覆写hosts #
搭配上面的覆写NameserverPolicy。
// 覆写hosts
function overwriteHosts(params) {
const hosts = {
'dns.alidns.com': ['223.5.5.5', '223.6.6.6', '2400:3200:baba::1', '2400:3200::1'],
'doh.pub': ['120.53.53.53', '1.12.12.12'],
'localhost': ['127.0.0.1']
}
params.hosts = hosts
}3. Mihomo Party 覆写 #
3.0 基本设置 #
请先参考我的设置页进行一次基础设置,否则可能覆写脚本不一定完全生效!




3.1 Sub-Store订阅节点 #
mihomo party很好的其中一个点就是在集成了 sub-store 这是非常好用的工具,我在surge上也是必装的, 怎么添加节点具体看接下来的图



如果有多个节点一个个添加单条订阅进来就行。
因为我有多节点,所以我会用到组合订阅,组合订阅请继续看

3.2 导入覆写 #
- 如果能与github连通,那么可以使用远程导入

- 如果不能连通,就直接本地导入


把仓库里的脚本全部复制进来就行
3.3 订阅管理 #



选择刚刚导入或者新建的覆写文件,然后保存即可。
3.4 补充Tunnel面板设置 #
可以参照我的设置打开开关以及填写内容即可
4. Clash Verge Rev 扩展脚本 #
4.1 订阅 #
把订阅链接放进来就行,点击下导入 
如果有自己的本地yaml配置文件,新建个本地配置即可

4.2 编辑全局扩展脚本 #


从仓库中复制脚本进来就行。
4.3 开启Tunnel即可 #
我自己是常用Tunnel,可根据自己需求而来

5. 交流 #
TG: Channel