Appearance
Clash Verge 完美防 DNS 泄露与自动路由优化指南
本文档总结了在 Clash Verge (基于 Meta / Mihomo 内核) 中彻底解决 DNS 泄露、打破解析死锁,并实现自定义域名一键全自动路由的终极最佳实践方案。
背景与痛点
在使用传统的 nameserver + fallback 机制,配合 GEOIP, CN 规则时,会产生以下典型问题:
- DNS 探测泄露:当访问未知域名(如测漏网站生成的随机域名)时,Clash 需要解析其真实 IP 以匹配 GEOIP 规则。此时 Clash 会同时向国内和国外 DNS 发起查询,导致测漏网站上出现国内运营商(如阿里云、中国电信)的记录。
- 解析死锁(鸡生蛋问题):如果强行将所有 DNS 请求丢给国外安全 DNS (如 8.8.8.8),会导致 Clash 无法解析代理节点自身的域名,从而连不上代理,进而无法通过代理去访问 8.8.8.8,最终导致彻底断网。
- 自定义规则繁琐:手动添加自定义国内直连域名时,既要修改路由规则,又要修改 DNS 策略,极易出错,且容易被代理导致国内 CDN 加速失效。
核心解决思路
为了兼顾“极致隐私”、“高可用性”以及“配置自动化”,本方案采取了以下策略:
proxy-server-nameserver破除死锁:专门指定使用国内明文 IP(如 223.5.5.5)来解析代理节点自身的域名,一举打破死锁。- 默认国外安全 DNS:将
nameserver设为纯国外 DoH。任何未知或国外域名都会强制走这里,并通过代理隧道传输,实现真正的防探测泄露。 geosite:cn兜底国内流量:利用强大的geosite:cn内置数据库(包含数万个国内主流域名及所有.cn域名),将常见的国内网站精准分流给国内 DoH 解析。- 自定义域名自动化:通过扩展脚本,只需在一处填写自定义冷门域名,脚本即可自动将其“插队”到直连规则的最前面,并强制分配给国内 DNS。
终极配置脚本 (JavaScript)
在 Clash Verge 中,通过“订阅 (Profiles)” -> “新建 (New)” -> “脚本 (Script)” 功能,填入以下代码,并右键“启用 (Enable)”,最后右键你的节点订阅点击“重启内核 (Restart Core)”即可生效:
javascript
// =======================================================
// 配置项:在最顶部统一管理你的所有自定义规则和软件策略
// =======================================================
// 1. 需要【直连】且【使用国内 DNS】的自定义域名
// 这里只填:公司内网域名、路由器后台、个人 NAS 域名。
const myCustomDomains = [
"yago.vip", // 个人 NAS 专属域名,强制走局域网/公网直连
"shadowsocks.nz", // 机场官网免死金牌,保证随时能进
"newcli.com",
"hotaitool.net",
"issueacard.top",
"aoenan.com"
];
// 2. 被 geosite:cn 误判,或需要【强制使用国外 DNS+强制代理】的海外域名
const forceProxyDomains = [
"byteoversea.com",
"tiktokv.com",
"tiktokcdn.com",
"tiktok.com",
"bytedance.com",
"capcut.com",
"snssdk.com",
"trae.ai" // 字节跳动海外版 AI IDE,必须走海外代理才可使用 Claude/GPT
];
// 3. 常用社交/聊天软件域名库 (GEOSITE) - 强制走代理并使用国外 DNS
const socialGeosites = [
"telegram",
"whatsapp",
"twitter",
"instagram"
];
// 4. 常用社交/聊天软件 IP 地址库 (GEOIP) - 强制走代理
// 注意:只写数据库中真实存在的 IP 库,防止 Clash 报错。Twitter/X 没有固定 IP 库,故不填。
const socialGeoips = [
"telegram",
"whatsapp",
"instagram"
];
// 5. 核心 AI 服务域名库 (GEOSITE) - 极度严格防风控
const aiGeosites = [
"openai", // ChatGPT, OpenAI API
"anthropic", // Claude
"google", // Gemini, Google 搜索全家桶
"github" // GitHub, Copilot, Codex
];
// =======================================================
// 优化 DNS 设置
// =======================================================
function optimizeDNS(config) {
if (!config.dns) {
config.dns = {};
}
// 极度关键:开启 IPv6 解析视力
config.dns.ipv6 = true;
// 核心:指定明文 IP 解析代理节点自身域名,打破网络死锁
config.dns['proxy-server-nameserver'] = ["223.5.5.5", "119.29.29.29"];
config.dns['default-nameserver'] = ["223.5.5.5", "119.29.29.29"];
// 默认国外及未知域名 DNS,提升连接成功率
config.dns.nameserver = [
"8.8.8.8",
"1.1.1.1"
];
// 国内分流解析通道
let policy = {
"geosite:cn": [
"https://223.5.5.5/dns-query",
"https://doh.pub/dns-query"
],
"geosite:apple": [
"https://223.5.5.5/dns-query",
"https://doh.pub/dns-query"
]
};
// 动态注入:遍历自定义直连域名,强制分配阿里 DNS
for (let domain of myCustomDomains) {
policy[`+.${domain}`] = ["https://223.5.5.5/dns-query"];
}
// 动态注入:遍历海外强制代理域名,分配纯国外 DNS
for (let domain of forceProxyDomains) {
policy[`+.${domain}`] = ["8.8.8.8", "1.1.1.1"];
}
// 动态注入:遍历社交软件域名库,分配纯国外 DNS,防止被国内 DNS 劫持污染
for (let site of socialGeosites) {
policy[`geosite:${site}`] = ["8.8.8.8", "1.1.1.1"];
}
// 动态注入:AI 服务防漏,使用纯海外 DNS 解析,防止触发严格风控
for (let site of aiGeosites) {
policy[`geosite:${site}`] = ["8.8.8.8", "1.1.1.1"];
}
config.dns['nameserver-policy'] = policy;
// 彻底废除并发抢答机制,斩断所有的 DNS 测漏源头!
delete config.dns.fallback;
delete config.dns['fallback-filter'];
// 消除机场配置过时导致的 global-client-fingerprint 黄字警告
if (config['global-client-fingerprint']) {
delete config['global-client-fingerprint'];
}
return config;
}
// =======================================================
// 4. 路由规则强化 (全自动兼容所有机场的高级分组探测)
// =======================================================
function addCustomRules(config) {
if (!config.rules) config.rules = [];
// 1. 自动探测主代理组名称 (兼容旧机场的 Proxy 或新机场的 主代理)
let mainProxyGroup = "PROXY";
if (config['proxy-groups'] && config['proxy-groups'].length > 0) {
mainProxyGroup = config['proxy-groups'][0].name;
}
// 2. 核心魔法:智能匹配高级策略组,如果没有找到,就安全降级为主代理
function getGroup(targetName) {
if (config['proxy-groups'] && config['proxy-groups'].some(g => g.name === targetName)) {
return targetName;
}
return mainProxyGroup;
}
// 如果新机场有 OpenAI 分组就用,旧机场没有就自动回退到 mainProxyGroup
const aiGroup = getGroup("OpenAI");
const socialGroup = getGroup("Telegram");
const tiktokGroup = getGroup("TikTok");
// 3. 生成规则 (将不同业务精确导入智能探测出的策略组)
const prependDirect = myCustomDomains.map(domain => `DOMAIN-SUFFIX,${domain},DIRECT`);
const prependProxy = forceProxyDomains.map(domain => `DOMAIN-SUFFIX,${domain},${tiktokGroup}`);
const geositeRules = socialGeosites.map(site => `GEOSITE,${site},${socialGroup}`);
const geoipRules = socialGeoips.map(ip => `GEOIP,${ip},${socialGroup}`);
const aiRules = aiGeosites.map(site => `GEOSITE,${site},${aiGroup}`);
// 4. 自动合并插队
config.rules = prependProxy.concat(aiRules).concat(geositeRules).concat(geoipRules).concat(prependDirect).concat(config.rules);
return config;
}
// =======================================================
// 5. Clash 主入口函数
// =======================================================
function main(config) {
config = optimizeDNS(config);
config = addCustomRules(config);
return config;
}必读:为什么要使用“全局扩展脚本 (Script)”而非“全局扩展配置 (Merge)”?
在 Clash Verge 的设置中,你有两种方式可以修改机场下发的原始配置:扩展配置 (YAML) 和 扩展脚本 (JavaScript)。本指南强烈推荐使用扩展脚本,原因如下:
- 扩展配置 (Merge / YAML) = 简单的“打补丁”:
- 局限 1:无法强制插队。在代理软件中,规则是自上而下匹配的。YAML 扩展通常只能将你的规则追加到机场自带的几万条规则的最底部,导致你的优先级被抢占,防漏规则永远无法生效。
- 局限 2:没有逻辑探测能力。YAML 是死板的配置文本,它无法根据你当前连接的机场动态判断该使用什么策略组名称。
- 扩展脚本 (Script) = 高级的“基因重组”(本指南方案):
- 优势 1:精准操控与前置插队。脚本在底层接收到的是完整的配置对象(
config),我们可以使用代码逻辑将我们的核心防漏GEOSITE规则强制“插队”到第一行,保证 100% 的最高匹配优先级。 - 优势 2:智能探测与自适应 (Fallback)。正如上方脚本代码中的
getGroup()函数,脚本能够动态扫描当前机场的代理组:如果发现专属的高级组(如OpenAI、TikTok),就精准导流;如果没有发现(如老旧机场),就自动安全地降级回主代理组。真正的做到了在多机场间切换也无需改代码的“一劳永逸”!
- 优势 1:精准操控与前置插队。脚本在底层接收到的是完整的配置对象(
测试与验证
配置完成并重启内核后,请务必执行以下步骤进行验证:
- 浏览器设置:确保 Chrome/Edge/Safari 中的“安全 DNS”、“隐藏 IP 地址”或 iCloud 专用代理已关闭(详见
browser_dns_leak_fix.md)。 - 防 IPv6 绕过(极其重要):请在 Clash Verge 的“设置 (Settings)” -> “TUN 模式 (TUN Mode)”中,务必打开 IPv6 开关。这样即使浏览器偷偷拿到 IPv6 地址,流量也会被强制抓进代理隧道,彻底防止本地真实 IPv6 裸奔。
- DNS 测漏验证:打开 browserleaks.com/dns。完美的测试结果中,DNS 服务器列表应当仅出现你的代理节点所在的 IP、ISP(如 xTom)及国家位置,不再包含任何 China、Alibaba、Telecom 等字眼。
- 代理 IP 与风控检测:打开 ip.net.coffee (或专项检测 ip.net.coffee/claude/)。这里可以查看代理节点最终出口的真实 IP(包含 IPv6),以及该节点对 AI 服务(如 ChatGPT, Claude)的解锁纯净度。
- 注:如果测出 IPv6 地址,且显示为海外(你的代理位置),请勿惊慌。这只是代理服务器在用其干净的 IPv6 连接目标网站,这是防 AI 封号的加分项,而非本地 IP 泄露。
进阶隐私防护经验总结(防定位、WebRTC 与指纹防伪)
除了基础的 IP 和 DNS 泄露,现代互联网还有更深层的追踪手段。以下是排查与防护的最佳实践:
1. HTML5 物理定位泄露 (Geolocation API)
- 原理:测漏网站(如
browserleaks.com/geo)如果能准确显示你所在的街道,这不是 IP 泄露,而是浏览器读取了你周围真实的 Wi-Fi 路由器的 MAC 地址,并通过系统级 API 换取了物理坐标。代理软件无法改变现实中的物理信号。 - 防护方案:必须在浏览器级别解决。
- Chrome: 设置 -> 隐私和安全 -> 网站设置 -> 位置信息 -> 选择“不允许网站查看您的位置信息”。
- Safari: 设置 -> 网站 -> 位置 -> 选择“拒绝”。
2. WebRTC 局域网/公网 IP 泄露
- 原理:WebRTC 用于网页音视频通话,它会尝试绕过传统的 HTTP 代理直接发送 UDP 数据包,从而可能泄露真实的公网 IP 或局域网内网 IP(如
192.168.x.x)。 - 防护方案:
- 第一层(防公网泄露):只要开启了 Clash Verge 的 TUN 模式,所有 UDP 数据包均会在底层被虚拟网卡接管,因此 WebRTC 绝不会泄露真实的公网 IP(只会显示代理节点的 IP)。
- 第二层(防内网泄露):若需极致隐私(不让网站看到局域网 IP),建议在 Chrome 安装
WebRTC Control或WebRTC Leak Prevent插件,彻底阻断该功能。Safari 默认已对 WebRTC 做了 mDNS 混淆,无需额外配置。
3. 指纹浏览器与 AI 风控 (Claude / ChatGPT)
- 误区:很多人认为访问 Claude 或 ChatGPT 需要使用“指纹浏览器”(如 AdsPower)来隐藏身份,这其实是极其危险且毫无必要的。
- 原理解析:
- AI 大厂(尤其是搭载 Cloudflare 验证的 Claude)的风控核心是 IP 纯净度 和 账号批量行为,并不会因为你是真实的 Mac 电脑就封禁你。
- 指纹浏览器由于刻意伪造硬件环境(如 Canvas 绘图、WebGL、字体、OS 标识等),一旦被 Cloudflare 识别出底层存在“伪造痕迹”,会直接触发无限人机验证循环,甚至导致账号秒封。
- 最佳实践:最安全的环境就是最真实的环境。使用“原生 Mac Chrome 浏览器”配合“防泄露完美的 Clash TUN 代理节点”,即可获得极高的真实度评分与风控豁免权。如需管理多个账号,仅使用 Chrome 浏览器自带的“多用户配置(Profiles)”进行 Cookie 物理隔离即可。
4. 命令行 (Terminal) 代理的最佳实践
误区:很多人习惯在
~/.zshrc或~/.bash_profile中全局写入export http_proxy=...等环境变量。这在开启了 TUN 模式的情况下是完全多余且有害的。如果在没开 Clash 时打开终端,发出的网络请求会被直接拒绝(Connection refused),且会严重干扰本地开发环境(如请求localhost:3000被错误地送入代理)。原理解析:Clash 的 TUN 模式运行在系统操作底层(第三网络层),终端里的绝大多数命令行工具(如
git,curl,npm,docker等)发出的网络请求,都会被这块虚拟网卡自动接管并完美路由,无需你在终端做任何代理配置即可顺畅翻墙。最佳实践:彻底删除
.zshrc中的全局代理环境变量,改为按需手动开关的快捷别名(Alias)。将以下代码加入你的终端配置文件末尾:bash# 为极少数不支持底层路由的顽固命令行工具(按需手动开启) alias proxyon="export http_proxy=http://127.0.0.1:7897; export https_proxy=http://127.0.0.1:7897; export all_proxy=socks5://127.0.0.1:7897; echo 'Terminal Proxy ON'" # 用完即关,防止污染 alias proxyoff="unset http_proxy; unset https_proxy; unset all_proxy; echo 'Terminal Proxy OFF'"(注:
7897需与 Clash Verge 里的 mixed-port 端口保持一致)。 效果:平时你的终端默默享受 TUN 模式的无感路由,遇到极特殊情况敲一下proxyon作为双保险即可。
5. 系统时区泄露与环境伪装 (针对 Claude Code 等高敏 AI 工具)
原理:近期 Claude 加强了风控,尤其是其最新发布的命令行开发工具 Claude Code 或网页版,会通过读取电脑本地操作系统时区(如
Asia/Shanghai),将其与代理 IP 的地理位置(如美国加州)进行比对。如果发现错位,就会判定为“欺诈环境”从而拒绝服务甚至封号。极其重要的一点:时区和语言属于操作系统的本地环境特征,Clash 只能接管网络数据包,无法在网络层对系统时区进行篡改。我们必须在操作系统层面进行反制。
防护方案 1:系统全局修改(推荐,最彻底最原生)
关闭自动定位:前往 Mac 的
系统设置 -> 通用 -> 日期与时间,务必关闭“根据您的当前位置自动设置时区”,防止系统通过 Wi-Fi 偷偷将时区强行拉回国内。手动绑定代理所在地:如果你的节点在美国加州(如 San Jose 圣何塞、Los Angeles 洛杉矶),它们的国际标准时区代码统称为
America/Los_Angeles。一键修改命令:在终端执行以下命令,瞬间将系统底层时区伪装为加州:
bash# 修改为美国加州时区 (完美匹配 San Jose / Cupertino / Los Angeles) sudo systemsetup -settimezone America/Los_Angeles(注:如果你在系统设置中看到最接近的城市变成了“库比提诺,CA - 美国”,说明已完美生效。库比提诺即苹果加州总部,与圣何塞处于完全相同的时区,环境特征毫无破绽!)
bash# 用完后,一键恢复为中国北京时区 sudo systemsetup -settimezone Asia/Shanghai
防护方案 2:终端局部伪装(适合不愿修改全局时间的极客) 将以下别名加入
~/.zshrc中,仅在运行 Claude Code 时强行注入美国时区和纯英文语言环境:bash# 注入洛杉矶时区与纯英文环境,专门用于运行 Claude Code 防止风控 alias claude="TZ='America/Los_Angeles' LANG='en_US.UTF-8' claude"关于系统语言的迷思:系统语言设置为中文(
zh-CN)属于“弱特征”,由于加州本地有大量的真实华人,AI 平台绝不会单凭中文系统封号。但如果你有“终极数字移民强迫症”,可以在 Chrome 语言设置中将English (United States)添加并拖到列表的第一位。