DNS 污染原理简介
DNS(域名系统)是将域名转换为 IP 地址的服务。当你访问 google.com 时,设备需要先通过 DNS 查询获取其 IP 地址。
DNS 污染(DNS Pollution)是指某些网络运营商或审查机构在 DNS 查询过程中返回错误的 IP 地址,导致你无法访问目标网站。常见的污染方式:
- DNS 劫持:运营商拦截 DNS 请求,返回虚假 IP。
- DNS 投毒:在 DNS 响应到达之前注入伪造的响应包。
- SNI 阻断:检测 TLS 握手中的域名信息并中断连接。
如果不正确处理 DNS,即使代理本身是加密的,DNS 查询也可能暴露你正在访问的域名列表,造成隐私泄漏。
Clash DNS 工作机制
Clash 内置了 DNS 解析器,可以接管所有 DNS 查询。其工作流程:
- 应用发起 DNS 查询(如查询
google.com的 A 记录)。 - Clash DNS 模块拦截该查询。
- 根据配置,Clash 将查询发送给不同的上游 DNS 服务器。
- 对于需要代理的域名,Clash 通过代理通道向
fallbackDNS 服务器发起查询(加密的 DNS-over-TLS)。 - 对于直连域名,Clash 向
nameserver中的国内 DNS 查询(速度快)。 - Clash 返回最终解析结果给应用。
通过这种分流机制,Clash 同时实现了 防污染(代理域名走加密 DNS)和 高性能(国内域名走本地 DNS)。
enhanced-mode 配置
enhanced-mode 控制 Clash 如何处理 DNS 解析结果:
fake-ip 模式(推荐)
fake-ip 模式返回一个虚假的 IP 地址(如 198.18.0.1),等应用实际发起连接时,Clash 再根据规则决定使用真实 IP 还是通过代理访问。
dns:
enable: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- localhost.ptlogin2.qq.com
- "+.stun.*.*"
- "+.stun.*.*.*"
- "+.stun.*.*.*.*"
- "+.stun.*.*.*.*.*"
- dns.msftncsi.com
- www.msftncsi.com
- www.msftconnecttest.com
优点:
- DNS 查询速度极快(直接返回假 IP,无需等待真实解析)。
- 避免 DNS 缓存导致的分流问题。
- 有效防止 DNS 泄漏。
注意:部分应用(如某些游戏、局域网服务)可能不兼容 fake IP,需要通过 fake-ip-filter 排除。
redir-host 模式
redir-host 模式会真实解析域名,但通过代理通道查询 fallback DNS,避免污染。
dns:
enable: true
enhanced-mode: redir-host
fake-ip-range: 198.18.0.1/16
优点:兼容性好,所有应用都能正常工作。
缺点:DNS 查询速度较慢(每次都要等待真实解析结果)。
nameserver vs fallback 配置
Clash 的 DNS 配置中有两组 DNS 服务器,各自承担不同角色:
nameserver(默认 DNS)
用于解析国内域名或不需要代理的域名。使用普通 DNS 协议,速度快。
nameserver:
- 223.5.5.5 # 阿里 DNS
- 119.29.29.29 # 腾讯 DNS
fallback(回退 DNS)
用于解析需要代理的域名。Clash 会同时向 nameserver 和 fallback 发起查询,然后根据 fallback-filter 的规则判断使用哪组结果:
- 如果 nameserver 返回的 IP 是中国 IP,使用 nameserver 的结果(直连更快)。
- 如果 nameserver 返回的 IP 不是中国 IP(可能是被污染的),使用 fallback 的结果。
fallback:
- "tls://8.8.8.8:853" # Google DNS over TLS
- "tls://1.1.1.1:853" # Cloudflare DNS over TLS
- "https://dns.google/dns-query" # Google DNS over HTTPS
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
domain:
- "+.google.com"
- "+.facebook.com"
- "+.youtube.com"
nameserver-policy 按规则分组
nameserver-policy 允许你为特定域名指定专用的 DNS 服务器,实现更精细的 DNS 分流:
nameserver-policy:
# 国内域名用国内 DNS
"+.baidu.com":
- 223.5.5.5
- 119.29.29.29
# 国外域名走 DoT
"+.google.com":
- "tls://8.8.8.8"
"+.github.com":
- "tls://1.1.1.1"
# 特定域名使用指定 DNS
"dns.msftncsi.com":
- 223.5.5.5
nameserver-policy 的优先级高于 nameserver/fallback 的自动分流,适合需要精确控制的场景。
DNS 泄漏检测方法
配置完 DNS 后,务必进行泄漏测试:
- browserleaks.com/dns:查看你的 DNS 服务器 IP,应该不是你 ISP 的 DNS。
- dnsleaktest.com:运行扩展测试,检查所有 DNS 请求是否都通过代理。
- ipleak.net:综合检测 IP、DNS、WebRTC 泄漏。
正常情况下的期望结果:
- DNS 服务器应显示为 Google(8.8.8.8)、Cloudflare(1.1.1.1)等公共 DNS。
- 不应显示你的 ISP DNS 地址。
- IP 地址应显示为代理节点的 IP。
完整配置示例
以下是一个综合考虑防污染、性能和兼容性的完整 DNS 配置:
dns:
enable: true
listen: "0.0.0.0:53"
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "*.msftconnecttest.com"
- "*.msftncsi.com"
- "localhost.ptlogin2.qq.com"
- "localhost.sec.qq.com"
- "+.stun.*.*"
- "dns.tencent.com"
- "dns.alicdn.com"
prefer-h3: true
nameserver:
- 223.5.5.5
- 119.29.29.29
- "https://dns.alidns.com/dns-query"
fallback:
- "tls://8.8.8.8:853"
- "tls://1.1.1.1:853"
- "https://dns.google/dns-query"
- "https://cloudflare-dns.com/dns-query"
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
domain:
- "+.google.com"
- "+.facebook.com"
- "+.youtube.com"
- "+.twitter.com"
- "+.github.com"
- "+.telegram.org"
nameserver-policy:
"+.baidu.com":
- 223.5.5.5
"+.bilibili.com":
- 223.5.5.5
"+.google.com":
- "tls://8.8.8.8"
"dns.msftncsi.com":
- 223.5.5.5
"www.msftconnecttest.com":
- 223.5.5.5