DNS 是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点它的知识。下面就让我们复习一下有关DNS的知识吧。
什么是DNS
用官方的话说就是,域名系统(Domain Name System,DNS)是互联网的一项服务,它是Internet上解决网上机器命名的一种系统,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
就像拜访朋友要先知道别人家怎么走一样,Internet上当一台主机要访问另外一台主机时,必须首先获知其地址,TCP/IP中的IP地址是由四段以“.”分开的数字组成(此处以IPv4的地址为例,IPv6的地址同理),记起来总是不如名字那么方便,所以,就采用了域名系统来管理名字和IP的对应关系。
例如:微软公司网站的域名是 www.microsoft.com, 其对应的Web服务器的IP地址是27.148.139.88。我们想访问微软网站,用DNS就可以通过域名www.microsoft.com 来获取到相应的IP地址:207.46.230.229,从而通过IP访问到微软网站。
到这里大家可能会有以下疑问:
- 为什么要通过IP,而不是直接通过域名访问web服务器呢?
从运行效率上来讲,IP 地址是 32 比特,也就是 4 字节,而域名,最短也要十几个字节,最长的时候,可能达到 255 字节,换句话讲,使用 IP 地址只需要处理 4 字节的数字,现在用域名,就要处理十几甚至 255 个字节的字符,这严重影响效率。同时添加了路由器的负担,传送数据也会花费更长的时间。
DNS是如何进行查询的
DNS 查询有两种方式,一种是迭代查询,另一种是递归查询,我们先大致了解一下这两种查询。
-
递归查询
:客户机向本地域名服务器的查询一般都是采用递归查询
。在该模式下DNS 服务器接收到客户机请求,必须给出一个最终的 IP 地址结果
。如果DNS服务器本地没有存储查询DNS信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。 -
迭代查询
:本地域名服务器向根域名服务器的查询通常采用迭代查询
。当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应当向哪个域名服务器进行查询”。然后让本地域名服务器继续向下一个域名服务器查询。
DNS域名服务器也是按照层次安排的,每一个域名服务器都只对域名体系中的一部分进行管辖。根据域名服务器所起的作用,一般把域名服务器分为:根域名服务器
、顶级域名服务器
、权限域名服务器
、本地域名服务器
。如下图所示:
当一个用户在地址栏输入www.abc.com 时,DNS解析大致有以下过程,如图所示:
- 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
- 如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
- 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这里采用的是
递归查询
。这台服务器一般一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。 - 如果LDNS仍然没有命中,就向根域名服务器请求解析,后续就开始
迭代查询
了。 - 根域名服务器返回给LDNS下一次应该查询的顶级域名服务器IP。
- LDNS向顶级域名服务器查询,顶级域名服务器返回下一次应该查询的权限域名服务器IP。
- LDNS向权限域名服务器查询,权限域名服务器返回所查询的目标主机IP。
- LDNS将最终查询到的IP返回给用户的主机,并写入缓存以便下次查询。
DNS用的是TCP协议还是UDP协议
DNS同时占用UDP和TCP端口53是公认的,但很少有人知道DNS分别在什么情况下使用这两种协议。
首先了解一下TCP与UDP传送字节的长度限制:UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UDP报文一般不会大于512字节。
-
域名解析
时使用UDP协议:客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过三次握手,这样DNS服务器负载更低,响应更快。 -
区域传输
时使用TCP协议:辅域名服务器会定时(一般3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,会执行一次区域传送,进行数据同步。区域传送使用TCP而不是UDP,因为数据同步传送的数据量比一个请求应答的数据量要多得多。
什么是DNS劫持
DNS(域名劫持)是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的IP地址从而实现用户无法访问目标网站的目的或者蓄意或恶意要求用户访问指定IP地址(假网址)的目的。
以下是DNS劫持的几种方法:
- 利用DNS服务器进行DDOS攻击
正常的DNS服务器递归询问过程可能被利用成DDOS攻击。假设攻击者已知被攻击机器IP地址,然后攻击者使用该地址作为发送解析命令的源地址。这样当使用DNS服务器递归查询后,DNS服务器响应给最初用户,而这个用户正是被攻击者。那么如果攻击者控制了足够多的肉鸡,反复的进行如上操作,那么被攻击者就会受到来自于DNS服务器的响应信息DDOS攻击。
- DNS缓存感染
攻击者使用DNS请求,将数据放入一个具有漏洞的DNS服务器的缓存当中。这些缓存信息会在客户进行DNS访问时返回给用户,从而把用户客户对正常域名的访问引导到入侵者所设置挂马、钓鱼等页面上,或者通过伪造的邮件和其他的server服务获取用户口令信息,导致客户遭遇进一步的侵害。
- DNS信息劫持
原则上TCP/IP体系通过序列号等多种方式避免仿冒数据的插入,但入侵者如果通过监听客户端和DNS服务器的对话,就可以猜测服务器响应给客户端的DNS查询ID。每个DNS报文包括一个相关联的16位ID号,DNS服务器根据这个ID号获取请求源位置。攻击者在DNS服务器之前将虚假的响应交给用户,从而欺骗客户端去访问恶意的网站。假设当提交给某个域名服务器的域名解析请求的数据包被截获,然后按截获者的意图将一个虚假的IP地址作为应答信息返回给请求者。这时,原始请求者就会把这个虚假的IP地址作为它所要请求的域名而进行连接,显然它被欺骗到了别处而根本连接不上自己想要连接的那个域名。
- DNS重定向
攻击者如果将DNS名称查询重定向到恶意DNS服务器。那么被劫持域名的解析就完全置于攻击者的控制之下。
- ARP欺骗
ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。ARP攻击主要是存在于局域网网络中,局域网中若有一台计算机感染ARP木马,则感染该ARP木马的系统将会试图通过"ARP欺骗”手段截获所在网络内其它计算机的通信信息,并因此造成网内其它计算机的通信故障。ARP欺骗通常是在用户局网中,造成用户访问域名的错误指向,但在IDC机房被入侵后,则也可能出现攻击者采用ARP包压制正常主机、或者压制DNS服务器,而李代桃僵,以使访问导向错误指向的情况。
- 本机劫持
在计算机系统被木马或流氓软件感染后可能会出现部分域名的访问异常,如访问挂马或者钓鱼站点、无法访问等情况,本机劫持有hosts文件篡改、本机DNS劫持、SPI链注入、BHO插件等方式,虽然并非都通过DNS环节完成,但都会造成无法按照用户意愿获得正确的地址或者内容的后果。
我们如何防范DNS劫持,有以下几种方法:
- 使用HTTPDNS:由于 HTTPDNS 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问 domain 解析过程,所以从根本避免了劫持问题。
- 互联网公司准备两个以上的域名,一旦黑客进行DNS攻击,用户还可以访问另一个域名。