本来我没有太关注 DNS 污染或 DNS 劫持,大慨了解一些,但不是很清晰,直到前几天自己的办公电脑“中招”了(后面发文详述),才开始重新好好学习一番。DNS 是 Domain Name Server 的意思,也就是域名解析服务的意思,这里不多解释了,因为你如果是通过搜索 DNS 劫持污染进来的,那么相信你一定了解了什么是 DNS 这个最基本的概念,本文着重解释下 DNS 污染与 DNS 劫持以及两者的区别。

什么是DNS劫持

  DNS劫持:DNS Hijacking。就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。

  DNS劫持症状:在某些地区的用户在成功连接宽带后,首次打开任何页面都指向ISP提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问Google域名的时候出现了百度的网站。这些都属于DNS劫持。

  举个例子易于理解:说到劫持,我们可能联想到一个坏蛋劫持了DNS服务器,拿着刀架在脖子上。这时候你问DNS服务器,博主帅吗?(发出请求)。DNS服务器听到了,他心里的答案是,好帅哦(返回正确ip地址)。由于坏蛋控制了他,并且对他做了修改。所以DNS只好不情愿的说,你真丑(错误的ip地址)。这个过程中,你和DNS服务器之间,一来一回,流程上没有任何问题,唯一的问题就是,DNS服务器告诉了你错误的ip地址。DNS也不想啊,但是有人控制了他的权限,或者修改了他的记录值等等。我们称为DNS劫持。类似我们使用网络的时候,明明访问的是普通网站,却突然跳到什么电信什么宣传页面一样。

DNS劫持示意图

什么是DNS污染

  DNS污染,又称为域名服务器缓存污染(DNS cache pollution)或者域名服务器快照侵害(DNS cache poisoning)。 DNS污染是指一些刻意制造或无意中制造出来的域名服务器分组,把域名指往不正确的IP地址。它是一种让一般用户由于得到虚假目标主机IP而不能与其通信的方法,是一种DNS缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的DNS查询没有任何认证机制,而且DNS查询通常基于的UDP是无连接不可靠的协议,因此DNS的查询非常容易被篡改,通过对UDP端口53上的DNS查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。DNS污染是发生在用户请求的第一步上,直接从协议上对用户的DNS请求进行干扰。

  DNS污染症状:目前一些被禁止访问的网站很多就是通过DNS污染来实现的,例如YouTube、Facebook等网站。

  还是举个例子易于理解:这招是GFW常用的。你访问google.com 因为人家服务器在国外,你的DNS过去解析,肯定要走国际带宽的出口,然后就被GFW逮住了。因为DNS 走的是UDP协议,且UDP又没有什么校验机制,只管发送。所以这时候,GFW就假装成DNS服务器回应你了,而此时真正的请求可能正在被真正的DNS服务器处理,假的已经返回给你了,浏览器就选择了最快返回的那个地址去解析了。当然是一个不可用的地址啦。

  因为DNS 走的UDP协议,并且是53端口,所以这有多好发现也就不言而喻了。如果你强行让DNS走TCP协议,GFW 有办法让你连接重置,虽然污染不了你的DNS,但是你还是无法获得ip。

  也就是为什么有一种FQ方式就叫修改host 文件,修改后,域名不需要去DNS服务器请求了,直接在你的操作系统里就已经解析出了ip 地址。但是,GFW还是会定期封杀这些网站的ip地址,你的host就没用了。

DNS污染示意图

DNS劫持与污染的区别

  DNS劫持——就是指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为。范例,网通、电信、铁通的某些用户有时候会发现自己打算访问一个地址,却被转向了各种推送广告等网站,这就是DNS劫持。

  你去解析一个不存在的域名的时候,DNS 本来应该告诉我们这个域名不存在,但是被劫持后 DNS 就会给我们解析出一个 IP。常见的情况就是电信 114 搜索。解决方法就是换成 Google DNS 就可以了解决了。

  DNS污染——指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。范例,访问Youtube、Facebook之类网站等出现的状况。

  你使用一个不存在的 IP (肯定不是 DNS )作为 DNS 去解析某个域名的时候,理应没有任何返回,但是却能返回一个错误 IP。为了证明是污染不是劫持,你再用这个不存在的 IP 去解析不存在的域名,这个时候你会发现没有任何返回,这就说明这个不存在的域名没有被污染。解决方法就是 DNSCrypt 什么的了。