DNS即Domain Name System,用于域名解析是最常用的应用层协议之一。虽然我们没有直接使用过它,但它却经常由其他的应用层协议如HTTP、SMTP、FTP等所使用。以下简单记录一些比较常见的问题。
一、DNS解析过程
面试中比较常见的问题就是你在浏览器中输入了www.baidu.com之后发生了什么。虽然我不知道正确答案,但是根据我的理解,Web访问肯定是应用层的,本质就是两个应用进程进行通信,那么如果要定位到服务器中的一个进程,就必须要知道它的ip地址和端口号,而www.baidu.com并不是ip地址,路由器也并不认识它,所以,第一步就是把这个网址转换成ip地址,也就要用到DNS服务。下面来说一下DNS解析的步骤:
1、浏览器缓存
浏览器首先会检查缓存中有没有这个域名对应的解析过的ip地址,如果缓存中有,这个解析过程就到此结束。
2、本机缓存
如果浏览器中没有缓存,你们浏览器是不会自己解析域名的,而是调用系统的DNS服务。
系统首先也会查找自己的本机缓存,Windows系统中有一个host文件,你可以将任何域名解析到任何能够访问的ip地址,如果你在这里指定了域名对应的ip地址,你们浏览器会首先使用这个ip地址。
host文件还是比较常用的,比如你如果想访问Google,因为它在墙外,所以上级的DNS一般会告诉你你网址写错了没有对应的ip或者告诉你一个错误的ip导致你根本访问不了,这时候有一个办法就是你手动修改host文件,添加ip地址(网上有很多教程),当然如果你觉得ip对了就能访问到Google那只能说明你还是图样。有些恶意软件也经常修改host文件来劫持DNS。
3、本地DNS服务器
我们在网络配置都会配置DNS服务器这个选项。如果浏览器和本机都没有缓存,那么系统就会访问这个设置的DNS服务器。既然是本地DNS服务器,你们它肯定是离你不远,一般学校和小区都会有自己的本地DNS。它会缓存大量的解析结果,一般80%的域名解析到这里就已经完成了。
4、根DNS服务器、顶级域服务器、权威DNS服务器
如果本地DNS没有解析,那么就会直接到根DNS服务器请求解析,根服务器在到下面的几级服务器分级查询,这个过程比较复杂我没有详细了解,这里需要注意的就是查询的方式,即递归查询和迭代查询。
递归查询
递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
迭代查询
DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果为止。
实际情况中,主机到本地DNS采用递归查询,DNS服务器之间采用迭代查询,如图:
二、其他常见问题
1、传输层协议
书上很常见的一句话就是
所有的DNS请求和回答报文使用UDP数据报经端口53发送。
首先,DNS的默认端口号是53,这个必须记住。
但是关于传输协议,有一点需要注意,大部分采用UDP,但是会有一些情况采用TCP协议。
在此回忆一下TCp与UDP的区别
TCP是一种面向连接的协议,提供可靠的数据传输,一般服务质量要求比较高的情况会使用这个协议。
UPD是一种无连接的传输层协议,提供面向事务的简单不可靠的信息传送服务。
为什么DNS默认使用UDP协议?
UDP虽然不可靠,但是相比TCP速度要快的多,不需要TCP的三次握手,所以响应要快的多。
什么情况下使用TCP协议?
主要有两种情况:
第一种就是当解析器发出一个查询报文后,返回的回答报文中的tc删节标志比特位被置1时,说明反馈报文因为超长而有删节。这是因为UDP的报文最大长度为512字节。解析器发现后,将使用TCP重发回答报文,TCP允许报文长度超过512字节。既然TCP能将data stream分成多个segment,它就能用更多的segment来传送任意长度的数据。
第二种情况是当一个域的辅助域名服务器启动时,将从该域的主域名服务器primary DNS server执行区域传送。除此之外,辅域名服务器也会定时(一般时3小时)向PDS进行查询以便了解SOA的数据是否有变动。如有变动,也会执行一次区域传送。区域传送将使用TCP而不是UDP,因为传送的数据量比一个request或response多得多。
2、DNS污染与DNS劫持
- DNS劫持,指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为。范例就是收到各种推送广告等网站。
- DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。比如不能访问Google、YouTube等。
两者的区别
DNS劫持就是指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为。范例,网通、电信、铁通的某些用户有时候会发现自己打算访问一个地址,却被转向了各种推送广告等网站,这就是DNS劫持。
DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。范例,访问Youtube、Facebook之类网站等出现的状况。
一句话来说,DNS劫持是DNS服务器返回了错误的地址,而DNS污染是其他服务器(非DNS)服务器伪装成DNS服务器返回错误的地址。
3、DNS攻击
下面列举一下DNS常见的攻击方法:
缓存投毒
利用控制DNS缓存服务器,把原本准备访问某网站的用户在不知不觉中带到黑客指向的其他网站上。其实现方式有多种,比如可以通过利用网民ISP端的DNS缓存服务器的漏洞进行攻击或控制,从而改变该ISP内的用户访问域名的响应结果;或者,黑客通过利用用户权威域名服务器上的漏洞,如当用户权威域名服务器同时可以被当作缓存服务器使用,黑客可以实现缓存投毒,将错误的域名纪录存入缓存中,从而使所有使用该缓存服务器的用户得到错误的DNS解析结果
DDoS攻击
分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。通常,攻击者使用一个偷窃帐号将DDoS主控程序安装在一个计算机上,在一个设定的时间主控程序将与大量代理程序通讯,代理程序已经被安装在网络上的许多计算机上。代理程序收到指令时就发动攻击。利用客户/服务器技术,主控程序能在几秒钟内激活成百上千次代理程序的运行。
以上来自百度百科,DDoS是一类攻击方法,可以用在很多地方,其中DNS只是其中一种。
攻击者能够试图向每个DNS根服务器发送大量请求,使得大多数合法的DNS请求得不到回答。
其他
还有其他的攻击就不一一介绍了。
三、参考链接
http://www.360doc.com/content/13/0527/17/11253639_288596772.shtml
http://www.cnblogs.com/coderchuanyu/p/4132348.html
http://www.williamlong.info/archives/3813.html
http://www.williamlong.info/archives/3356.html