OneDNS这么老的问题了,2024年网络环境和风险已经和以前发生了较大变化,写个新答案供参考&考古。
当前主要的DNS问题
目前国内网络用户主要面临的DNS问题来自两方面:
- DNS劫持
- DNS污染
DNS劫持
DNS劫持指在传输过程中直接实施中间人攻击,以返回攻击者指定的结果。攻击的实现方法有单纯的劫持和抢答,前者的实现方式是将DNS请求直接拦截并转发给实施者的服务器,后者则是由实施者在真正的结果返回前就抢先返回自己的请求。
这里进行一个简单的小实验,网络环境为云南昆明电信(AS4134),我们在本地向Google Public DNS请求解析http://google.com,在Powershell中执行命令:
nslookup www.google.com 8.8.8.8
返回的结果是:
这里返回的结果是:
[2001::1](IPv6)
31.13.94.49(IPv4)
先忽略IPv6结果,看一下这个31.13.94.49:
好家伙,这是一个属于facebook的IP,直接通过https访问也会发现该IP使用了facebook的证书。而Google自己的公共DNS不可不能正确解析自己的域名,这就说明我们的DNS请求并没有到达真正的8.8.8.8,我们的DNS请求遭到了劫持,劫持者返回了一个错误的结果。
DNS污染
DNS污染的源头来自DNS服务器,其返回了错误(受污染)的DNS解析结果,这里DNS服务器改为本地运营商云南电信的DNS(222.172.200.68)以避免劫持:
这个结果31.13.68.169仍然属于facebook(同一个B段地址),这就说明存在DNS污染,指定的DNS服务器返回了一个错误的结果。
保障DNS的方法
对抗DNS劫持:DoT和DoH
由于DNS请求是直接使用UDP协议明文传输,其本身非常容易遭受中间人攻击。为了加强DNS传输安全,互联网工程任务组(IETF)通过了两种基于TLS的DNS安全协议:
- DNS over TLS:通过传输层安全性协议(TLS)加密DNS请求,经TCP协议传输,简称DoT
- DNS over HTTPS:将DNS请求经带TLS加密的HTTP协议传输,简称DoH
从中间人的角度,对于DoT请求是一条以TCP协议建立的TLS连接,DoH请求则是一条HTTPS连接,由于TLS协议提供了传输安全性和完整性保障,中间人即使识别出DoT/DoH请求,也只能阻断连接,无法改变请求结果。
由于国内运营商普遍存在DNS劫持行为史,包括使用该技术以实现镜像用户流量、强制插入广告甚至实施跨站攻击(比如给weibo强行塞关注),强烈建议在任何情况下都启用DoT或者DoH。除非你是DNS延迟侠,宁愿牺牲DNS的安全性也要追求极低的DNS延迟。
目前Windows、Android和ios均已支持DoT和DoH,多家国内国外的知名公共DNS服务商也已经实现队DoT和DoH的支持。
国内:
服务商 | 地址 |
---|---|
阿里公共DNS | 223.5.5.5 223.6.6.6 http://dns.alidns.com |
DNSPod公共DNS (腾讯) | 1.12.12.12 120.53.53.53 dot.pub |
OneDNS | http://dot-pure.onedns.net http://doh-pure.onedns.net |
360DNS | 不推荐 |
国际:
服务商 | 地址 |
---|---|
CloudFlare | 1.1.1.1 1.0.0.1 |
8.8.8.8 8.8.4.4 dns.google | |
Quad9(IBM) | 9.9.9.9 149.112.112.112 http://dns.quad9.net |
OpenDNS(原Cisco Umbrella) | 208.67.220.220 208.67.222.222 |
*在使用DoT或DoH时,DNS服务器地址建议直接使用IP而非域名避免二次DNS请求
对抗DNS污染
DNS污染来自源头(DNS服务器),一个折衷的办法是使用DoH访问那些还可以访问的国际公共DNS,因为DoT通常使用853端口很可能被直接禁用,而DoH则使用常见的HTTPS传输数据。
目前暂时还可以通过DoH访问的公共DNS服务器有:
- Quad9
- OpenDNS
- CloudFlare(不推荐,存在故意劣化连接质量&本身路由较差)
*仅在近期在浙江和云南使用电信/联通/移动网络测试过可用性,不保证长期效果或者全国适用
不过这样会导致DNS延迟增加,影响日常使用体验。
更有效的解决方案是使用MosDNS或者SmartDNS之类的DNS分流方案,对于国内/国外域名,向不同的上游DNS发送请求。MosNDS还支持同时使用多个上游服务器和缓存功能,可以部署在路由器上(目前国内的公共DNS服务器已经全部限制DoH/DoT请求频率)。