解析DNS与SNI加密技术
目标
本文将深入解析DNS、SNI这两个互联网通信的关键环节及其面临的安全威胁(如DNS污染、SNI阻断),并详细讲解保护它们的技术方案,包括DoH、DoT、ESNI以及最终的进化形态ECH。
第一部分 DNS
1.1 什么是DNS?
DNS(Domain Name System,域名系统)是互联网的“电话簿”。它的核心职能是将我们人类易于记忆的域名(如 www.google.com)转换成为机器用于定位的IP地址(如 142.251.42.238)
。
一次完整的DNS解析过程是一个精巧的分布式查询系统,其基本流程如下,这有助于我们理解后续的安全问题:

A[用户访问 example.com] --> B{查询浏览器/系统缓存}
B -- 缓存命中 --> A
B -- 缓存未命中 --> C[查询本地DNS服务器<br>(如ISP提供/自建)]
C --> D{本地服务器有缓存?}
D -- 是 --> C
D -- 否 --> E[向根域名服务器查询]
E --> F[向.com顶级域服务器查询]
F --> G[向example.com权威服务器查询]
G --> H[获取正确IP地址]
H --> I[返回并缓存结果]
I --> A
1.2 DNS污染(DNS Poisoning)
正是因为DNS查询通常基于无连接、无认证的UDP协议,且链路较长,它天生脆弱。DNS污染(也称DNS缓存投毒)就是一种利用此脆弱性的攻击或审查手段。
工作原理:干扰者(如网络防火墙)会监听DNS查询请求。当发现对特定域名(如 google.com)的请求时,它会在合法的权威DNS服务器返回正确结果之前,利用其网络位置优势,抢先向查询者(如本地DNS服务器或客户端)返回一个伪造的IP地址。由于DNS协议“谁先到就认谁”的特性,这个错误的记录会被接受并缓存,导致用户被导向错误的地址或无法连接。
下面的流程图清晰地展示了DNS污染的发生时机与过程:

A[客户端请求 example.com] --> B[递归解析器<br>(如ISP DNS)]
B -- 发送查询请求 --> C[根/顶级/权威服务器]
C -- 合法响应较慢 --> B
D[网络干扰者<br>(如防火墙)] -- 监听并识别敏感域名查询 --> E[抢先返回伪造的IP响应]
E --> B
B -- 接受最先到达的<br>(伪造)响应 --> F[缓存污染记录]
F --> G[将错误IP返回给客户端]
G --> H[用户被导向错误站点或无法连接]
第二部分 SNI - HTTPS握手过程中的“身份证”与隐私漏洞
2.1 为什么需要SNI?
随着HTTPS的普及和虚拟主机技术的发展,一个服务器IP地址上常常托管多个不同的网站。在建立HTTPS连接时,服务器需要在TLS握手之初就知道客户端想要访问哪个网站,以便返回与之匹配的正确SSL证书。
为了解决这个问题,SNI(Server Name Indication,服务器名称指示) 应运而生。它是一项TLS协议扩展,允许客户端在TLS握手的ClientHello消息中,以明文形式告知服务器它想要连接的主机名(如 www.example.com
2.2 SNI阻断(SNI Blocking)
SNI的设计缺陷正在于此:这个关键的域名信息在握手初期是明文的。这使得网络上的任何观察者(如防火墙)都能清晰地看到你正在尝试访问哪个网站。
SNI阻断便是基于此的一种审查技术。审查设备会实时嗅探TLS握手包中的SNI字段,一旦匹配到预设的黑名单关键词(如 google),它便会立即伪造一个TCP RST(连接重置)包发给客户端或服务器,中断此次TLS握手,导致连接失败
。其过程如下面的序列图所示:

participant C as 客户端
participant F as 防火墙(审查者)
participant S as 目标服务器
C->>F: 1. TCP SYN(发起连接)
F->>S: TCP SYN(转发)
S->>F: 2. TCP SYN-ACK
F->>C: TCP SYN-ACK
C->>F: 3. TCP ACK + TLS ClientHello<br>(明文SNI: banned-site.com)
Note over C,F: TLS握手开始
F->>F: 4. 检测SNI字段,匹配黑名单
Note over F: SNI阻断发生
F->>C: 5. 立即伪造TCP RST包
Note over C: 连接被重置,访问失败。
F->>S: 也可能向服务器发送RST
第三部分:加密技术
面对DNS污染和SNI阻断,技术社区开发了相应的加密方案来保护隐私。
3.1 加密DNS:DoH与DoT
为了应对DNS污染,加密DNS协议被提出,主要代表是:
DoT(DNS over TLS):在传统的DNS查询之上包裹一层TLS加密隧道,使用专用的853端口。这为DNS通信提供了端到端的加密,防止了窃听和篡改。
DoH(DNS over HTTPS):将DNS查询作为标准的HTTPS请求进行处理,通过443端口发送。这样做的好处是,DNS查询流量与普通的网页浏览流量混杂在一起,更难被识别和单独干扰,抗封锁能力更强。

3.2 加密SNI:从ESNI到ECH
为了解决SNI明文问题,技术也在演进:
ESNI(Encrypted SNI):这是最初的尝试。它允许客户端使用来自DNS记录的公钥,只加密TLS握手包中的SNI字段本身。这样,中间人虽然还能看到TLS握手,但无法得知具体访问的域名。
ECH(Encrypted Client Hello):这是ESNI的增强版,旨在加密整个Client Hello消息,而不仅仅是SNI字段。这提供了更强的隐私保护,并且设计了更优雅的重试机制,解决了ESNI在密钥分发和缓存上的问题,是未来的发展方向。
第四部分:技术协同
值得注意的是,这些保护技术并非孤立存在,而是相互依赖、协同工作的生态系统。下图展示了它们如何共同构建一个更私密、更安全的网络连接:

A[用户访问网站] --> B{是否启用加密DNS?}
B -- 是 --> C[使用 DoH/DoT 查询域名IP]
C --> D[同时通过DoH安全获取<br>服务器的ECH公钥]
D --> E[使用ECH公钥加密ClientHello]
E --> F[建立安全私密的HTTPS连接]
B -- 否 --> G[使用传统明文DNS查询]
G --> H[DNS查询可能被污染]
H --> I[TLS握手携带明文SNI]
I --> J[SNI可能被识别并阻断]
正如流程图所示,一个理想的、坚固的隐私保护方案往往需要同时部署加密DNS和加密SNI。ECH的实现通常依赖于DoH来安全地分发和更新服务器的公钥。
未来的发展方向也体现在像HTTP/3(基于QUIC协议)这样的新一代协议中,它们在设计之初就考虑了更多的加密和隐私保护机制。

浙公网安备 33010602011771号