为什么国内DNS部分域名无法解析
最近上网,发现一些域名,在使用国内DNS服务器时无法解析,但使用海外DNS却可以解析。看起来不像是 DNS污染,因为DNS污染是直接给你一个错误的结果,不管你用的哪里的DNS,那是怎么回事呢。用海外DNS查询了一下这些域名的NS记录,发现它们的 NS服务器因为未知原因都无法连接了。尤其是Godaddy的NS,从ns01.domaincontrol.com到 ns70.domaincontrol.com都阵亡了。我的blog的域名就是在Godaddy申请的,现在只能把域名托管到其他的NS服务商那里了。 ╮( ̄▽ ̄”)╭
那么,为什么这些域名在国外的DNS能解析而国内就不可以了呢。这要从DNS的工作原理说起。
DNS递归查询和迭代查询
客户机向DNS服务器发出域名查询请求,DNS服务器直接向客户机返回结果,这种查询叫做递归查询。而DNS服务器自身查询根域名服务器时,根域名服务器不会直接给DNS服务器结果,而是告诉DNS服务器应该找哪个下级域名服务器,DNS服务器自己去找那个下级域名服务器去查询,直到得到查询结果,这种查询方式叫做迭代查询。 查询方式一般是这样的,根域名服务器返回顶级域名服务器的地址,然后DNS服务器再查询这个顶级域名服务器。顶级域名服务器返回该域名所在的NS服务器 (就是你在域名注册商那里设置的NS记录),接着DNS服务器继续查询返回的NS服务器,NS服务器最终返回查询结果。最后DNS服务器把结果返给客户 机,并把这次查询结果记入缓存,下次接收到相同查询请求时直接返回该结果。根域名服务器只接受迭代查询,因为全世界就13台根域名服务器,如果提供递归查 询肯定受不了。
了解了原理,我们很容易明白,当DNS服务器进行迭代查询时,如果无法访问对应的NS,当然就无法解析了。而海外DNS服务器能访问这些NS,因此可以顺利解析(只要GFW不对你查询的域名进行污染)。
解决方案
如果你是域名所有者,你可以把域名托管到国内可以正常访问的NS上,其实大多数NS服务都是免费的,比如国外的FreeDNS、he.net,国内也有DNSPod服务,也很不错。这样就可以确保你的域名能被正常解析。
如果你不是该域名的所有者,并且经常访问这个网站,那么简单一点的方式就是使用海外DNS了,比如OpenDNS或者Google Public DNS。但是使用海外DNS可能会导致使用CDN为不同地区加速的网站访问速度变慢,所以请权衡。当然你也可以修改hosts,但是hosts不支持通配符,也不能返回MX记录,所以如果这个域有很多子域那会累死人的,而且网站换了IP还得一个一个改……不过如果你依照我这篇文章配置了本地DNS,你也可以添加一个forward记录把这个域的查询请求转发给别的DNS服务器。例如abc.com无法在国内解析,但是能被谷歌的8.8.8.8解析,那么,你可以在Unbound的配置文件末尾添加
1
2
3
|
forward-zone:
name: “abc.com”
forward-addr: 8.8.8.8
|
这样,就把abc.com域(包括所有子域)的请求全部转发至8.8.8.8。8.8.8.8会把结果返回给你本地的DNS,这样这个域名就成功解析了。