使用DNSCrypt选择最佳的DoH Resolver,解决DNS污染问题
- 发表于
- 周边
DNS劫持,DNS污染
在国内很常见。除了用来屏蔽一些国外的网站,还有如劫持百度统计的域名。因为国内大多数网站都使用百度统计,而使用百度统计需要从百度的网站加载一段JavaScript。部分运营商通过DNS劫持,重定向该请求到自己的服务器,并返回一段包含有广告代码的JavaScript,用于弹窗、推广等广告活动。
我一直使用USTC的DNS进行域名解析,虽然无法防止记录和中间人工具,但大多数常用网站的解析结果还算权威。然而,最近半年发现USTC的DNS也被污染了:
C:\Users
λResolve-DnsName -Server 202.141.162.123 www.google.com
Name Type TTL SectionIPAddress
---- ---- --- ----------------
www.google.com A157 Answer 74.86.228.110
C:\Users
λResolve-DnsName -Server 202.141.178.13 www.google.com
Name Type TTL SectionIPAddress
---- ---- --- ----------------
www.google.com A154 Answer 74.86.228.110
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(EDNS Client Subnet)支持情况
ECS是Google提交的一份DNS扩展协议,CDN的DNS如果支持该协议,就可以根据用户的真实IP地址,返回最佳的CDN服务器地址。 ECS对于国内的用户来说还是比较重要的,比如dl.google.com、fonts.googleapis.com等在国内由服务器,如果解析到国外访问网站的速度会比较慢。
为此,我写了个简单的脚本,解析dnscrypt-proxy中public-resolvers的DoH查询连接(目前只做了IPv4),并使用dl.google.com进行测试,检测响应时间和ECS的支持情况。效果如下:
DNSCrypt客户端支持情况
支持还算比较全面,基本可以说全平台支持了,更多信息
名称 | 作者 | 协议 | 平台 |
---|---|---|---|
DNSCrypt-Proxy | Frank Denis (@jedisct1) | DNSCrypt and DoH | Linux, BSD, Windows, macOS, Android and more |
DoH-proxy | DoH | Linux, BSD, Windows, macOS and more | |
Pcap_DNSProxy | DNSCrypt | Windows, Linux, macOS and OpenWrt/LEDE | C++ |
YourFriendlyDNS | DNSCrypt | Linux, Windows, macOS and Android | C++ |
Simple DNSCrypt | DNSCrypt and DoH | Windows | C# |
dnscrypt-proxy switcher | DNSCrypt | macOS | Shell |
DNSCloak | DNSCrypt | iOS | |
DNSCrypt proxy on Android | DNSCrypt | Android |
DNSCrypt应用截图
iOS
IOS下的DNSCrypt支持也还算可以,有faster-internet,DNSCloak,Intra等,当然这是美区才有的。
Firefox
较新版本的Firefox中,可以直接在网络连接设置里开启DoH,并能够自行选择DoH Resolver:
开启后,可以通过about:networking#dns查看解析情况。详细配置参考这里。
一些问题
使用过程中,DNSCrypt会遇到如下问题:
网络连接认证
部分公共网络(机场、酒店、咖啡厅)和公司网络在连接的时候需要进行认证,少部分认证方案通过DNS劫持实现,通过劫持HTTP的请求,重定向到认证页面。因此,在这种情况下,DNSCrypt会导致页面无法弹出,需要临时关闭DNSCrypt完成认证。目前还没发现更好的解决方案。
本文内容算是之前写的DNS文章的扩展,相关工具其实在之前有简单的提到,原因众所周知的原因现在又提到了,你们懂。
原文连接
的情况下转载,若非则不得使用我方内容。