Clash Verge Rev 自定义直连规则与全局扩展脚本
Clash Verge Rev 自定义直连规则与全局扩展脚本
本文基于 macOS 上的 Clash Verge Rev 2.5.1 实测整理。不同版本的界面名称和覆写实现可能不同,最终应以“运行时配置”和连接日志为准。
一、快速结论
当某个网站或应用在 Clash 的“直连模式”下能访问,但在“规则模式”下不能访问时,通常需要给它添加一条优先级足够高的 DIRECT 规则。
如果只使用一个订阅,可以在该订阅的“编辑规则”中添加前置规则。
如果经常切换、刷新多个订阅,推荐使用“全局扩展脚本”,直接把自定义规则插入最终的 config.rules:
const directRules = [
"DOMAIN-SUFFIX,deepseek.com,DIRECT",
"PROCESS-NAME,Quark,DIRECT",
"PROCESS-NAME,Quark Helper,DIRECT",
];
function main(config) {
config.rules = Array.from(
new Set(directRules.concat(config.rules || []))
);
return config;
}保存脚本后,点击“重新激活订阅”。
二、理解规则模式和 DIRECT
Clash 的规则从上到下匹配,第一条命中的规则决定连接策略。
例如:
rules:
- DOMAIN-SUFFIX,deepseek.com,DIRECT
- DOMAIN-SUFFIX,google.com,谷歌服务
- MATCH,节点选择访问 api.deepseek.com 时:
- 命中
DOMAIN-SUFFIX,deepseek.com,DIRECT。 - Clash 不再继续检查后面的规则。
- 连接仍经过 Clash 接管,但出口策略为直接连接,不经过代理节点。
注意:DIRECT 不等于“完全绕过 Clash”。在 TUN 模式下,DNS 解析和连接仍可能由 Mihomo 接管,只是最终出站方式为直连。
三、常用规则类型
1. 精确域名
只放行一个完整域名:
DOMAIN,api.deepseek.com,DIRECT它只匹配 api.deepseek.com,不匹配 www.deepseek.com。
2. 域名后缀
放行一个域名及其全部子域名:
DOMAIN-SUFFIX,deepseek.com,DIRECT它可以匹配:
deepseek.com
api.deepseek.com
www.deepseek.com这是最常用的域名放行方式。
3. 域名关键字
只要域名中包含指定文字就匹配:
DOMAIN-KEYWORD,deepseek,DIRECT这种写法范围较大,容易误匹配,通常优先使用 DOMAIN-SUFFIX。
4. 应用进程
让某个应用的连接全部直连:
PROCESS-NAME,Quark,DIRECT
PROCESS-NAME,Quark Helper,DIRECT适合以下情况:
- 应用会访问许多不同厂商的域名。
- 主域名已经直连,但应用仍不能正常工作。
- 应用包含多个辅助进程,例如 Chromium/Electron 的 Helper 进程。
进程名称必须和 Mihomo 日志中显示的名称一致。
四、全局扩展覆写配置
1. 它是什么
“全局扩展覆写配置”使用 YAML,以声明式方式把字段合并到订阅配置。
它适合修改标准配置字段,例如:
dns:
enable: true
ipv6: false
log-level: info这类字段可以按照 YAML 对象结构直接覆盖或补充。
2. 理想情况下添加规则
部分 Clash Verge Rev 版本支持类似下面的扩展字段:
prepend-rules:
- DOMAIN-SUFFIX,deepseek.com,DIRECT
- DOMAIN-SUFFIX,qianwen.com,DIRECT它的设计意图是把规则插到订阅原有 rules: 的前面。
3. 为什么本机 2.5.1 中没有生效
在本机 Clash Verge Rev 2.5.1 的实际测试中,prepend-rules 虽然进入了生成文件,但只是作为一个独立的顶层字段存在:
prepend-rules:
- DOMAIN-SUFFIX,deepseek.com,DIRECT
rules:
- DOMAIN-SUFFIX,feishu.cn,DIRECT
# 订阅原有规则……它没有被转换并插入真正的 rules: 数组。
Mihomo 核心进行流量匹配时读取的是 rules:,不会把一个残留的 prepend-rules: 字段自动当作规则执行。因此日志仍然显示:
api.deepseek.com match Match using 节点选择这说明:
- YAML 语法正确,不代表规则已经生效。
- 在生成配置中看见
prepend-rules,也不代表它已经进入 Mihomo 的规则列表。 - 必须检查最终的
rules:和实际连接日志。
这是本机版本的实际行为,不应推断为所有 Clash Verge Rev 版本都不支持 prepend-rules。
五、全局扩展脚本
1. 它是什么
“全局扩展脚本”使用 JavaScript。Clash Verge Rev 会把订阅配置解析成一个 JavaScript 对象,传给 main(config)。
脚本可以直接读取和修改这个对象,最后返回修改后的配置:
function main(config) {
// 修改 config
return config;
}2. 为什么脚本可以生效
脚本不是声明一个“希望客户端以后处理”的 prepend-rules 字段,而是直接修改最终配置对象中的真实规则数组:
config.rules例如:
config.rules = [
"DOMAIN-SUFFIX,deepseek.com,DIRECT",
...(config.rules || []),
];脚本运行后,生成的最终配置会直接变成:
rules:
- DOMAIN-SUFFIX,deepseek.com,DIRECT
- DOMAIN-SUFFIX,feishu.cn,DIRECT
# 订阅原有规则……Mihomo 能直接读取并执行这条规则,因此它比依赖特殊合并字段更明确、更容易验证。
3. 推荐的可维护模板
const directRules = [
// 域名放行
"DOMAIN-SUFFIX,deepseek.com,DIRECT",
"DOMAIN-SUFFIX,qianwen.com,DIRECT",
// 应用放行
"PROCESS-NAME,Quark,DIRECT",
"PROCESS-NAME,Quark Helper,DIRECT",
];
function unique(items) {
return Array.from(new Set((items || []).filter(Boolean)));
}
function main(config) {
// 自定义规则必须放在订阅规则前面,否则可能先被 MATCH 等规则截获。
config.rules = unique(directRules.concat(config.rules || []));
return config;
}以后需要增加域名,只需在 directRules 中增加一行:
"DOMAIN-SUFFIX,example.com,DIRECT",Set 用于去重,避免脚本或订阅中已有相同规则时产生重复项。
六、全局覆写和全局脚本的区别
| 对比项 | 全局扩展覆写配置 | 全局扩展脚本 |
|---|---|---|
| 格式 | YAML | JavaScript |
| 主要用途 | 覆盖或补充普通配置字段 | 动态修改整个配置对象 |
| 修改规则 | 依赖客户端是否处理 prepend-rules 等扩展字段 | 直接修改真实的 config.rules |
| 条件逻辑 | 较弱 | 可判断、循环、去重、按订阅名处理 |
| 可调试性 | 需要检查合并后的 YAML | 可检查脚本返回后的运行配置 |
| 复杂度 | 简单 | 稍高 |
| 本机 2.5.1 实测 | prepend-rules 未可靠合并 | 直接修改 config.rules 可以生效 |
建议:
- 修改
dns、ipv6、日志级别等普通字段,可以使用全局扩展覆写配置。 - 添加需要长期保留的前置规则,优先使用全局扩展脚本。
- 只对一个订阅临时添加规则,可以使用订阅卡片的“编辑规则”。
七、DeepSeek 放行示例
添加:
"DOMAIN-SUFFIX,deepseek.com,DIRECT",完整脚本:
function main(config) {
const rule = "DOMAIN-SUFFIX,deepseek.com,DIRECT";
config.rules = config.rules || [];
if (!config.rules.includes(rule)) {
config.rules.unshift(rule);
}
return config;
}正确日志应类似:
api.deepseek.com:443 match DomainSuffix(deepseek.com) using DIRECT请求 /models 时,如果返回 HTTP 401,通常说明网络已经连通,只是请求没有携带有效 API Key。
八、夸克放行示例
仅添加:
DOMAIN-SUFFIX,quark.cn,DIRECT不一定能完全模拟“直连模式”,因为夸克除了访问 *.quark.cn,还可能访问:
qianwen.comaliyuncs.comalicdn.comtaobao.comgoogleapis.comgoogle.com- 其他动态依赖域名
如果截图或日志已经显示 *.quark.cn 为 DIRECT,但应用仍异常,说明问题不再是 quark.cn 这一组域名。
更稳妥的方法是按应用进程直连:
const directRules = [
"PROCESS-NAME,Quark,DIRECT",
"PROCESS-NAME,Quark Helper,DIRECT",
];
function main(config) {
config.rules = Array.from(
new Set(directRules.concat(config.rules || []))
);
return config;
}应用通常需要彻底退出后重新打开,使旧连接被关闭并重新匹配规则。
九、保存后的正确操作
修改全局扩展脚本后:
- 点击脚本窗口中的“保存”。
- 回到“订阅”页面。
- 点击“重新激活订阅”。
- 对于按进程匹配的规则,彻底退出并重新打开目标应用。
- 在“日志”或“连接”页面验证新连接。
不要只看规则编辑窗口中的内容。判断是否生效,以运行时配置和连接日志为准。
十、如何验证规则是否真正生效
方法一:查看 Clash 日志
成功直连:
api.deepseek.com:443 match DomainSuffix(deepseek.com) using DIRECT规则没有命中:
api.deepseek.com:443 match Match using 节点选择[日本节点]这两行中最重要的是:
match后面显示命中了哪一类规则。using后面显示最终使用了哪个策略。
方法二:查看运行时订阅
在订阅页面打开“查看运行时订阅”,搜索目标域名。
必须确认规则出现在真正的 rules: 数组中,而且位置在 MATCH、FINAL 或其他兜底规则之前:
rules:
- DOMAIN-SUFFIX,deepseek.com,DIRECT
# 其他规则……
- MATCH,节点选择方法三:检查连接页面
连接页面显示 DIRECT,说明这条连接当前采用直连出口。
但如果应用仍然不能使用,需要继续检查同一应用的其他连接,不能只看某一个主域名。
十一、常见错误
1. 把 prepend-rules 写进 dns: 内
错误:
dns:
enable: true
prepend-rules:
- DOMAIN-SUFFIX,deepseek.com,DIRECTprepend-rules 不是 DNS 配置项,这样写不会成为流量规则。
2. 规则放在 MATCH 后面
错误:
rules:
- MATCH,节点选择
- DOMAIN-SUFFIX,deepseek.com,DIRECT由于 MATCH 已经匹配所有剩余连接,后面的规则永远不会执行。
3. 修改后没有重新激活订阅
保存扩展配置或脚本,并不一定会立即重建运行配置。应主动点击“重新激活订阅”。
4. 只放行主域名
一个应用可能依赖登录、鉴权、CDN、同步、更新和安全检查等多个域名。
遇到这种情况,应查看该应用进程的全部连接,或者改用 PROCESS-NAME。
5. 使用错误的进程名
应用显示名称不一定等于进程名称。应以 Clash 日志括号中的名称为准:
(Quark)
(Quark Helper)6. 用 curl 的目标 IP 判断是否直连
使用本地 HTTP 代理时,curl 显示的远端地址可能只是 127.0.0.1。TUN 和 Fake-IP 模式下还可能看到 198.18.x.x。
这些地址不能直接证明最终出口是否为代理,应以 Mihomo 日志中的 using DIRECT 或具体代理组为准。
十二、选择方案
遇到需要放行的服务时,按下面顺序处理:
- 服务只有一个明确 API 域名:使用
DOMAIN。 - 服务有多个同根子域名:使用
DOMAIN-SUFFIX。 - 应用依赖很多不相关域名:使用
PROCESS-NAME。 - 只针对当前订阅:在订阅的“编辑规则”中添加前置规则。
- 需要跨订阅、抗订阅刷新:使用“全局扩展脚本”。
- 添加后仍失败:检查运行时
rules:和连接日志,不继续盲目增加规则。
十三、最终推荐配置
长期使用时,可以把所有自定义直连规则集中维护在一个全局脚本中:
const directRules = [
// AI 服务
"DOMAIN-SUFFIX,deepseek.com,DIRECT",
"DOMAIN-SUFFIX,qianwen.com,DIRECT",
"DOMAIN-SUFFIX,qianwen.aliyun.com,DIRECT",
"DOMAIN-SUFFIX,qwen.ai,DIRECT",
// 阿里云相关依赖
"DOMAIN-SUFFIX,alicdn.com,DIRECT",
"DOMAIN-SUFFIX,aliyuncs.com,DIRECT",
// 应用
"PROCESS-NAME,Quark,DIRECT",
"PROCESS-NAME,Quark Helper,DIRECT",
];
function unique(items) {
return Array.from(new Set((items || []).filter(Boolean)));
}
function main(config) {
config.rules = unique(directRules.concat(config.rules || []));
return config;
}这套方式有三个关键特征:
- 自定义规则始终位于订阅规则前面。
- 订阅刷新不会删除全局脚本。
- 切换订阅后仍可以重新应用同一套规则。
后续排查时,只需要记住一个判断标准:不要看“代码是否写进去了”,要看最终 rules: 是否存在,以及日志是否显示 using DIRECT。