玩软路由不折腾DNS是没有灵魂的。

———我说的

DNS泄露可以说是DNS界的热门话题了,可以说玩DNS这一步几乎是躲不开的,在使用了代理软件后DNS泄露的问题要稍微严重一点。

什么情况算是DNS泄露了

先放两个测试DNS泄露的网站
https://ipleak.net/
https://browserleaks.com/

这类的网站会显示一个你访问这个网站使用的IP,以及一大堆的你正在使用的DNS服务器地址,就像上一期提到的,这些DNS服务器的地址都是DNS出口服务器,不认识很正常。

判断是否有DNS泄露的简单方式就是看DNS服务器列表里是否有国内的服务器,前提是使用了代理或者是DNS分流。

比如你人在中国大陆使用了香港的代理服务器,访问网站后显示你的IP来自于香港,但是列表里却出现了中国大陆的DNS服务器。

一个比较常见的顾虑是能通过这些DNS服务器的解析日志判断一个人是否使用了代理服务器,这个问题不大,因为这些DNS服务器每天要为很多人提供服务,就算有记录也很快被盖过去了,而且还有各种海外安卓手机,海外电视盒子内置的软件产生的域名解析记录,以及各路大神测试软件时产生的各种记录,更不用说还有NAT保护,也就是说想要根据公共DNS的解析日志来判断一个人是否使用代理其实是不太现实的,但是小心点总没坏处。

对于DNS服务器来说,使用 nslookup 命令测试 google.com DNS解析和直接在浏览器访问 google.com 其实是差不多的。

问题主要出在另一方面,出现在DNS列表里的服务器都是能为你提供域名解析的服务器,如果其中的某些服务器篡改了解析结果也是有可能影响到你的,从这一方面来看还是有必要处理一下DNS泄露的(如果条件和能力允许的话)。

泄露测试的原理

ipleak.net 为例:

首先生成一个带有随机字符的域名并记录下来,然后让浏览器去访问。

格式差不多是:随机字符.ipleak.net

比如:49fs953rttyi2in223xl910ke6g482q1vb1s-102.ipleak.net

因为这是一个随机生成的域名,所以几乎不可能有DNS服务器缓存了它,浏览器发出的域名解析请求最终一定会到达 ipleak.net 的权威域名服务器。

就像上一期的提到的,根据你的网络环境配置,总会有一个或者多个DNS服务器收到你的域名解析请求,而这些DNS服务器会选几个出口服务器替你完成解析,而 ipleak.net 的权威域名服务器就会收到这些出口服务器的解析请求。

用来测试DNS泄露需要一个功能上有些特殊的权威域名服务器,这个权威域名服务器会记录下所有来解析域名的出口服务器的IP,然后交给泄露测试的网站后端,后端根据一开始的域名生成记录筛选出帮你浏览器解析域名的出口服务器列表并输出到网页中。

域名生成的随机性很大,可以说是每一次访问生成的都是独一无二的域名,因此不太可能有人碰巧解析了和你一样的域名,也代表只要有人请求解析了这个域名就可以肯定这就是你发出的。

原理仅供参考,不同的测试网站工作逻辑可能会有所不同。

泄露测试的局限性

不难发现,测试只能反应 ipleak.net 的域名解析是否泄露,只在你的网络环境对DNS解析是一刀切(即未对域名解析进行任何的分流)的情况下测试结果才有参考性。

换一种说法,由于DNS分流大多是按照域名列表进行分流,而网站用于测试的域名可能没被收录到列表中,所以会出现有DNS泄露的情况,但实际上主要的海外网站都使用了海外组解析并没有泄露,如果是其他没被收录的网站因为热度小即使泄露了也没什么问题(具体要看自己的DNS分流策略)。

在有DNS分流时泄露是如何发生的?

在有分流的情况下要看测试域名,测试域名处于哪个列表,测试结果就是哪个列表的泄露情况。
比如:测试域名被收录到海外域名列表中,那么测试结果则是这个列表的泄露情况,没有国内服务器就代表着海外域名DNS请求处理得当没有泄露。

如果没在自己的任何列表中则表明测试结果反应的是陌生域名的泄露情况,按照不同的分流方案基本就以下三种可能:

  • 使用国内/本地DNS进行解析
  • 使用国外/远程DNS进行解析
  • 同时使用国外与国内组,根据两组结果决定采用哪一组

简单来说就是DNS分流策略对不在任何列表的陌生域名的处理办法。

使用国内组解析,测试结果就是全国内服务器。
使用海外组解析,测试结果就是全海外服务器。
两个都用结果就会两个都有。

而大多数泄露的基本都是这种两组全用的方法。

ChinaDNS 以及 Clash 的 fallback和nameserver 就是两组都用的方案。
这种方案对于一些陌生域名的处理比较合适,是泄露一些不那么重要的DNS请求换取冷门站点更好的访问质量。
工作逻辑大概是:同时使用两组解析,如果国内组返回了一个非中国大陆的IP,就采用海外组的结果,平常则使用国内组的结果.

如果你在用Clash那么可以利用nameserver-poliy选项进行域名分流,只有nameserver-poliy没有匹配到的域名才会使用fallback以及nameserver组同时解析,用法可以查看Clash(mihomo)的文档
其他的代理客户端基本都有一套自己的DNS分流策略,这里提一下Clash的只是因为这个选项知名度好像不怎么高。

结论

DNS有没有泄露是一个比较主观的问题,它实际上是错误地将请求发送给了其他DNS服务器,而本质上是你是否信任某个DNS服务器。