我先前曾经写了篇文章《使用OpenDNS解决DNS域名劫持》,经过我进一步的测试和使用,使用OpenDNS并不能解决所有的国外网站的域名解析错误问题,当目标域名同时被DNS(Domain Name System)劫持和关键字过滤的时候,OpenDNS解析的结果会在中途被污染,只有使用远程解析域名才能彻底解决DNS劫持的问题。
我测试的方式是,在国内网络使用OpenDNS,然后登陆我在国外的一台服务器,同时对某一个特殊网站执行nslookup命令。(nslookup命令的功能是查询一台机器的IP地址和其对应的域名。它通常需要一台域名服务器来提供域名服务。如果用户已经设置好域名服务器,就可以用这个命令查看不同主机的IP地址对应的域名)
我在国内使用nslookup之后显示的结果如下图所示:
而使用国外的服务器执行nslookup之后得到的结果如下图所示:
从上面两张图片我们可以看到,当目标域名同时被DNS劫持和关键字过滤的时候,在国内和国外使用对于同一个域名地址会解析出不同的IP地址,因此可以得出结论,在国内即使使用国外的OpenDNS,对于某些“特定”的域名,也不能解析出正确的域名IP地址,解析DNS的结果依然被电信控制。
不过,我们可以通过手动修改本地hosts文件,或者远程解析DNS来解决这种错误的域名解析,为什么要远程解析?这就涉及到了DNS污染技术。
DNS污染是一种让一般用户由于得到虚假目标主机IP而不能与其通信的方法,是一种DNS缓存投毒攻击(DNS cache poisoning)。其工作方式是:在UDP端口53上的DNS查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。由于通常的DNS查询没有任何认证机制,而且DNS查询通常基于的UDP是无连接不可靠的协议,查询者只能接受最先到达的格式正确结果,并丢弃之后的结果。对于不了解相关知识的网民来说也就是,由于系统默认使用的ISP提供的NS查询国外的权威服务器时被劫持,其缓存受到污染,因而默认情况下查询ISP的服务器就会获得虚假IP;而用户直接查询境外NS(比如OpenDNS)又可能被劫持,从而在没有防范机制的情况下仍然不能获得正确IP。
在Firefox中,设置远程解析DNS很简单,只需要在在about:config 改成 network.proxy.socks_remote_dns=true 就可以了。对于IE或者其他用户来说,需要安装一个名为SocksCap的软件,选中Resolve all names remot即可。
更新:OpenDNS之后发布了一个本地客户端工具,用于加密DNS通讯,因此使用DNSCrypt可以解决DNS污染问题。