浅谈 DNS 泄露

什么是DNS泄露

关于DNS泄露的概念,这里引用维基百科的解释:A DNS leak is a security flaw that allows DNS requests to be revealed to ISP DNS servers, despite the use of a VPN service to attempt to conceal them. Although primarily of concern to VPN users, it is also possible to prevent it for proxy and direct internet users.(DNS泄漏是一种安全漏洞,允许DNS请求被暴露给互联网服务提供商(ISP)的DNS服务器,尽管用户使用VPN服务试图隐藏这些请求。虽然这主要是VPN用户关注的问题,但对于代理和直接上网用户,也可以采取措施来防止DNS泄漏。)

举例来说,当你在使用VPN等代理工具时,主机的DNS请求被发送送给了运营商的DNS服务器或者是公共DNS服务器(阿里、腾讯等)进行解析,而你的真实IP地址和请求的域名都会被记录下来。如果DNS请求的域名是国内的,那么还算正常,但如果长期DNS请求解析一些敏感网站的域名(比如电报、维基解密等),就会被监管者注意到,从而被警告或者请去喝茶。

因此,正确地配置代理工具的分流策略来避免DNS泄露就显得尤为重要。

如何检测DNS泄露

可以通过访问以下三个网站中的任意一个网站来检测自己的DNS是否泄露(推荐第一个,检测速度最快):

需要观察返回的DNS服务器的IP所属国家和节点IP所属国家是否为同一个,如果全部相同,则说明没有DNS泄露,如果出现了多个不同位置的DNS服务器,则说明很有可能DNS泄露了。

alt text

DNS泄露检测原理:当访问泄露检测网站时,该网站会随机生成多个不同的泛解析子域名。本机会将这些子域名的解析请求发送给配置的上游DNS服务器。由于这些子域名在上游DNS服务器中不可能存在缓存,因此服务器必须进行递归查询,向其上游的多个DNS服务器发送请求,直到请求到达泄露检测网站的权威DNS服务器。此时,权威DNS服务器会记录下发起请求的源DNS服务器的IP地址,并将其与请求的域名关联。最后,检测网站会将源DNS服务器的信息显示在浏览器上,从而判断是否存在DNS泄露。

alt text

黑/白名单模式

代理模式主要分为黑名单和白名单模式,黑名单模式就是只对黑名单中的域名进行代理,黑名单外的域名一律直连,白名单模式就是只对白名单中的域名进行直连,白名单以外的域名一律代理。在性能方面,白名单模式要优于黑名单模式。同时白名单更适合主要访问国外网站的自建节点用户,而黑名单更适合偶尔访问国外网站且流量有限的机场用户。在V2ray中,白名单模式被称为“绕过大陆”模式,在Clash中,当YAML配置文件中最后一条”MATCH”的路由是”DIRECT”时,就代表是黑名单模式,反之是白名单模式。

黑名单模式

以Clash为例,首先讨论他的黑名单模式。在黑名单模式下,当所有规则都没有匹配到要访问的域名的时候,默认”MATCH”会走”DIRECT”直连出去,由于泄露检测网站 https://browserleaks.com/dns 没有写进分流规则中,因此该网站默认直连不走代理,同时该网站显示的所有DNS服务器应该和真实IP地址在同一国家,也就是都显示为中国国旗:

alt text

从上图可看到结果并不符合预估的情况,虽然网站显示的本机IP是直连后的中国IP,但是DNS服务器却出现了美国的,那么这算DNS泄露吗?当然不算,因为该网站根本就没走代理,那为什么会出现美国的DNS服务器呢?原因就在于Clash的配置文件中的DNS部分配置了境外的DNS服务器:

alt text

从上图可以看到fallback字段中配置了谷歌和Cloudflare的dns和dot,fallback设计用于降低DNS污染,当nameserver中的DNS服务器解析出来的IP的归属地为国外时,就会采用fallback中DNS返回的IP,因为国内DNS服务器返回的国外IP很有可能是受污染的IP。由于Clash早已淘汰了redir-host模式转而使用了fake-ip模式,需要代理的域名的DNS请求一律由远程节点处理,而本机则会从 198.18.0.1/16 地址段中获取一个保留地址,因此fallback字段中也可以使用国内的DNS服务器(推荐使用运营商DNS):

alt text

此时强迫症再去访问泄露检测网站就看不到国外的DNS服务器了(如果IP未更新,使用Ctrl + F5强制刷新):

alt text

白名单模式

Clash的白名单模式下,当所有规则都没有匹配到要访问的域名的时候,会走代理出去。由于泄露检测网站 https://browserleaks.com/dns 没有写进分流规则中,该网站默认将不走代理,同时由于Clash默认使用fake-ip模式,即本地不进行DNS请求,最终表现为检测结果中只有和节点同一国家的DNS服务器:

alt text

从上图可以看到fake-ip模式下DNS泄露得到了解决。

fake-ip 的缺陷

由于fake-ip默认从 198.18.0.0/15 这个用于基准测试的保留地址段中选取地址返回给请求的应用程序,这会导致部分应用程序由于没有真实IP地址而影响工作。比如终端中的pingnslookup命令将失效,还有nmap等端扫工具也会出错(直接对IP进行扫描会超时)。解决办法也有,桌面端的Clash可以关闭系统代理以及Tun模式(伪VPN隧道模式)然后浏览器配合 Proxy SwitchyOmega 3 扩展使用。路由器上的OpenClash可以开启”绕过中国大陆IP”功能。或者直接编辑Clash配置文件,将直连域名添加到fake-ip-filter字段中。

关于透明代理的补充

虽然解决了DNS泄露,避免了网络监管者知道自己的访问了哪些网站,但是对于一些检测严格的网站,还会通过识别系统时区、显示语言来判断用户是否在使用代理访问网站,因此推荐使用以下浏览器扩展来完善代理的伪装:

更改Google Chrome™的时区:可以自动根据用户的IP地址切换时区。
Locale Switcher:修改浏览器语言环境。

要实现更安全的网页浏览建议使用指纹浏览器、洋葱浏览器等。