访问一个网站时,我们通常只关注 HTTPS 是否安全,却很容易忽略另一个问题:

在建立 HTTPS 连接之前,DNS 查询本身可能还是明文的。

例如访问:

https://www.example.com

浏览器首先需要知道 www.example.com 对应的 IP 地址,因此会发起 DNS 查询。

传统 DNS 通常使用 UDP 53 端口:

电脑
  │
  │ DNS Query
  │ www.example.com
  │ UDP/53
  ▼
DNS Server

这个查询默认没有加密。

这意味着本地网络、路由器、运营商以及网络路径中的相关设备,都有机会直接看到:

www.example.com
github.com
google.com
api.example.com

加密 DNS 的目的,就是解决这个问题。


1. DNS 是什么

DNS,全称:

Domain Name System

主要负责将域名转换成 IP 地址。

例如:

www.example.com
        │
        ▼
DNS 查询
        │
        ▼
93.184.216.34

浏览器拿到 IP 以后,才能继续建立 TCP、QUIC、TLS 等连接。

完整过程大致为:

输入网址
   │
   ▼
DNS 查询域名
   │
   ▼
获取服务器 IP
   │
   ▼
建立 TCP / QUIC 连接
   │
   ▼
TLS 握手
   │
   ▼
HTTPS 请求
   │
   ▼
服务器返回页面

所以即使最终使用的是 HTTPS:

https://www.example.com

在 HTTPS 连接建立之前,DNS 查询就已经发生了。


2. 为什么传统 DNS 会暴露域名

传统 DNS 一般使用:

UDP 53

部分情况下也会使用:

TCP 53

例如:

192.168.1.100
      │
      │ UDP 53
      │ A www.example.com
      ▼
1.1.1.1

问题在于:

传统 DNS 协议本身没有提供传输层加密。

因此抓取网络数据包,可以直接看到 DNS 请求内容。

例如 Wireshark 中可能看到:

Standard query A www.example.com

甚至可以直接看到:

Domain Name System (query)

Queries
    www.example.com
        Type: A
        Class: IN

也就是说:

电脑
   │
   │ 明文 DNS
   ▼
路由器
   │
   ▼
运营商
   │
   ▼
网络中间设备
   │
   ▼
DNS Server

在这条路径上,有能力观察网络流量的设备都有可能知道:

你正在查询什么域名

3. HTTPS 为什么不能保护 DNS

一个常见误区是:

网站已经使用 HTTPS,为什么 DNS 还是明文?

因为 DNS 通常发生在 HTTPS 之前。

例如:

① DNS 查询
www.example.com -> 93.184.216.34

② TCP / QUIC 建立连接

③ TLS 握手

④ HTTPS 请求
GET /

HTTPS 加密的是:

HTTP 请求内容
Cookie
Header
POST 数据
网页内容

但传统 DNS 查询:

www.example.com

在 TLS 建立之前就已经发出。

因此:

HTTPS

并不能自动保护传统 DNS。


4. 中间网络设备能够看到什么

假设使用传统 DNS:

客户端
   │
   │ UDP/53
   │ www.example.com
   ▼
DNS Server

网络中间设备可以直接读取:

查询域名:www.example.com
查询类型:A
DNS Server 地址
客户端 IP

例如运营商侧观察到:

10:00:01 -> DNS 查询 github.com
10:00:10 -> DNS 查询 youtube.com
10:02:32 -> DNS 查询 example.com

虽然这并不等同于看到了 HTTPS 中传输的具体内容,但域名本身已经能够暴露不少访问行为。


5. 如何验证 DNS 是不是明文的

可以直接使用 Wireshark 抓包。

选择网卡

选择当前真正联网的网卡,例如:

Wi-Fi
Ethernet
en0
en7

macOS 可以执行:

route get default

查看:

interface: en0

Wireshark 过滤 DNS

使用:

dns

或者:

udp.port == 53

如果同时希望检查 TCP DNS:

udp.port == 53 || tcp.port == 53

然后访问网站,例如:

https://www.wikipedia.org

如果看到:

Standard query A www.wikipedia.org

说明这个 DNS 查询是明文的。


6. 使用 dig 主动生成 DNS 请求

为了避免浏览器缓存、系统缓存等影响,可以直接使用 dig

例如:

dig @1.1.1.1 www.example.com

此时 Wireshark 可以看到:

你的电脑
    │
    │ UDP 53
    ▼
1.1.1.1

对应请求:

Standard query A www.example.com

响应:

Standard query response
A www.example.com
A 93.184.216.34

这是一种非常直观的传统 DNS 明文测试方法。


7. 什么是加密 DNS

加密 DNS 的目标是:

对客户端到 DNS Server 之间的 DNS 查询进行加密。

目前比较常见的协议有:

协议全称常用端口底层协议
DNSDomain Name System53UDP / TCP
DoTDNS over TLS853TLS
DoHDNS over HTTPS443HTTPS
DoQDNS over QUIC853QUIC

传统 DNS:

客户端
   │
   │ UDP 53
   │ www.example.com
   ▼
DNS Server

加密 DNS:

客户端
   │
   │ TLS / HTTPS / QUIC
   │ 加密数据
   ▼
DNS Server

这样网络中间设备只能看到:

客户端正在连接某个 DNS Server

无法直接读取其中的:

www.example.com

8. DoH:DNS over HTTPS

DoH 是目前非常常见的加密 DNS 方案。

它将 DNS 查询放进 HTTPS 请求中:

DNS Query
   │
   ▼
HTTPS
   │
   ▼
TLS
   │
   ▼
TCP 443

网络结构:

客户端
   │
   │ HTTPS :443
   ▼
DoH Server

例如常见 DoH 地址:

https://cloudflare-dns.com/dns-query
https://dns.google/dns-query
https://dns.alidns.com/dns-query

在 Wireshark 中通常只能看到:

TLS Application Data

无法直接看到:

www.example.com

9. DoT:DNS over TLS

DoT 使用 TLS 加密 DNS:

DNS
 │
 ▼
TLS
 │
 ▼
TCP 853

结构:

客户端
   │
   │ TCP 853
   │ TLS
   ▼
DoT Server

传统 DNS 和 DoT 很容易通过端口区分:

53  -> 传统 DNS
853 -> DoT

10. DoQ:DNS over QUIC

DoQ 使用 QUIC 传输 DNS:

DNS
 │
 ▼
QUIC
 │
 ▼
UDP

网络中通常表现为:

UDP 853
QUIC

其中 DNS 内容同样经过加密。


11. DoH、DoT、DoQ 怎么选

日常网络环境可以简单这样选择:

协议兼容性特点
DoH很高使用 HTTPS 443,兼容性最好
DoT独立 TCP 853,协议清晰
DoQ较高使用 QUIC
普通 DNS极高明文

一般情况下推荐:

DoH

原因很简单:

HTTPS
TCP 443
网络兼容性好

如果软件和网络环境支持,也可以考虑:

DoQ

12. 如何配置加密 DNS

具体方式取决于操作系统和软件。

通常需要配置一个 DoH Server,例如:

https://dns.alidns.com/dns-query

或者:

https://cloudflare-dns.com/dns-query

核心结构应该变成:

应用
   │
   ▼
系统 DNS Resolver
   │
   ▼
DoH
   │
   │ HTTPS 443
   ▼
DNS Server

而不是:

应用
   │
   ▼
系统 Resolver
   │
   │ UDP 53
   ▼
DNS Server

13. 如何验证加密 DNS 是否生效

配置完成以后,重新使用 Wireshark 抓包。

首先过滤传统 DNS:

udp.port == 53 || tcp.port == 53

然后访问几个新的域名,例如:

www.wikipedia.org
www.cloudflare.com
github.com

如果加密 DNS 工作正常,不应该在传统 DNS 包中看到这些域名。

例如不应该看到:

Standard query A github.com

而应该看到类似:

客户端 -> DNS Server

TCP 443
TLS
Application Data

如果使用 DoQ,则可能看到:

UDP 853
QUIC

但无法直接读取:

github.com

14. 如何验证得更准确

测试时建议避免 DNS 缓存影响。

可以选择之前没有访问过的域名,或者使用随机子域名,例如:

test-123456.example.com

因为如果域名已经存在系统 DNS Cache:

应用
   │
   ▼
系统缓存
   │
   ▼
直接返回 IP

此时根本不会产生 DNS 网络请求。

所以:

抓不到 DNS

并不一定代表使用了加密 DNS,也可能只是:

DNS 缓存命中

15. 加密 DNS 能保护什么

使用 DoH、DoT、DoQ 后,主要保护的是:

DNS Query
DNS Response

例如:

www.example.com

不会再以明文形式出现在:

客户端
    ↓
路由器
    ↓
运营商
    ↓
DNS Server

这条路径中。

因此中间网络设备无法直接通过 DNS 数据包知道:

你正在解析哪个域名

16. 加密 DNS 不能保护什么

需要特别注意:

加密 DNS 不等于匿名上网,也不等于隐藏所有访问行为。

即使 DNS 已经加密,中间网络设备仍然可以看到:

你的 IP 地址
目标服务器 IP
连接端口
数据包大小
连接时间
流量特征

例如:

192.168.1.100
      │
      │ HTTPS
      ▼
142.x.x.x:443

虽然无法通过 DNS 包直接看到:

www.example.com

但目标服务器 IP 仍然是可见的。


17. TLS SNI 也可能暴露域名

DNS 加密之后,还有另外一个可能暴露域名的位置:

TLS SNI

传统 TLS 握手中,客户端可能发送:

Server Name: www.example.com

因此会出现:

DNS
 │
 │ DoH
 │ 已加密
 ▼

TLS ClientHello
 │
 │ SNI: www.example.com
 ▼
服务器

目前 TLS 中还有:

ECH
Encrypted Client Hello

用于进一步保护这部分信息。

因此真正完整的访问隐私问题,需要分别考虑:

DNS
TLS SNI
目标 IP
流量特征

加密 DNS 只解决其中:

DNS 查询隐私

这一部分。


18. DNS Server 本身仍然能看到查询

使用 DoH:

客户端
   │
   │ 加密
   ▼
DNS Server

加密发生在:

客户端 <-> DNS Server

之间。

DNS Server 收到请求后仍然需要知道:

www.example.com

才能完成解析。

因此:

局域网设备
路由器
运营商
中间网络设备

通常无法直接读取 DNS 查询内容。

但:

DNS Server

本身依然能够知道你查询了什么域名。

所以选择可信的 DNS 服务商仍然很重要。


19. 明文 DNS、加密 DNS 和匿名访问的区别

明文 DNS

客户端
   │
   │ www.example.com
   ▼
DNS Server

中间设备可以读取域名。

加密 DNS

客户端
   │
   │ ************
   ▼
DNS Server

中间设备无法直接读取 DNS 内容。

DNS Server 能看到查询内容。

VPN / 代理

如果目标是隐藏更多网络路径信息,则需要考虑:

VPN
Proxy
Encrypted Tunnel

例如:

客户端
   │
   │ 加密隧道
   ▼
VPN Server
   │
   ▼
互联网

此时本地 ISP 看到的主要是:

客户端 <-> VPN Server

而不是所有最终目标服务器连接。

因此:

加密 DNS ≠ VPN

它们解决的是不同问题。


20. 最终网络结构对比

普通 DNS

                        可以读取 DNS
                             ↓
客户端 ─── 路由器 ─── ISP ─── 网络 ─── DNS Server
   │
   └── UDP 53
       www.example.com

加密 DNS

客户端 ─── 路由器 ─── ISP ─── 网络 ─── DNS Server
   │                                      │
   │       TLS / HTTPS / QUIC             │
   └──────── 加密 DNS ────────────────────┘

中间设备:
只能看到加密连接

DNS Server:
可以看到 www.example.com

21. 推荐的验证流程

第一步:抓传统 DNS

Wireshark:

udp.port == 53 || tcp.port == 53

访问几个新的域名。

如果能看到:

Standard query A www.example.com

说明存在明文 DNS。

第二步:开启 DoH / DoT / DoQ

配置加密 DNS。

例如:

DoH
https://dns.alidns.com/dns-query

第三步:重新抓包

再次访问新的域名。

如果传统 DNS 包中不再出现:

www.example.com

而只看到:

TLS
HTTPS
QUIC

说明 DNS 查询已经被加密。

第四步:检查目标 DNS Server

还需要确认:

这些加密 DNS 请求最终连接的是不是自己配置的 DNS Server

避免虽然使用了加密 DNS,但实际连接的 DNS 服务商与预期不一致。


总结

传统 DNS 最大的问题是:

DNS 查询默认可以明文传输

例如:

www.example.com

可能直接出现在 UDP 53 数据包中。

因此:

局域网
路由器
运营商
其他网络中间设备

都有可能看到这些域名查询。

使用:

DoH
DoT
DoQ

以后,可以将:

客户端 <-> DNS Server

之间的 DNS 查询进行加密。

网络模型由:

客户端
   │
   │ UDP 53
   │ www.example.com
   ▼
DNS Server

变成:

客户端
   │
   │ TLS / HTTPS / QUIC
   │ ***************
   ▼
DNS Server

此时中间网络设备无法直接读取 DNS 查询内容。

但需要明确:

加密 DNS 保护的是 DNS 查询本身的隐私,并不能隐藏完整的网络访问行为。

即使开启了加密 DNS:

目标 IP
连接时间
流量大小
部分 TLS 元数据

仍然可能暴露。

因此从网络隐私角度,可以把几个问题分开理解:

DNS 查询隐私
    ↓
DoH / DoT / DoQ

TLS 域名隐私
    ↓
ECH

网络路径隐私
    ↓
VPN / Proxy / Tunnel

而加密 DNS 解决的,就是其中最基础的一环:

防止 DNS 查询域名以明文形式暴露在网络传输路径中。

标签: none

添加新评论