DNS-解析、劫持、污染

DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工做。在互联网中,是只存在IP的,IP其实就是一串数字,至关于你家里的门牌号,你们在网络中想找到你,必须经过这个,因此IP对于每一个人来讲是惟一的。可是第四代IP都是http://XXX.XXX.XXX.XXX这样的,多难记啊,谁会没事记住IP呢,更况且之后天那么长的IPV6,要记住不是得要人命!  这时候一个聪明的科学家出来,咱们给IP加一个别名,你们经过别名不就能够不记住这个IP,也能够知道这个IP了!因而就有了域名[Domain]这个东西。而NDS就是把域名翻译成IP的系统。html

一. 根域
  就是所谓的“.”,其实咱们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后有一点),通常咱们在浏览器里输入时会省略后面的点,而这也已经成为了习惯。
  根域服务器咱们知道有13台,可是这是错误的观点。根域服务器只是具备13个IP地址,但机器数量却不是13台,由于这些IP地址借助了任播的技术,因此咱们能够在全球设立这些IP的镜像站点,你访问到的这个IP并非惟一的那台主机。具体的镜像分布能够参考维基百科。这些主机的内容都是同样的

二. 域的划分
  根域下来就是顶级域或者叫一级域,
  有两种划分方式,一种互联网刚兴起时的按照行业性质划分的com.,net.等,一种是按国家划分的如cn.,jp.,等。具体多少你能够本身去查,咱们这里不关心。
  每一个域都会有域名服务器,也叫权威域名服务器。好比:
    baidu.com就是一个顶级域名,而www.baidu.com却不是顶级域名,他是在baidu.com 这个域里的一叫作www的主机。
    一级域以后还有二级域,三级域,只要我买了一个顶级域,而且我搭建了本身BIND服务器(或者其余软件搭建的)注册到互联网中,那么我就能够随意在前面多加几个域了(固然长度是有限制的)。好比a.www.baidu.com,在这个网址中,www.baidu.com变成了一个二级域而不是一台主机,主机名是a。linux


三. 域名服务器
  能提供域名解析的服务器,上面的记录类型能够是A(address)记录,NS记录(name server),MX(mail),CNAME等。能够查下它们的区别和联系。
  A记录是什么意思呢,就是记录一个IP地址和一个主机名字,好比我这个域名服务器所在的域test.baidu.com,咱们知道这是一个二级的域名,而后我在里面有一条A记录,记录了主机为a的IP,查到了就返回给你了。
  若是我如今要想baidu.com这个域名服务器查询a.test.baidu.com,那么这个顶级域名服务器就会发现你请求的这个网址在test.baidu.com这个域中,我这里记录了这个二级域的域名服务器test.baidu.com的NS的IP。我返回给你这个地址你再去查主机为a的主机把。
  这些域内的域名服务器都称为权威服务器,直接提供DNS查询服务。(这些服务器可不会作递归哦) windows

  

四 . 服务器关系大体以下浏览器

  [根服务器]:全球一共13个A-M[http://root-servers.net],储存着各个后缀域名的[顶级域名根服务器]
  [顶级域名根服务器]:每一个后缀对应的DNS服务器,存储着该[后缀]全部域名的权威DNS
  [权威DNS]:这个域名所使用的DNS,好比说我设置的DNSPOD的服务器,权威DNS就是DNSPOD。在WHOIS(一个查看域名信息的东西)中能够看到。储存着这个域名[对应着的每条信息] 如IP等~缓存

 

  根DNS是什么呢?你们想一想,每一个域名都有一个后缀,好比说ovear是[.info]后缀的。那么就有一个专门记录[.info]后缀的dns服务器,其余后缀也同样。这个DNS就是该域名的根DNS。

  那么递归DNS呢?其实递归DNS就是一个代理人,是用来缓解[根DNS]压力的,若是你们都去问[根DNS],那[根DNS]不早就跪了。毕竟一我的(网站)的地址不是常常变的,因此就有了TTL这一说法,根据DNS的规定,在一个TTL时间呢,你们就认为你家里(域名所指向的IP)的地址是不会变的,因此代理人[递归DNS]在这个时间内,是只会问一次[根DNS]的,若是你第二次问他,他就会直接告诉你域名所指向的IP地址。这样就能够解决[根DNS]负载过大的问题啦。服务器

 

  权威DNS:网络

  权威DNS是通过上一级受权对域名进行解析的服务器,同时它能够把解析受权转授给其余人,如COM顶级服务器能够受权xxorg.com这个域名的的权威服务器为NS.ABC.COM,同时NS.ABC.COM还能够把受权转授给NS.DDD.COM,这样NS.DDD.COM就成了ABC.COM实际上的权威服务器了。平时咱们解析域名的结果都源自权威DNS。好比xxorg.com的权威DNS服务器就是dnspod的F1G1NS1.DNSPOD.NET和F1G1NS2.DNSPOD.NET。dom


  递归DNS:工具

  负责接受用户对任意域名查询,并返回结果给用户。递归DNS的工做过程参见本文第二节。递归DNS能够缓存结果以免重复向上查询。咱们平时使用最多的就是这类DNS,他对公众开放服务,通常由网络运营商提供,你们都本身能够架递归DNS提供服务。递归DNS必定要有可靠的互联网链接方可以使用。好比谷歌的8.8.8.8和8.8.4.4以及114的114.114.114.114和114.114.115.115都属于这一类DNS。你本地电脑上设置的DNS就是这类DNS。醒醒的习惯是设置114.114.114.114和8.8.8.8这两个,更可靠一点。网站

  转发DNS:

  负责接受用户查询,并返回结果给用户。但这个结果不是按标准的域名解析过程获得的,而是直接把递归DNS的结果转发给用户。它也具有缓存功能。他主要使用在没有直接的互联网链接,但能够链接到一个递归DNS那里,这时使用转发DNS就比较合适。其缺陷是:直接受递归DNS的影响,服务品质较差。好比咱们用的路由器里面的DNS就是这一类,用路由器的朋友能够看下本地电脑的DNS通常都是192.168.1.1。

  递归服务器怎么知道根权威服务器的地址?

  很简单,在递归服务器上都保存有一份根服务器的地址列表。

  域名解析过程

  用户—本地递归服务器—根权威服务器—COM权威服务器—xx.com权威服务器—用户

五 . 递归查询与迭代查询

  递归查询: 简单的理解就是以最终结果查询,就是返回最终的结果给客户机,而客户机在此阶段是处于等待的状态!(就比如,你在家里地位最高,你都是衣来伸手饭来张口的,最什么事情就只要一句话不用本身亲自动手)

 

  迭代查询:简单的理解就是以最佳的结果查询,意思就是若是DNS服务器能解析就直接以最终结果返回给客户机,若是没法解析则就返回上一级DNS服务器的IP给客户机,由客户机完成查询工做直到获得最终结果!(举个例子就是什么事情你去问别人,别人只是告诉你怎么作,你知道后要本身亲自去作)

  递归与迭代结合查询

五.解析过程

  从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询

  浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操做系统没有告诉浏览器储存DNS记录的时间,这样不一样浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
  系统缓存 – 若是在浏览器缓存里没有找到须要的记录,浏览器会作一个系统调用(windows里是gethostbyname)。这样即可得到系统缓存中的记录。
  路由器缓存 – 接着,前面的查询请求发向路由器,它通常会有本身的DNS缓存。
  ISP DNS 缓存 – 接下来要check的就是ISP缓存DNS的服务器。在这通常都能找到相应的缓存记录。
  递归搜索 – 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。通常DNS服务器的缓存中会有.com域名服务器中的域名,因此到顶级服务器的匹配过程不是那么必要了。

  那么咱们的DNS是怎么解析一个域名的呢?网上搜了几个,大概的看下。

    1.如今我有一台计算机,经过ISP接入了互联网,那么ISP就会给我分配一个DNS服务器,这个DNS服务器不是权威服务器,而是至关于一个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,而后把最终查到IP返回给你。

    2.如今的我计算机要向这台ISPDNS发起请求查询www.baidu.com这个域名了,(经网友提醒:这里其实准确来讲不是ISPDNS,而应该是用户本身电脑网络设置里的DNS,并不必定是ISPDNS。好比也有可能你手工设置了8.8.8.8)

    3.ISPDNS拿到请求后,先检查一下本身的缓存中有没有这个地址,有的话就直接返回。这个时候拿到的ip地址,会被标记为非权威服务器的应答。

    4.若是缓存中没有的话,ISPDNS会从配置文件里面读取13个根域名服务器的地址(这些地址是不变的,直接在BIND的配置文件中),

    5.而后像其中一台发起请求。

    6.根服务器拿到这个请求后,知道他是com.这个顶级域名下的,因此就会返回com域中的NS记录,通常来讲是13台主机名和IP。

    7.而后ISPDNS向其中一台再次发起请求,com域的服务器发现你这请求是baidu.com这个域的,我一查发现了这个域的NS,那我就返回给你,你再去查。(目前百度有4台baidu.com的顶级域名服务器)。

    8.ISPDNS不厌其烦的再次向baidu.com这个域的权威服务器发起请求,baidu.com收到以后,查了下有www的这台主机,就把这个IP返回给你了,

    9.而后ISPDNS拿到了以后,将其返回给了客户端,而且把这个保存在高速缓存中。

 

    一、在浏览器中输入www.qq.com域名,操做系统会先检查本身本地的hosts文件是否有这个网址映射关系,若是有,就先调用这个IP地址映射,完成域名解析。

    二、若是hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,若是有,直接返回,完成域名解析。

    三、若是hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此咱们叫它本地DNS服务器,此服务器收到查询时,若是要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具备权威性。

    四、若是要查询的域名,不禁本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具备权威性。

    五、若是本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,若是未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来受权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,若是本身没法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动做,进行查询,直至找到www.qq.com主机。

    六、若是用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器若是不能解析,或找根DNS或把转请求转至上上级,以此循环。无论是本地DNS服务器用是是转发,仍是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

    1.客户机提交域名解析请求,并将该请求发送给本地的域名服务器。

    2.当本地的域名服务器收到请求后,就先查询本地的缓存。若是有查询的DNS信息记录,则直接返回查询的结果。若是没有该记录,本地域名服务器就把请求发给根域名服务器。

    3.根域名服务器再返回给本地域名服务器一个所查询域的顶级域名服务器的地址。

    4.本地服务器再向返回的域名服务器发送请求。

    5.接收到该查询请求的域名服务器查询其缓存和记录,若是有相关信息则返回客户机查询结果,不然通知客户机下级的域名服务器的地址。

    6.本地域名服务器将查询请求发送给返回的DNS服务器。

    7.域名服务器返回本地服务器查询结果(若是该域名服务器不包含查询的DNS信息,查询过程将重复<6>、<7>步骤,直到返回解析信息或解析失败的回应)。

    8.本地域名服务器将返回的结果保存到缓存,而且将结果返回给客户机。

 

六 . 使用工具查看解析过程

  下面咱们来用 nslookup 这个工具详细来讲一下解析步骤:


  从上图咱们能够看到:
          第一行Server是:DNS服务器的主机名 -- 114.114.114.114
          第二行Address是: 它的IP地址 -- 114.114.114.114#53
          下面的Name是:解析的URL -- www.che.com
          Address是:解析出来的IP -- 139.196.2.195

 

  还有像百度这样比较复杂的解析:

  你会发现百度有一个cname = www.a.shifen.com  的别名。这是怎么一个过程呢?咱们用dig工具来跟踪一下把(linux系统自带有)

  执行以下命令:

  第一步是向我这台机器的ISPDNS获取到根域服务区的13个IP和主机名[b-j].root-servers.net.。

  第二步是向其中的一台根域服务器(Servername就是末行小括号里面的)发送www.baidu.com的查询请求,他返回了com.顶级域的服务器IP(未显示)和名称。

   第三步,便向com.域的一台服务器192.48.79.201请求,www.baidu.com,他返回了baidu.com域的服务器IP(未显示)和名称,百度有四台顶级域的服务器【此处能够用dig @192.48.79.201 www.baidu.com查看返回的百度顶级域名服务器IP地址】。

  第四步呢,向百度的顶级域服务器(202.181.38.10)请求www.baidu.com,他发现这个www有个别名,而不是一台主机,别名是www.a.shifen.com。

   按照通常的逻辑,当dns请求到别名的时候,查询会终止,而是从新发起查询别名的请求,因此此处应该返回的是www.a.shifen.com而已。  可是为何返回a.shifen.com的这个域的NS呢?  咱们能够尝试下面的这个命令:dig +trace  shifen.com 看看有什么结果。。。。。。。。

  会发现第三步时shifen.com这个顶级域的域名服务器和baidu.com这个域的域名服务器是同一台主机(即:dns.baidu.com)!

    所以总结一下即是
    ①本机向local dns请求www.baidu.com
    ②local dns向根域请求www.baidu.com,根域返回com.域的服务器IP
    ③向com.域请求www.baidu.com,com.域返回baidu.com域的服务器IP
    ④向baidu.com请求www.baidu.com,返回cname www.a.shifen.com和a.shifen.com域的服务器IP
    ⑤向root域请求www.a.shifen.com
    ⑥向com.域请求www.a.shife.com
    ⑦向shifen.com请求
    ⑧向a.shifen.com域请求
    ⑨拿到www.a.shifen.com的IP
    ⑩localdns返回本机www.baidu.com cname www.a.shifen.com 以及 www.a.shifen.com的IP

  参考自:http://blog.chinaunix.net/uid-28216282-id-3757849.html

 

七 . DNS 劫持 和 HTTP 劫持

  简单介绍一下HTTP劫持和DNS劫持的概念,也就是运营商经过某些方式篡改了用户正常访问的网页,插入广告或者其余一些杂七杂八的东西。

  首先对运营商的劫持行为作一些分析,他们的目的无非就是赚钱,而赚钱的方式有两种:

    一、对正常网站加入额外的广告,这包括网页内浮层或弹出广告窗口;

    二、针对一些广告联盟或带推广连接的网站,加入推广尾巴。例如普通访问百度首页,被前置跳转为 http://www.baidu.com/?tn=90509114_hao_pg

  DNS劫持:
    通常而言,用户上网的DNS服务器都是运营商分配的,因此,在这个节点上,运营商能够随心所欲。
    例如,访问http://jiankang.qq.com/index.html,正常DNS应该返回腾讯的ip,而DNS劫持后,会返回一个运营商的中间服务器ip。访问该服务器会一致性的返回302,让用户浏览器跳转到预处理好的带广告的网页,在该网页中再经过iframe打开用户原来访问的地址。

 

  HTTP劫持:

    HTTP劫持是在使用者与其目的网络服务所创建的专用数据通道中,监视特定数据信息,提示当知足设定的条件时,就会在正常的数据流中插入精心设计的网络数据报文,目的是让用户端程序解释“错误”的数据,并以弹出新窗口的形式在使用者界面展现宣传性广告或者直接显示某网站的内容。
    在运营商的路由器节点上,设置协议检测,一旦发现是HTTP请求,并且是html类型请求,则拦截处理。后续作法每每分为2种,1种是相似DNS劫持返回302让用户浏览器跳转到另外的地址,还有1种是在服务器返回的HTML数据中插入js或dom节点(广告)。

    在用户角度,这些劫持的表现分为:
      一、网址被无辜跳转,多了推广尾巴;
      二、页面出现额外的广告(iframe模式或者直接同页面插入了dom节点)。

   DNS记录污染:

    指的是有人经过恶意伪造身份、利用漏洞等方式,向用户或者其余DNS服务器提供虚假的DNS记录。因为DNS记录存在一个生存期(TTL),在生存期内,DNS保存在缓存中,除非通过了大于一个TTL的时间,或者经手工刷新DNS缓存,虚假的记录会一直存在下去,而且若是污染了DNS服务器,这种污染还具备传染性。

    DNS污染具备暂时性,过了TTL周期,若是不进行再污染,污染就会消失。

    DNS记录污染同劫持的不一样之处,在于污染是对原本正确的DNS查询结果进行篡改,而劫持是DNS服务器本身把记录改为错误的内容。对于GFW来讲,DNS劫持用于国内服务器,而对于国外服务器GFW没法更改其内容,故采用DNS污染方式篡改用户收到的信息。

    GFW的DNS污染过程,是当你向国外DNS服务器查询DNS记录时候,这些流量走到国外出口处即会遭到GFW的关键字审查,若是上了黑名单,GFW会当即向你返回一个虚假的DNS记录。因为默认的DNS查询方式是UDP,加上DNS查询结果只认最快返回的结果,因此你必定是先收到了GFW给你返回的虚假DNS记录;就算100ms后你收到了真正的来自国外DNS的回复,那也会被你的系统无视掉。若是GFW想完全污染一个域名,那么不仅是普通用户,连国内全部的DNS服务器也会收到虚假的DNS纪录致使全国性的DNS污染。

    前一段,不明缘由的发生了国内大规模的DNS污染事件,国内大部分站点和部分地区均受到影响没法经过域名访问。这一定与GFW强大的DNS污染能力有关。

    不过不只仅是国外出口处DNS记录可能污染,各省市的ISP也可能利用现有GFW的技术进行本身的DNS污染,这种污染范围小一些,也是GFW的一环。

    防止DNS污染的方法目前来讲就是使用TCP协议代替UDP来进行DNS查询,由于TCP协议是有链接的协议须要双方握手成功才能通信,从而避免GFW这种简单的DNS污染方式。目前GFW对于TCP方式的DNS查询其实已有阻断能力,但未大规模部署,目前貌似只有dl.dropbox.com会遭遇TCP阻断

 八 . 劫持分析

  打开 http://www.hao123.com 自动跳转到 http://www.hao123.com/?tn=99184670_hao_pg,使用火狐 HttpFox 查看,能够看到出现一次跳转

  使用 Wireshark 抓包,通过检查DNS是正常的,没有问题,那就说明这是HTTP链路层劫持了。

相关文章
相关标签/搜索