相信“DNS分流”与“DNS泄露”这两个关键词,是爱折腾用户群体经常会听到的,几乎每次都会围绕“是否有必要”这个观点出现争论,几乎看不到从技术原理上做分析的。
虽说是技术原理分析,但本文更多讲的是逻辑,身为DNS分流策略的作者之一,希望这篇文章能够终止那些毫无意义的争论。
【分流器】
首先讲解的是分流器,因为只有先搞懂分流问题,才能理清争论的问题所在。
分流器主要有两种用途:分流哪些网站需要通过透明代理访问、分流DNS解决结果污染问题。
很多人会将这两种用途混为一谈,因为主流的代理工具,默认都会使用代理服务器的DNS远程解析走代理的域名,所以只要这个域名是通过代理访问的,就不存在DNS分流的问题,这也是“DNS分流无用论”的由来。
但实际上,这只对IP分流有效,也就是常说的”绕过大陆IP白名单”分流模式。
因为如果代理使用“域名黑名单”分流模式,黑名单只是记录了被阻断的域名,被污染的域名有一定概率不在黑名单中,此时就需要使用DNS分流来解决污染问题了。
那么IP分流是不是可以解决一切问题呢?
答案是可以解决问题,但可能会因DNS泄露而不安全。
需要说明的是,这里讲的DNS泄露,并不是打开某些DNS检测网站查看节点那么简单,文章后面会讲解DNS泄露的安全问题。因为只有先了解IP分流的过程,才能搞清楚安全问题究竟在哪。
【IP分流】
IP分流的用途是什么?并不是单纯用于区分哪些IP走代理,因为我们平时更多是通过域名访问互联网的,如果想用IP分流去判断哪些域名通过代理访问,那就必须要对域名先进行一次解析,获取IP后再分流。
此时出现两种选择:
方案一、IP分流时首次使用国内DNS解析
这种方式的原理,是利用“DNS污染结果不会出现大陆IP”这一特征,将所有返回非大陆IP的域名,全部使用代理或加密请求国外DNS,最终返回无污染的结果。如果仅使用IP分流,国内运营商会有用户访问已阻断网站的解析记录,当然可以通过补充“域名分流名单”来尽可能规避这一问题,但这个名单真的够全么,如果某个已阻断的域名不在名单里,意味着访问某个被屏蔽网站的行为已被国内运营商记录,这才是DNS泄露真正的问题所在。
方案二、IP分流时首次使用海外DNS解析
这种方式可以解决上述DNS泄露的问题,但依赖国内域名与CDN名单是否够全,不然会导致很多国内域名解析缓慢,另外请求海外DNS一般会通过代理,这将造成部分国内有CDN的域名解析到海外减速,再加上请求海外DNS延迟很高,所以基本上常见分流规则不会采用这个方案。
【DNS泄露】
此时DNS泄露的原因找到了,正是因为采用了上述的方案一,DNS检测站点绝大部分在海外,所以会先请求一次国内DNS解析域名,判断返回海外IP后再请求海外DNS,检测网站上也就会同时显示国内与海外的DNS了。
上述分流方案总结:
方案一 -> 速度快,不安全,有概率会被运营商掌握海外站点的访问记录
方案二 -> 速度慢,但安全,即使海外DNS也只能获取代理IP的访问记录
【DNS分流】
那么有没有更好的方案呢?这时DNS分流的价值就体现出来了。
DNS分流器与代理分流器有所不同,DNS结果是可以缓存的,还可以通过ECS获取域名较近的CDN节点IP,所以可以改进方案二,本地自建DNS服务,优先使用域名分流,未知域名再使用IP分流。
DNS的IP分流,使用海外DNS进行首次查询并传输本地客户端的ECS,返回离本地客户端最近的结果,同时走代理的域名依旧会在代理服务器上解析,返回离代理服务器最近的结果,最后开启本地DNS的乐观缓存功能。
此时,当使用代理工具时,出现某个已阻断又不在名单里的域名,代理工具的IP分流就会去调用本地自建的DNS,而本地自建的DNS则会去调用海外DNS并缓存结果。
当然,本地自建的DNS也可以去调用一些延迟低的无污染小众DNS,这样既保证了响应速度,又不会被本地运营商记录,问题最终得到了解决。