使用DNSCrypt选择最佳的DoH Resolver,解决DNS污染问题

  • 发表于
  • 周边

DNS劫持,DNS污染

在国内很常见。除了用来屏蔽一些国外的网站,还有如劫持百度统计的域名。因为国内大多数网站都使用百度统计,而使用百度统计需要从百度的网站加载一段JavaScript。部分运营商通过DNS劫持,重定向该请求到自己的服务器,并返回一段包含有广告代码的JavaScript,用于弹窗、推广等广告活动。

我一直使用USTC的DNS进行域名解析,虽然无法防止记录和中间人工具,但大多数常用网站的解析结果还算权威。然而,最近半年发现USTC的DNS也被污染了:

DNSCrypt

Dnscrypt 是一个认证 DNS 客户端和 DNS 解析器之间通信的协议。 它防止 DNS 欺骗。 它使用加密签名来验证响应来自选择的 DNS 解析器,并且没有被篡改。可以有效的阻止重放攻击、观察攻击、时序攻击、中间人攻击和解析伪造攻击。DNSCrypt相关的技术包括:

  • DNS over HTTPS:使用HTTPS进行DNS查询,利用HTTPS进行DNS查询的加密。
  • DNS over TLS:使用TLS进行DNS查询。
  • DNSSEC:依靠数字签名保证DNS应答报文的真实性和完整性。

以下是这半年多使用DNSCrypt的一些经验。

DoH Resolver选择

根据使用经验和个人需求,选择DNS服务器主要有以下指标:

ECS是Google提交的一份DNS扩展协议,CDN的DNS如果支持该协议,就可以根据用户的真实IP地址,返回最佳的CDN服务器地址。 ECS对于国内的用户来说还是比较重要的,比如dl.google.comfonts.googleapis.com等在国内由服务器,如果解析到国外访问网站的速度会比较慢。

为此,我写了个简单的脚本,解析dnscrypt-proxy中public-resolvers的DoH查询连接(目前只做了IPv4),并使用dl.google.com进行测试,检测响应时间和ECS的支持情况。效果如下:

使用DNSCrypt选择最佳的DoH Resolver,解决DNS污染问题
DoHVerifier测试结果

DNSCrypt客户端支持情况

支持还算比较全面,基本可以说全平台支持了,更多信息

名称作者协议平台
DNSCrypt-ProxyFrank Denis (@jedisct1)DNSCrypt and DoHLinux, BSD, Windows, macOS, Android and more
DoH-proxyFacebookDoHLinux, BSD, Windows, macOS and more
Pcap_DNSProxyDNSCryptWindows, Linux, macOS and OpenWrt/LEDEC++
YourFriendlyDNSDNSCryptLinux, Windows, macOS and AndroidC++
Simple DNSCryptDNSCrypt and DoHWindowsC#
dnscrypt-proxy switcherDNSCryptmacOSShell
DNSCloakDNSCryptiOS
DNSCrypt proxy on AndroidDNSCryptAndroid

DNSCrypt应用截图

使用DNSCrypt选择最佳的DoH Resolver,解决DNS污染问题
mac dnscrypt-proxy switcher for BitBar
使用DNSCrypt选择最佳的DoH Resolver,解决DNS污染问题
Windows的DNSCrypt客户端
Windows下的DNSCrypt支持是最多,也是体验最好的
使用DNSCrypt选择最佳的DoH Resolver,解决DNS污染问题
Xiaomi 5s with LineageOS

Android Pie(9.0)之后,可以通过设置页面开启DNSCrypt,不过仅支持DoT:

iOS

IOS下的DNSCrypt支持也还算可以,有faster-internet,DNSCloak,Intra等,当然这是美区才有的。

Firefox

较新版本的Firefox中,可以直接在网络连接设置里开启DoH,并能够自行选择DoH Resolver:

使用DNSCrypt选择最佳的DoH Resolver,解决DNS污染问题

开启后,可以通过about:networking#dns查看解析情况。详细配置参考这里

一些问题

使用过程中,DNSCrypt会遇到如下问题:

网络连接认证

部分公共网络(机场、酒店、咖啡厅)和公司网络在连接的时候需要进行认证,少部分认证方案通过DNS劫持实现,通过劫持HTTP的请求,重定向到认证页面。因此,在这种情况下,DNSCrypt会导致页面无法弹出,需要临时关闭DNSCrypt完成认证。目前还没发现更好的解决方案。

本文内容算是之前写的DNS文章的扩展,相关工具其实在之前有简单的提到,原因众所周知的原因现在又提到了,你们懂。