DNS 基础:为什么代理和 DNS 总是一起出问题

7k 词

摘要: DNS 是互联网的”电话簿”,将域名翻译成 IP 地址。在使用代理时,DNS 解析的正确性直接决定了你能不能打开网站、会不会泄漏隐私、国内网站会不会变慢。本文从基础讲起,解释 DNS 在代理场景中的特殊性和常见问题。


DNS 是什么

DNS(Domain Name System,域名系统)是互联网最基础的服务之一。它的作用只有一个:把人类能记住的域名翻译成计算机能理解的 IP 地址

没有 DNS,你上网时需要记住的不是 google.com,而是 142.250.80.14;不是 baidu.com,而是 39.156.66.10。全球有数十亿个网站,靠记 IP 地址访问显然不现实。DNS 就是那个帮你查号码的电话簿。

DNS 的核心概念很简单:

  • 域名:人类可读的网站地址,如 google.comgithub.com
  • IP 地址:服务器的真实网络地址,如 142.250.80.14
  • DNS 服务器:负责翻译域名和 IP 的服务器。你的电脑每次访问网站,都要先问 DNS 服务器”这个域名对应哪个 IP”。
  • 默认 DNS:你连上网络后,运营商(ISP)会自动给你分配一个 DNS 服务器地址。大多数人从未手动配置过 DNS,用的就是运营商默认提供的。

DNS 服务器分两种角色:

  • 递归 DNS 服务器:你的设备直接询问的对象。它收到你的查询后,如果自己不知道答案,会代替你去逐级查询,最终返回结果。运营商的 DNS、阿里 DNS(223.5.5.5)、Google DNS(8.8.8.8)都属于这种。
  • 权威 DNS 服务器:某个域名的”官方”记录持有者。比如 google.com 的权威 DNS 由 Google 运营,只有它才能给出 google.com 的最终 IP 地址。

普通用户不需要关心权威 DNS,只需要知道:你的设备会把域名发给一个递归 DNS 服务器,它负责帮你找到答案。


DNS 解析过程(简化版)

以你在浏览器中输入 google.com 为例,整个 DNS 解析过程如下:

第一步:浏览器发起请求。 你在地址栏输入 google.com 并回车,浏览器需要知道这个域名对应的 IP 地址。

第二步:浏览器询问操作系统。 浏览器不会自己去查 DNS,而是调用操作系统的网络接口,问”google.com 的 IP 是多少?”

第三步:操作系统检查本地缓存。 如果你最近刚访问过 google.com,操作系统可能已经缓存了结果,直接返回 IP,不需要再查一次。

第四步:缓存未命中,询问 DNS 服务器。 本地没有缓存,操作系统就把查询请求发送到配置的 DNS 服务器地址。默认情况下,这个地址是运营商自动分配的。

第五步:DNS 服务器逐级查询。 递归 DNS 服务器收到请求后,先检查自己的缓存。如果没有,它会按照层级依次查询:先问根域名服务器(root)”.com 在哪”,再问 .com 的服务器”google.com 的权威 DNS 在哪”,最后问 google.com 的权威 DNS”IP 是多少”。

第六步:返回 IP 地址。 DNS 服务器拿到答案后,把 IP 地址返回给你的操作系统。操作系统再把结果交给浏览器,同时缓存这个结果以备下次使用。

第七步:浏览器连接目标服务器。 拿到 IP 地址后,浏览器直接向这个 IP 发起 HTTP/HTTPS 连接,网页内容开始加载。

整个过程通常在几十毫秒内完成。看起来简单直接,但在代理场景下,几乎每一步都可能出问题。

DNS 解析流程图
图片来源:Indusface

1
2
3
4
5
6
7
8
graph LR
A[你的设备] -->|DNS查询| B[ISP DNS]
B -->|被污染| C[❌ 错误IP]
A -->|使用代理| D[代理客户端]
D -->|国内域名| E[国内 DoH]
E --> F[✅ 正确CDN]
D -->|国外域名| G[远端解析]
G --> H[✅ 真实IP]

为什么代理场景下 DNS 特别复杂

在不使用代理的正常网络环境中,DNS 解析很少出问题——你的设备问运营商的 DNS 服务器,得到正确的 IP,连接成功。但一旦涉及代理,DNS 就变成了最容易出问题的环节。原因有四个。

问题一:DNS 污染

DNS 污染(DNS Poisoning / DNS Spoofing)是中国大陆网络环境中最核心的 DNS 问题。

原理很简单:当你向 DNS 服务器查询被封锁域名(如 google.com)的 IP 时,GFW 会抢在真正的 DNS 服务器返回结果之前,注入一个伪造的响应。这个伪造响应里的 IP 地址是错误的——可能是 127.0.0.1(本机)、一些随机的无关 IP,或者干脆不返回任何结果。

关键在于:DNS 污染发生在代理介入之前

传统的 DNS 查询使用 UDP 协议的 53 端口,内容完全明文,没有任何加密或验证机制。GFW 对这个端口的监控和劫持是全面的。即使你的代理服务器完全正常、线路通畅,只要 DNS 解析这一步拿到了错误的 IP,后面的连接就不可能成功。

具体表现:

  • google.com 被解析到 127.0.0.1 或无效 IP → 浏览器显示”无法连接”
  • google.com 被解析到某个国内 IP → 连接超时或显示错误页面
  • DNS 查询直接超时无响应

这就是为什么仅仅开了代理,有时候还是打不开网站——DNS 污染在更早的阶段就把路堵死了。

问题二:DNS 泄漏

DNS 泄漏(DNS Leak)指的是:你以为自己在使用代理上网,实际上 DNS 查询仍然走的是本地网络,直接发送到运营商的 DNS 服务器。

这意味着什么?即使你的网页数据通过代理传输、运营商看不到你访问的内容,但 DNS 查询暴露了你访问的目标域名。运营商的日志里会清楚地记录:这个用户在某时某刻查询了 google.comtwitter.comyoutube.com 的 IP。

DNS 泄漏的常见原因:

  • 系统代理模式:大多数系统代理只接管 HTTP/HTTPS 流量,DNS 查询走的是操作系统的网络栈,不经过代理。
  • TUN 模式未正确配置:TUN 模式理论上接管所有网络流量,但如果 DNS 设置不当,查询可能仍然走漏。
  • 应用绕过代理:某些应用程序(特别是系统级服务)可能不遵守系统代理设置,直接发起 DNS 查询。
  • IPv6 泄漏:代理只配置了 IPv4,IPv6 的 DNS 查询从旁路走掉了。

DNS 泄漏不影响功能(网站能打开),但对隐私构成威胁。如果你在意隐私,必须确保 DNS 查询也经过代理通道。

问题三:CDN 定位错误

这是很多人忽略的问题,但它直接影响网速。

大型网站(B站、淘宝、Netflix 等)使用 CDN(内容分发网络)在全球部署了大量服务器节点。当你查询这些域名的 IP 时,CDN 的 DNS 会根据你的 DNS 服务器位置来判断你在哪,然后返回离你最近的节点 IP。

问题来了:

  • 国内域名用了海外 DNS 解析:你用 8.8.8.8(Google DNS)查询 bilibili.com,CDN 认为你在美国,返回美国节点 IP。结果你一个在北京的用户,访问 B 站的流量绕了一圈太平洋,速度断崖式下降。
  • 国外域名用了国内 DNS 解析:你用运营商 DNS 查询 google.com,得到的是被污染的结果,根本连不上。

这就引出了代理场景下 DNS 的核心原则:国内域名用国内 DNS 解析,国外域名通过代理在远端解析。

分流做不好,要么国内网站变慢,要么国外网站打不开。两头不讨好。

问题四:先有鸡还是先有蛋

还有一个容易被忽视的循环依赖问题:

代理客户端需要连接代理服务器。要连接代理服务器,首先要知道代理服务器的 IP。如果你的代理配置用的是域名(比如 hk.example.com),客户端就需要先做一次 DNS 解析。

但 DNS 查询本身就可能被污染。

如果你的代理服务器域名被 GFW 污染了,代理客户端连代理服务器都连不上——DNS 解析失败 → 拿不到正确的服务器 IP → 代理建立不了 → 所有流量都不通。

解决方法:

  • 代理服务器配置直接使用 IP 地址而非域名
  • 使用 DoH(DNS over HTTPS)来解析代理服务器的域名,绕过 UDP 53 端口的劫持
  • 在 hosts 文件中手动写入代理服务器域名的正确 IP

代理客户端如何处理 DNS

理解了上面的四个问题,就能理解为什么代理客户端需要自己接管 DNS 处理,而不是交给操作系统。主流代理客户端(Clash、sing-box 等)采用以下几种方式处理 DNS。

Fake-IP 模式(主流方案)

Fake-IP 是目前最主流、推荐度最高的 DNS 处理方式。

核心思路:不做真正的 DNS 解析,而是直接返回一个假 IP,先把连接拦截下来。

工作流程:

  1. 浏览器要访问 google.com,向系统发起 DNS 查询。
  2. 代理客户端拦截这个查询,不去问任何真实 DNS 服务器。
  3. 代理客户端从自己维护的一个假 IP 池(通常是 198.18.0.0/16)中分配一个 IP,比如 198.18.0.1,并记录下”198.18.0.1 = google.com”的映射。
  4. 浏览器拿到 198.18.0.1,向这个 IP 发起连接。
  5. 代理客户端拦截这个连接,通过映射表查到目标是 google.com,然后根据分流规则决定:走代理还是直连?
  6. 如果走代理:把域名 google.com 发给远端代理服务器,由远端进行真正的 DNS 解析和连接。
  7. 如果直连:使用国内 DNS(如阿里 DNS)进行真正的解析,拿到正确的国内 CDN IP,直接连接。

Fake-IP 的优势:

  • 彻底避免 DNS 污染:外网域名的真实 DNS 解析在远端完成,本地根本不查询,也就不存在被污染的可能。
  • CDN 定位准确:国内域名由国内 DNS 解析,CDN 定位正确;国外域名由代理节点所在地的 DNS 解析,CDN 定位也正确。
  • 速度快:省去了本地 DNS 查询的等待时间,首次连接速度更快。

Fake-IP 的详细原理和配置参见 Fake-IP 与 Redir-Host 的区别

Redir-Host 模式

Redir-Host 是更传统的 DNS 处理方式。它的逻辑是先进行真正的 DNS 解析,拿到真实 IP,然后根据 IP 或域名决定路由。

流程:

  1. 浏览器查询 google.com,代理客户端拦截。
  2. 代理客户端同时向国内 DNS 和国外 DNS 发起查询。
  3. 根据返回结果判断域名归属,选择合适的 IP 返回给浏览器。
  4. 浏览器连接该 IP,代理客户端再根据连接目标决定是否走代理。

Redir-Host 的问题:

  • DNS 查询仍然在本地发生,外网域名可能被污染。
  • 需要同时配置国内和国外 DNS,逻辑更复杂。
  • 如果 DNS 结果不准确,分流判断就会出错。

目前 Redir-Host 已不是推荐方案。如果你的客户端支持 Fake-IP,优先使用 Fake-IP。

远端解析

远端解析指的是 DNS 查询完全在代理服务器端完成,本地不做任何解析。

这种方式隐私性最好——本地网络上完全看不到任何 DNS 查询。但缺点是所有域名(包括国内域名)都通过代理解析,国内网站的 CDN 定位可能不准确,导致速度下降。

实际使用中,远端解析通常和 Fake-IP 结合:外网域名远端解析,国内域名本地解析。这是目前最合理的组合方案。


常用 DNS 服务器

选择合适的 DNS 服务器是配置代理 DNS 的第一步。以下是国内外常用的 DNS 服务。

国内 DNS

DNS 服务 IP 地址 DoH 地址 特点
阿里 DNS 223.5.5.5 https://dns.alidns.com/dns-query 速度快,覆盖广,支持 DoH/DoT
腾讯 DNS 119.29.29.29 https://doh.pub/dns-query 稳定可靠,支持 DoH
114 DNS 114.114.114.114 老牌 DNS,不支持 DoH

国内 DNS 用于解析国内域名。推荐阿里 DNS 或腾讯 DNS,因为它们支持 DoH,可以防止查询被篡改。114 DNS 不支持加密查询,不推荐作为首选。

国际 DNS

DNS 服务 IP 地址 DoH 地址 特点
Cloudflare 1.1.1.1 https://cloudflare-dns.com/dns-query 全球响应速度最快
Google 8.8.8.8 https://dns.google/dns-query 最知名,稳定性高
Quad9 9.9.9.9 https://dns.quad9.net/dns-query 注重安全,自动拦截恶意域名

重要提示:国际 DNS 在中国大陆通常无法直接使用。UDP 53 端口发往 8.8.8.81.1.1.1 的查询会被劫持或丢弃。但通过代理访问时,这些 DNS 可以正常使用。在代理客户端配置中,国际 DNS 通常不需要手动配置——外网域名通过代理远端解析时,代理节点所在地可以正常访问这些 DNS。


什么是 DNS over HTTPS (DoH)

传统 DNS 查询使用 UDP 协议、53 端口,内容完全明文。这意味着:

  • 任何中间设备都能看到你查了什么域名
  • 任何中间设备都能篡改 DNS 响应(DNS 污染的技术基础)
  • 运营商可以完整记录你的 DNS 查询日志

DoH(DNS over HTTPS)把 DNS 查询封装在 HTTPS 协议里传输。HTTPS 是加密的,这带来两个好处:

  1. 防窃听:中间设备无法看到你查询的域名。
  2. 防篡改:中间设备无法伪造 DNS 响应,因为 HTTPS 有完整的证书验证机制。

在代理场景中,DoH 的作用主要体现在国内 DNS 查询上。对于国内域名(如 baidu.combilibili.com),你需要使用国内 DNS 服务器来获得正确的 CDN IP。如果这些查询使用明文 DNS,理论上仍然存在被篡改的可能。使用 DoH(如 https://dns.alidns.com/dns-query),可以确保即使是国内域名的 DNS 查询也不被篡改。

关于加密 DNS 的各类方案对比,参见 加密 DNS 全解。DoH 不是万能的。如果 DoH 服务器本身返回了错误结果(比如国内 DNS 对被墙域名返回的就是错误 IP),DoH 只能保证传输过程不被篡改,不能修正服务器本身的回答。所以,被墙的域名仍然需要通过代理远端解析。


推荐配置原则

根据以上分析,代理场景下的 DNS 配置应遵循以下原则:

第一,使用国内 DNS 作为代理客户端的主要 DNS 服务器。 推荐阿里 DNS(223.5.5.5)或腾讯 DNS(119.29.29.29)。这个 DNS 服务器负责解析国内域名,确保 CDN 定位正确、访问速度正常。

第二,外网域名交给代理远端解析。 不要试图在本地解析 google.comyoutube.com 等被墙域名。让代理客户端把域名传给代理节点,由节点在海外完成 DNS 解析。

第三,优先使用 Fake-IP 模式。 如果你的代理客户端支持 Fake-IP(Clash、Clash Verge、sing-box 等都支持),启用它。Fake-IP 从根本上解决了 DNS 污染和泄漏问题,是目前最省心的方案。

第四,国内 DNS 尽量使用 DoH。 把国内 DNS 地址配置为 DoH 格式(如 https://dns.alidns.com/dns-query),而不是裸 IP(223.5.5.5)。这样可以防止国内 DNS 查询被中间环节篡改。

第五,不要在本地直接使用国际 DNS。 不要把系统 DNS 设置为 8.8.8.81.1.1.1。在中国大陆网络环境下,直接使用这些 DNS 的 UDP 53 端口查询会被劫持。即使使用 DoH 访问这些国际 DNS,国内域名也会因为 CDN 定位错误而变慢。


常见问题

Q:我需要手动配置 DNS 吗?

取决于你的使用方式。如果你使用 Clash Verge、mihomo 等客户端并开启了 TUN 模式或系统代理,客户端会接管 DNS 处理。但你仍然需要确认客户端的 DNS 配置是正确的——错误的 DNS 配置是代理场景中最常见的问题来源。很多”代理开了但打不开网站”的情况,根本原因是 DNS 配置不当。

Q:为什么不能全部用 8.8.8.8?

两个原因。第一,在中国大陆直接访问 8.8.8.8 的 UDP 53 端口,你的 DNS 查询会被 GFW 劫持,返回的结果不可信。第二,即使你通过 DoH 成功访问了 8.8.8.8,当你查询国内域名(如 taobao.com)时,Google DNS 会认为你在美国,返回美国 CDN 节点的 IP。你的淘宝流量会绕到美国再回来,速度大幅下降。所以必须国内域名用国内 DNS、国外域名远端解析。

Q:DNS 和代理协议有关系吗?

DNS 是独立于代理协议的。无论你用的是 VLESS、VMess、Trojan 还是 Hysteria,DNS 配置的原则完全相同。代理协议决定的是”数据怎么传输”,DNS 决定的是”目标服务器在哪里”。它们是两个独立的问题。

Q:什么是 DNS over HTTPS (DoH)?

DoH 把 DNS 查询封装在 HTTPS 请求中进行传输。传统的 DNS 查询使用 UDP 明文传输,中间人可以轻松窃听和篡改。DoH 利用 HTTPS 的加密和证书验证,使得 DNS 查询内容既无法被窥探,也无法被篡改。在代理场景中,DoH 是防止国内 DNS 查询被劫持的重要手段。

Q:Fake-IP 模式会影响国内网站的速度吗?

不会。Fake-IP 模式下,代理客户端对国内域名(匹配直连规则的域名)仍然使用国内 DNS 进行真实解析。只有匹配代理规则的域名才会走远端解析。所以国内网站的 CDN 定位不受影响,速度和不使用代理时相同。

Q:我用了代理但 DNS 测试显示泄漏(可通过 dnsleaktest.com 检测),怎么办?

检查以下几点:一、确认代理客户端是否开启了 TUN 模式(系统代理模式下 DNS 泄漏几乎不可避免,详见 DNS 泄漏检测与修复);二、确认代理客户端的 DNS 设置中启用了 Fake-IP;三、检查是否存在 IPv6 泄漏——如果你的网络有 IPv6,但代理客户端只处理了 IPv4,DNS 查询可能通过 IPv6 走漏。可以在代理客户端中禁用 IPv6,或确保 TUN 模式同时接管 IPv4 和 IPv6。