---
title: DNS 基础：为什么代理和 DNS 总是一起出问题
date: 2026-05-10
categories:
  - DNS 专题
tags:
  - DNS
  - 基础
  - DNS污染
  - CDN
  - 代理
excerpt: DNS 是互联网的电话簿。在代理场景中，DNS 解析的正确性直接决定上网体验。
mermaid: true
index_img: /images/posts/dns-basics-for-proxy.png
---

> **摘要**: 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.com`、`github.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 解析流程图](/images/inline/dns-resolution-flow.png)
*图片来源：[Indusface](https://www.indusface.com/)*

```mermaid
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.com`、`twitter.com`、`youtube.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 的区别](/posts/fake-ip-vs-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](https://alidns.com/) | `223.5.5.5` | `https://dns.alidns.com/dns-query` | 速度快，覆盖广，支持 DoH/DoT |
| [腾讯 DNS](https://www.dnspod.cn/) | `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](https://developers.cloudflare.com/1.1.1.1/) | `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.8` 或 `1.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.com`、`bilibili.com`），你需要使用国内 DNS 服务器来获得正确的 CDN IP。如果这些查询使用明文 DNS，理论上仍然存在被篡改的可能。使用 DoH（如 `https://dns.alidns.com/dns-query`），可以确保即使是国内域名的 DNS 查询也不被篡改。

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

---

## 推荐配置原则

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

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

**第二，外网域名交给代理远端解析。** 不要试图在本地解析 `google.com`、`youtube.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.8` 或 `1.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](https://dnsleaktest.com/) 检测），怎么办？**

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