本文计划同步发送在微信公众平台上,标题为《拿什么来保卫网络隐私的底裤:DNS劫持与应对》。
写下本文的起因在于上周末笔者本人的经历。在调试服务的时候,笔者突然发现与服务器的连接经常自动断开,甚至死活连不上。排除了服务器端的问题后,经测试,最终发现问题出在学校网络的DNS解析上。通过nslookup查得DNS间歇将我的域名解析到了其他IP地址上,且手动指定阿里巴巴和腾讯DNS无效,初步判定遭到DNS污染。
凡是上网,必然要用到DNS查询,所有访问的域名均要被发送给DNS服务器以获得其指向的地址,你访问了什么小网站,你的房东、老板、学校机房等等通过劫持你的DNS查询数据都可能知道。虽然迟早会被看光,但至少得让房东、老板这种小杂鱼偷看起来没那么容易。
太长不看——结论部分
目前DNS加密是应对DNS污染的主要应对措施(另一种是DNS代理)。对于不同的操作系统,有不同的应对方式,这里先写在文章开头,一些解释的部分放在文章后面。国外的DNS服务商的DoH和DoT服务基本无法访问了,所以本文主要推荐使用阿里和腾讯两家的DNS。
iOS系统
下载修改DNS over TLS或者DNS over HTTPS的描述文件,并添加至系统、启用。目前我自己在使用的是阿里DNS的描述文件:
下载地址:https://cdn.jsdelivr.net/gh/paulmillr/encrypted-dns@master/alibaba-https.mobileconfig(复制链接并使用iOS的Safari浏览器打开,如果不放心,可以查看源代码之后再信任)
Android
前往:设置→无线和网络→选择指定加密 DNS 服务(或私人 DNS)→填入tls://223.5.5.5
或https://doh.pub/dns-query
或tls://
经同学测试,直接填入dot.pubdot.pub
即可
Windows 和 macOS
在网络面板设置DNS(可以参考这篇推送)可以防止默认DNS服务器的无心之失,但对于故意的DNS污染则无能为力。
目前,最为便捷的方式是使用Google Chrome浏览器、Firefox浏览器或者新版Edge浏览器,在设置中打开DNS over TLS/HTTPS:
- Chrome:设置→隐私设置和安全性→高级→打开“使用安全的 DNS ”开关→选择“自定义”→填写
tls://223.5.5.5
或https://doh.pub/dns-query
或tls://dot.pub
- Edge:设置→隐私、搜索和服务→打开“使用安全的 DNS 指定如何查找网站的网络地址”开关→选择“自定义”→填写
tls://223.5.5.5
或https://doh.pub/dns-query
或tls://dot.pub
Adguard Home
感兴趣、有时间的朋友可以使用Adguard Home,净化本机的DNS,并拦截广告。(这也是笔者目前采用的方案)具体步骤如下:
- 安装Adguard Home并启用
- 登录Adguard Home后台
- 前往设置→DNS设置,在上游DNS设置处填写:
https://dns.alidns.com/dns-query
tls://dns.alidns.com
https://dns.pub/dns-query
- 在网络面板设置DNS为运行Adguard Home设备的IP地址
Adguard Home在Windows、macOS和Linux操作系统下均有客户端,详细设置步骤务必参考官方中文说明:https://adguard.com/zh_cn/adguard-home/overview.html
下面是一些细节,供有兴趣的朋友阅读。
什么是DNS,它和我的隐私有什么关系?
什么是DNS
通俗来说,DNS的任务就是将域名指向对应的IP地址。传统的DNS解析过程类似于喊话问路——
电脑:“老王(DNS服务器)!www.baidu.com(域名)哪里走” ←DNS请求
三秒(响应时间)后,老王:“www.baidu.com(域名)指向的是111.111.111.111(地址)” ←DNS应答
DNS的易被污染性
在上面的过程中,可能会出现老王不认识路,回答了一个错误的地址的情况。这时候,如果找另外的人(另行设置DNS服务器),则可以解决老王不认路的问题。但是,这种方法对于更加恶劣的应答者并不奏效:假设有一个李田所(污染者,经常是运营商),想要故意误导你的网络流量,李田所可以采取抢答的办法,因为一般情况下李田所离电脑更近,先接到DNS请求并先回答,有时候李田所(污染者)可能直接伪装成老王来回答,于是就会变成下面的情况——
电脑:“老王(DNS服务器)!www.baidu.com(域名)哪里走” ←DNS请求
一秒(响应时间)后,李田所抢答:“www.baidu.com(域名)指向的是111.122.133.144(错误地址)” ←抢答
三秒(响应时间)后,老王回答:“www.baidu.com(域名)指向的是111.111.111.111(地址)” ←DNS应答(←被计算机废弃、或者被拦截的正确回答)
于是,你的电脑无论如何也找不到正确的地址了。
DNS的易被监控性
和https不同,DNS请求默认是不加密、不验证的,类似于人在山这头喊话,山里的所有人想听都能听见,而且内容是明文,谁都能听得懂。这也导致了你如果用校园网上网,学校网管基本就能知道你在访问什么不良网站。
解决方法
污染种类 | 局部DNS污染 | 全局DNS污染 |
来源 | 运营商(地区) | 。。。 |
应对方式 | DoH,DoT | 代理DNS查询流量 |
目前可行的方法总体的目标是:简单更改DNS(对于DNS污染无效)、改变DNS查询流量明文的特点,通过加密、认证的方式,解决抢答、冒答问题。具体方法包括:利用https协议的DNS over HTTPS(DoH),利用TLS加密协议的DNS over TLS(DoT),通过代理软件查询DNS流量。比较便捷的还是DoH和DoT两种。
DoT使用 TLS 协议来传输 DNS 协议。TLS 协议是目前互联网最常用的安全加密协议之一,我们访问 HTTPS 的安全基础就是基于 TLS 协议的。相比于之前使用无连接无加密的 UDP 模式, TLS 本身已经实现了保密性与完整性。
DoH使用 HTTPS 来传输 DNS 协议。DoH 的安全原理与 DoT 一样,他们之间的区别只在于:DoH有了 HTTP 格式封装,更加通用。
总体来说,通过DoT和DoH,至少在本机和DNS服务商中间环节不太有可能出现DNS劫持等现象了。