Clash Verge 规则扩展
Erstellt am: 6. Februar 2025
Erstellt am: 6. Februar 2025
为我的clash verge写一个全局扩展脚本,实现以下功能:
1.过滤掉高倍率节点,正则:/(?:4-9?x)/i
2.默认使用clash verge自带的GEO DATA数据库,也可以使用外部的规则集
-2.1.对明确被墙的域名和IP直接走代理
-2.2.对明确国内的域名和IP直接走直连
3.可以通过填写自定义规则集进行指定直连或代理或拦截
4.针对ip138.com这个域名强制走代理
5.在5.6和自定义规则集都没有命中的情况下,走代理进行兜底
6.DNS优化
下面给出一个示例的「全局扩展脚本」思路,涵盖了题目所述的功能需求。需要注意的是,Clash Verge 本身是基于 Clash 内核的 GUI 管理器,但它也提供了一些自定义脚本/规则的功能。根据你的使用环境、Clash(或 Clash Premium)版本以及订阅配置方式,具体实现方式会略有差异。
以下示例包含了三个部分的要点:
通常我们会有两种方法去过滤节点里带有高倍率标识(形如 4x, 4.5x, 5x, 9x
等等)的节点:
方法 A:在 Clash Verge 的订阅管理中直接使用“正则过滤/重命名”功能
如果 Clash Verge 提供了“在导入订阅时根据正则表达式排除节点”之类的功能,可以在 GUI 中配置,正则写成:
/(?:[4-9](?:\.5)?x)/i
这样在获取订阅列表时,会自动排除名称中带有「4.5x」或「5x」等字样的节点,不会出现在最终的 Clash 配置里。
方法 B:使用 Clash Premium + External Script(或 Clash Verge 自带的扩展脚本功能)
如果需要更灵活的处理(如动态重命名、批量排除、按其他策略筛选等),可以写一个简单的处理脚本。思路如下(伪代码为示例,实际可根据你在 Clash Verge 中的脚本执行环境选用 JS/Node.js/Python 等):
js// pseudo-script.js module.exports.parse = (rawConfig) => { // rawConfig 通常是 Clash 订阅转换后生成的 YAML 字符串,你可以在这里做正则处理 // 1. 将 YAML 字符串解析为对象 const yaml = require('js-yaml'); let configObject = yaml.load(rawConfig); // 2. 遍历 proxies 节点,过滤掉包含高倍率标识的节点 if (configObject.proxies && Array.isArray(configObject.proxies)) { configObject.proxies = configObject.proxies.filter(proxy => { // 如果 proxy.name 中含有 /[4-9](?:\.5)?x/i 则排除 return !/(?:[4-9](?:\.5)?x)/i.test(proxy.name); }); } // 3. 重新生成 YAML 字符串 return yaml.dump(configObject); }
然后在 Clash Verge 的“扩展脚本”或“订阅前置脚本”中使用该脚本,以拦截并处理订阅配置。最终返回的配置就会自动排除掉高倍率节点。
如果仅仅是为了排除包含
4x, 5x, 9x
等字样的节点,方法 A(GUI 自带订阅过滤)更简单直观。
方法 B 适合需要更复杂逻辑时使用。
下面给出一个示例的 config.yaml
,演示如何按照你的需求编写规则。你可以将此文件导入到 Clash Verge 中,也可以把其中的 rule-providers 等引用放在本地或远程托管,然后在 Clash Verge 中加载。示例中主要关注功能逻辑,端口和其他与实际环境相关的值请根据需要自行修改。
yaml# config.yaml # --------------------- # 1) 基本信息 # --------------------- port: 7890 socks-port: 7891 redir-port: 7892 mixed-port: 0 allow-lan: false mode: rule # rule(规则模式)或 global(全局代理)等 log-level: info external-controller: 127.0.0.1:9090 # --------------------- # 2) DNS 配置 # --------------------- dns: enable: true ipv6: false # enhanced-mode: # fake-ip: 可以更好地解决某些域名解析问题,若有兼容问题可用 redir-host enhanced-mode: fake-ip listen: 0.0.0.0:53 # 防止 fake-ip 解析本地网络域名时出错,可用 fake-ip-filter 进行排除 fake-ip-filter: - '*.lan' - '*.local' - '*.home' - '*.internal' # 主 DNS nameserver: - 1.1.1.1 - 8.8.8.8 # 备用 DNS fallback: - 1.0.0.1 - 8.8.4.4 # fallback-filter 额外过滤配置 fallback-filter: geoip: true ipcidr: - 240.0.0.0/4 # --------------------- # 3) 节点 (proxies) 配置 # 如果你是订阅获取节点,那么这里可以留空或写一个示例 # 并用 script / Clash Verge 的过滤功能排除高倍率节点 # --------------------- proxies: - { name: "香港节点-1", type: ss, server: 1.2.3.4, port: 443, cipher: ... , password: "..." } - { name: "日本节点-2", type: vmess, server: 2.3.4.5, port: 443, uuid: "...", alterId: 0, cipher: auto } # ... # 这里如果有名字含有 "4x" 的高倍率节点,就可以被过滤脚本排除 # --------------------- # 4) 代理组 (proxy-groups) # 通过代理组,可以灵活控制规则走哪一组 # --------------------- proxy-groups: - name: "PROXY" type: select proxies: - "香港节点-1" - "日本节点-2" # 如果你还有其他没被过滤掉的节点,也可以一起放到这里 # 例如: "美国节点-3" 等 - name: "DIRECT" type: direct - name: "REJECT" type: reject # 需要一个“兜底”组(可以直接在 rules 用 "PROXY" 也行): - name: "DEFAULT-PROXY" type: select proxies: - "PROXY" - "DIRECT" # --------------------- # 5) 外部规则集 (rule-providers) # Clash Premium 或部分定制版本支持 rule-providers 进行远程规则管理。 # 你可自由选择维护自己的规则或使用第三方规则项目。 # --------------------- rule-providers: # 示例:GFWList GFWList: type: http behavior: classical path: ./rule-provider/gfw.txt url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt" interval: 86400 # 示例:CN(国内域名/IP) CN: type: http behavior: classical path: ./rule-provider/cn.txt url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt" interval: 86400 # 如果有自定义规则集,可以继续添加 # --------------------- # 6) 规则 (rules) # 1. 明确被墙的域名 / IP -> 代理 # 2. 明确国内的域名 / IP -> 直连 # 3. 自定义规则(可指定直连/代理/拦截) # 4. ip138.com 强制走代理 # 5. 全部都没匹配就走代理兜底 # --------------------- rules: # 6.1 自定义规则 # -- 如果有额外自定义 “直连/代理/拦截” 等需求,按照 Clash 规则语法写在这里 -- # 例如把某些站点指定走直连 # - DOMAIN-SUFFIX,example.cn,DIRECT # 例如把某些站点指定走代理 # - DOMAIN-SUFFIX,example.com,PROXY # 如果要拦截(比如广告): # - DOMAIN-KEYWORD,adservice,REJECT # 强制 ip138.com 走代理 - DOMAIN-SUFFIX,ip138.com,PROXY # 如果你想先加载 “被墙站点 -> 代理” 的 rule-provider - RULE-SET,GFWList,PROXY # 接着加载 “国内站点 -> 直连” 的 rule-provider - RULE-SET,CN,DIRECT # (可选)继续加载你的其他 rule-providers 或自定义规则 # 6.2 兜底策略 # 如果上面都没有匹配到,就走代理兜底 - MATCH,PROXY
要点:
- 第 2 步(DNS 配置)里使用了
enhanced-mode: fake-ip
,在部分情况下可以更好处理 DNS 污染、避免局域网冲突等问题;如果遇到兼容性问题,可改回redir-host
。- 第 3 步(proxies)通常由你的订阅来提供,**要做“高倍率节点过滤”**可以在这里结合「订阅脚本」或 Clash Verge 订阅 GUI 规则去排除。
- 第 6 步(rules)中的顺序很重要,Clash 的规则匹配是自上而下优先匹配,所以先自定义规则,再加载 GFWList/CN,最后
MATCH
兜底。- 如果你使用
rule-providers
远程更新,需要在 Clash 内核(Clash Premium)或 Clash Verge 的“更新规则集”按钮定期刷新它们。- “明确被墙的域名 / IP -> 代理” 可以依赖 GFWList 或其他维护良好的远程规则,能自动覆盖大多数境外站点。
- “明确国内的域名 / IP -> 直连” 依赖类似
direct.txt
、cn.txt
这类规则集或你自定义的 GEOIP CN / GEO-DATA 都可以实现。
enhanced-mode: fake-ip
并把 fallback-filter
设置为 geoip: true
,就可以让大部分大陆 IP 走本地 DNS,境外域名则自动走远端 DNS 来避免污染。fake-ip-filter
中排除这些域名。enhanced-mode: redir-host
+ nameserver-policy
做分流,但一般 fake-ip
足够且效果更好。过滤高倍率节点:
/(?:[4-9](?:\.5)?x)/i
直接排除,或规则部分:
rule-providers
加载 GFWList(被墙域名/IP -> PROXY),以及国内列表(国内域名/IP -> DIRECT)。rules:
中,也可以做成单独的 rule-provider 远程托管文件。ip138.com
强制代理。DNS 优化:
enhanced-mode: fake-ip
;fake-ip-filter
;将以上思路或示例配置整合到你的 Clash Verge 环境中即可实现题目所需功能。如果还有更多特殊需求(比如定时切换策略、更加复杂的节点分组规则、对代理节点自动健康检查等等),也可以基于此进一步扩展。祝你配置顺利!
直接给我提供脚本
下面给你一个示例脚本(以 JavaScript 为例),可直接用于 Clash Verge 的「订阅转换脚本」(Subscription Transform Script)或者类似的扩展脚本功能。脚本完成以下几件事:
/(?:[4-9](?:\.5)?x)/i
)ip138.com
强制走代理GEOIP,CN,DIRECT
)MATCH,PROXY
)fake-ip
、配置主备 DNS 等)提示:
- 以下脚本将会解析 Clash 订阅生成的 YAML,并进行二次修改;然后输出新的 YAML,再被 Clash 或 Clash Verge 使用。
- 你可以在脚本中根据自己需要,继续增强或调整规则,比如使用更多自定义的 rule-providers,或者设置更精细的规则顺序等。
- 如果你在 Clash Verge 的界面上已经对 DNS 或代理规则有其他配置,这里重复设置时,可能会相互覆盖或冲突,请酌情合并。
将以下脚本保存为 global-extend.js
(或其它你想要的名字),然后在 Clash Verge 的「订阅转换脚本/扩展脚本」中引用:
js/** * global-extend.js * * 主要功能: * 1. 过滤掉高倍率节点,正则:/(?:[4-9](?:\.5)?x)/i * 2. 使用 Clash Verge 内置或外部规则集:明确被墙 -> 代理、明确国内 -> 直连 * 3. 可添加自定义规则(此示例仅演示ip138.com -> 代理) * 4. ip138.com 强制走代理 * 5. 兜底走代理 * 6. DNS 优化 (fake-ip) * * 备注:请确认 Clash Verge 版本支持 "module.exports.parse" 格式的脚本。 */ module.exports.parse = (rawConfig, { yaml }) => { // 1. 解析原始 YAML 为 JS 对象 let config = yaml.parse(rawConfig) // 如果原 config 里没有一些字段,先做初始化,防止后面操作报错 if (!config.proxies) config.proxies = [] if (!config['proxy-groups']) config['proxy-groups'] = [] if (!config.rules) config.rules = [] // ---------------------------------------------------------------- // 1) 过滤掉高倍率节点 // ---------------------------------------------------------------- config.proxies = config.proxies.filter(proxy => { return !/(?:[4-9](?:\.5)?x)/i.test(proxy.name) }) // ---------------------------------------------------------------- // 2) 建立或修复常用代理组 // ---------------------------------------------------------------- // 找到或创建名为 "PROXY" 的代理组(type: select) let proxyGroup = config['proxy-groups'].find(g => g.name === 'PROXY') if (!proxyGroup) { proxyGroup = { name: 'PROXY', type: 'select', proxies: [] } config['proxy-groups'].push(proxyGroup) } // 收集现有的所有节点名称 const proxyNames = config.proxies.map(p => p.name) // 确保 "PROXY" 组内包含所有节点名称(去重) proxyGroup.proxies = Array.from(new Set([...proxyGroup.proxies, ...proxyNames])) // 建立或修复 DIRECT 组(type: direct) let directGroup = config['proxy-groups'].find(g => g.name === 'DIRECT') if (!directGroup) { directGroup = { name: 'DIRECT', type: 'direct' } config['proxy-groups'].push(directGroup) } // 建立或修复 REJECT 组(type: reject) let rejectGroup = config['proxy-groups'].find(g => g.name === 'REJECT') if (!rejectGroup) { rejectGroup = { name: 'REJECT', type: 'reject' } config['proxy-groups'].push(rejectGroup) } // ---------------------------------------------------------------- // 3) 规则处理:加入自定义规则 + 兜底策略 // ---------------------------------------------------------------- // 3.1 ip138.com 强制走代理 -> 插到规则最前面 // 如果你有更多自定义需求,可以在这里追加 config.rules.unshift('DOMAIN-SUFFIX,ip138.com,PROXY') // 3.2 对国内 IP / 域名走直连 (GEOIP,CN,DIRECT) // 如果你希望把它放在自定义规则之前,就把这行往上移 // 注意 Clash 规则是自上而下优先匹配 config.rules.unshift('GEOIP,CN,DIRECT') // 3.3 最后一条兜底规则:全部没匹配 -> 走代理 // 如果已经存在 MATCH 规则,可以先删掉,重新加一条 config.rules = config.rules.filter(r => !/^MATCH,/.test(r.trim().toUpperCase())) // 加上新的 MATCH 兜底 config.rules.push('MATCH,PROXY') // ---------------------------------------------------------------- // 4) DNS 优化(fake-ip 等) // ---------------------------------------------------------------- // 如果原配置没有 dns 字段,这里给一个默认示例 // 你可自行调整或删除以适配自身需求 if (!config.dns) { config.dns = { enable: true, ipv6: false, enhanced-mode: 'fake-ip', listen: '0.0.0.0:53', fake-ip-filter: [ '*.lan', '*.local', '*.home', '*.internal' ], nameserver: ['1.1.1.1', '8.8.8.8'], fallback: ['1.0.0.1', '8.8.4.4'], fallback-filter: { geoip: true, ipcidr: ['240.0.0.0/4'] } } } // ---------------------------------------------------------------- // 5) 生成新的 YAML 返回 // ---------------------------------------------------------------- return yaml.stringify(config) }
在 Clash Verge 中添加/编辑订阅
global-extend.js
复制到可以被 Clash Verge 读取到的目录,并在订阅中指定它。脚本生效流程
module.exports.parse(rawYAML)
;ip138.com => PROXY
, GEOIP,CN => DIRECT
, MATCH => PROXY
等规则,以及 DNS 配置。检查脚本是否生效
ip138.com
是否已设置为代理,GEOIP CN
是否为直连等。config.rules
进行插入或替换,也可以引入自己的 rule-providers
。enhanced-mode: redir-host
或对 nameserver 做进一步调整,只需在脚本里修改对应的 DNS 字段。dns
字段,则不覆盖。这样,你就可以在 Clash Verge 的订阅更新阶段,通过一个脚本实现节点过滤 + 分流规则 + DNS 优化的整体方案了。祝使用顺利!