感谢nnt大佬的分享
正巧之前有了解过,就尝试来解答一下,纯手打
我们都知道,DNS的查询过程是个递归的流程
比如说,当你要访问www.example.com,需要先知道example.com的NS,而这又需要.com的NS
整个过程需要几方配合:LDNS、ADNS
LDNS通常是运营商部署的默认DNS
当你访问www.example.com时,会向LDNS查询www.example.com对应的IP地址,而LDNS又会像根DNS服务器查询.com对应的NS,再通过查询.com对应的NS服务器查询example.com的NS服务器,最后向example.com的NS查询www.example.com的IP地址。在这个过程中,由于GFW会抢答最后两步的结果。
而在 查询 example.com 的NS服务器 过程中,很神奇的是GFW直接返回的是一个A记录的DNS响应包,并不是NS记录的响应包,如此一来,LDNS便并不会将其缓存起来,如此,每一次发送请求,即使每次都被GFW拦截,LDNS还是回去查询 example.com 的NS服务器。与此同时,由于GFW的抢答方式的特点,虽然GFW通常离LDNS更近,处理逻辑也更简单,但有时抢答包可能会比 LDNS向.com的NS服务器响应的包慢,虽然概率很小很小(<1%),但是通过不断的发NS记录的查询包,仍然有概率能够触发,这样一来,我们通过设置较长的ttl,来让example.com正确的NS记录能够在LDNS中缓存一段时间。
解决了 example.com 的NS抢答问题,还需要解决www.example.com的抢答问题。首先需要搞清楚,墙部署的位置:出境流量处。因为我们需要向.com的NS服务器查询example.com的NS,而.com的NS服务器在国外,所以会过墙。但通过上一个法子,我们已经将example.com正确的NS记录缓存到LDNS中,如果example.com的NS 服务器在国内的话,那么此查询过程将不会过墙,LDNS向example.com查询其子域www的DNS包便不会被抢答。
总的来说,此种DNS清洗方法的难度特别巨大:由于全国各地的LDNS非常多,而且都是不公开的,且有时仅允许同一个运营商的某一篇地区使用,这使得如果你想让全国大部分LDNS均能缓存住你的NS记录,就只能搜集非常多的ip,不断地向LDNS进行NS查询来实现。且缓存是有时间限制的,过期了就会被删除,并不能一劳永逸,想要用多久就要洗多久…
以上就是我对DNS清洗原理的理解。如果不对之处,欢迎指正,以上内容均来源于互联网相关资料搜集整理,非常感谢前人的探索工作。
留言