互联网上,计算机相互使用 IP 地址来标识主机和网络寻址。但是不论是 IPv4 还是 IPv6,对于人类来说记忆过于困难,人们更偏向于使用诸如 tauyoung.top 的更方便好记的域名。因此,在发送数据包之前,计算机需要将人类可读的域名转换为计算机可识别的 IP 地址,这样的转换是通过域名系统(Domain Name System, DNS)来完成的。
DNS 服务如果出现问题,将会出现上网异常的情况。一个经典的表现是打不开所有网站,但能正常登录 QQ。QQ 内置了腾讯服务器的 IP 地址,当无法通过 DNS 获取到服务器地址时,QQ 将直接通过保存的 IP 地址连接到服务器,因此在 DNS 服务异常时仍然可以正常登录。DNS 如果遭遇劫持,还可能导致访问部分网站时无法建立连接或者实际访问了另一个网站,这常常被作为监管手段在学校或者公司的内部网络实施。
由于使用 UDP 协议和明文传输,这样的 DNS 查询很容易受到攻击。一个简单的攻击方式是 DNS 抢答。不同于 TCP,UDP 协议不需要建立连接,也没有序列号,攻击者可以发送一个来源 IP 是 DNS 服务器的数据报,假装自己是 DNS 服务器。发出查询请求的主机将会接受 53 端口上第一个响应的数据报,因此攻击者在真正的回复到达之前发出伪装的数据报,即可达到欺骗的目的。
另一个 DNS 传输协议是 DNS-over-TCP/53,使用 TCP 替代 UDP 进行 DNS 查询。TCP 协议并不比 UDP 安全,即使建立了连接和使用序列号,明文传输的数据可被攻击者获取并且按照 TCP 协议的规则计算出可被接受序列号,同样可以进行攻击。同时,每次 DNS 查询都徒增了建立连接和释放连接的过程和资源开销,大大增加了 DNS 查询的成本,且性能有所下降,因此该协议并不流行。
2016 年,加密 DNS 标准 DNS-over-TLS (DoT) 出现,利用 TLS 来保护整个连接,而不仅仅是 DNS 有效负载。该协议使用 TCP 端口 853。
2018 年引入了 DNS 查询传输的竞争标准 DNS-over-HTTPS (DoH),通过 HTTPS 隧道传输 DNS 查询数据。该协议使用与 HTTPS 协议相同的端口 443,因此看起来类似于网络流量,更不容易被区分出来。
DoT 和 DoH 加密了查询请求的全过程,可以保护数据在 DNS 服务器和主机之间的传输不受篡改,也可以有效避免抢答。
加密 DNS 可以防止 DNS 污染,但不能帮助你翻越长城防火墙。
在设备上配置 DoT/DoH
在设备上使用相应服务商的 DoT/DoH 应用,例如 Cloudflare WARP,可自动配置和路由设备的 DNS 查询。或者使用下面的方式手动配置。
在 iOS,iPadOS 和 macOS 上,Apple 没有提供手动配置加密 DNS 的开关,但可以通过配置描述文件进行配置。配置描述文件是一个由有效负载组成的 XML 文件(以 .mobileconfig 结尾),这些有效负载可将设置和授权信息载入到 Apple 设备上。
以 Cloudflare DNS 为例。参考 Apple 官方文档编写配置文件 Cloudflare DNS Encryption.mobileconfig。读者可以检查下面的文本,确保里面没有出现恶意的配置。