本文目录导读:

DNSCrypt 通过在 DNS 客户端(如你的电脑)与 DNS 服务器之间建立一个加密的通信通道来保护 DNS 查询请求,其核心机制是对传统的、明文的 DNS 查询进行包装和加密,具体过程如下:
核心原理:将查询“封装”进加密隧道
传统的 DNS 查询(DNS over UDP/TCP)是明文的,任何网络中间节点(如路由器、ISP)都可以看到你访问的域名,DNSCrypt 则相当于在你的设备与支持 DNSCrypt 的 DNS 服务器之间,建立了一个 TLS/HTTPS 风格的加密隧道。
它的工作流程分为以下关键步骤(以客户端发起查询为例):
认证与密钥交换(建立安全连接)
在首次或定期通信时,客户端需要验证 DNS 服务器的真实身份,并协商加密密钥。
- 服务器证书:每台支持 DNSCrypt 的 DNS 服务器都有一个公钥证书(由 DNSCrypt 协议定义)。
- 客户端查询:客户端向服务器发送一个特殊的“证书请求”。
- 服务器响应:服务器返回其公钥证书(包含公钥、服务器指纹、加密算法等信息)。
- 客户端验证:客户端使用预置的(或从公共列表获取的)服务器公钥指纹来验证收到的证书是否属于目标服务器,这防止了中间人攻击(MITM)。
- 生成对称密钥:验证通过后,客户端生成一个随机的对称密钥(用于后续实际数据加密),并使用服务器的公钥将其加密后发送给服务器。
- 服务器解密:服务器用私钥解密,得到对称密钥,双方拥有了一个共享的、用于本次会话的对称加密密钥。
加密 DNS 查询请求
加密过程使用 X25519 (一种椭圆曲线密钥交换算法) 和 XSalsa20-Poly1305 (一种对称加密和认证算法,提供机密性和完整性)。
- 原始查询:你访问
example.com的 DNS 查询是一个明文数据包。 - 加密处理:
- 填充与随机化:为了防止流量分析和指纹攻击,客户端会在查询数据包中添加随机长度的填充数据(Padding),使每个加密包的大小看起来不固定。
- 加密:使用步骤1中协商好的对称密钥,通过 XSalsa20 算法对整个查询内容(包括域名、查询类型等)进行加密。
- 认证:使用 Poly1305 算法对加密后的数据生成一个认证标签(Authentication Tag),用于验证数据在传输过程中是否被篡改。
- 封装:加密后的查询内容、认证标签、客户端随机数(Nonce)等打包成一个新的 UDP 或 TCP 数据包。
传输与解密
- 传输:加密后的数据包通过标准的 DNS 端口(通常是 443 或 53)发送到服务器。
- 服务器解密:DNS 服务器收到数据包后,使用共享的对称密钥解密,提取出原始的 DNS 查询。
- 查询处理:服务器查询本地缓存或上游 DNS 根服务器,得到
example.com的 IP 地址。 - 加密回复:服务器用相同的对称密钥对 DNS 响应(包含 IP 地址)进行同样的加密和认证,再返回给客户端。
- 客户端解密:客户端解密响应,获得目标 IP。
与 DNS over HTTPS (DoH) 或 DNS over TLS (DoT) 的关键区别
| 特性 | DNSCrypt | DNS over HTTPS (DoH) | DNS over TLS (DoT) |
|---|---|---|---|
| 加密层 | 自定义协议(应用层加密) | HTTPS (HTTP over TLS) | TLS (传输层加密) |
| 端口 | 常用 443 或 53 | 443 | 853 |
| 数据包特征 | 看似普通 HTTPS 或 DNS 流量(混合) | 明显的 HTTPS 请求(Host头暴露) | 明显的 TLS 握手(端口853) |
| 防中间人 | 通过预置公钥指纹 | 通过证书链(CA) | 通过证书链(CA) |
| 应用场景 | 兼容性强,可绕过基于端口或协议的封锁 | 与 Web 流量完全混合,最难被识别 | 更安全,但易被端口封锁 |
| 是否匿名 | 不匿名,仅加密(服务器仍能看到你的IP) | 同左 | 同左 |
实际效果
当你使用 DNSCrypt 时:
- ISP 或网络管理员:看到的不是
www.example.com,而是一堆看似随机、长度不一的加密数据包(通往 IP 为 X.X.X.X 的 DNS 服务器)。他们无法知道你在访问哪个网站。 - 中间人攻击者:无法篡改查询或响应的内容,因为数据有认证标签(Poly1305)保护。
- DNS 服务器:可以看到你的 IP 地址和查询内容(因为它需要解密来为你服务)。DNSCrypt 保护的是“客户端<->DNS服务器”的链路安全,而不是匿名性。
配置方法:通常需要安装客户端软件(如 dnscrypt-proxy 或 SimpleDNSCrypt),它会接管系统 DNS 请求,并与你指定的 DNSCrypt 服务器(如 Cloudflare DNS、Quad9 等)建立加密连接。
标签: 加密DNS