DNS
1.DNS是怎么工作的
首先我们可以很简单的理解DNS协议,它就是一个将域名与ip地址进行双向转换的协议,而消息类型只有查询和回应2种类型。那客户端查询域名,是要请求谁呢?答案是域名服务器,现在域名服务器分为以下4类,按照层次从上往下:
根域名服务器:最高层次最重要的域名服务器,它知道所有的顶级域名服务器的域名和ip地址,一般请求根域名服务器返回的是要请求的顶级域名服务器的ip地址。我们常常听说的13个域名服务器指的就是它,但根域名服务器绝不是由仅仅的13台服务器组成,而是一个域名服务器由多个主机组成,它们有相同的ip。现在基本上普通域名服务器都能就近找到一台根域名服务器,当本地域名服务器请求根域名服务器时,路由器就能找到离这个本地域名服务器最近的一个根域名服务器。
顶级域名服务器:它负责该顶级域名中所有注册的二级域名。比如.com顶级域名服务器里就存放了所有xxx.com域名和ip地址映射表。
权限域名服务器:这类服务器负责某一特定域名的域名解析,很多公司都有权限域名服务。比如腾讯有它的权限域名服务器,里面存储了腾讯域名和ip地址的映射关系。同时权限域名服务器也充当了本地域名服务器的角色,你可以将你的域名注册到腾讯的域名服务器中。
本地域名服务器:这台服务器的ip地址就是我们电脑里配置的dns,本地域名服务器一般离用户是比较近的,当本地主机无法解析域名就会给本地域名服务器发送请求。
现在知道请求的是域名服务器了,也知道了一共有哪几类域名服务器,接下来我画了张图来描述整个dns请求的流程,整个过程采用迭代查询。注意权限域名服务器一般是不会采用递归查询的,它会直接返回ip地址让请求着再去访问这个ip。
2.DNS数据格式
dns固定首部为12字节,如下图所示。当请求本地域名服务器如果它已经缓存了这个域名所对应的ip地址,那么这个答案将会被标记为非权威的,只有权限域名服务器返回的数据包才会将这个包标记为权威的,这对应着固定首部中的权威答案数据。后2张表格是dns首部中的标志位数据和rCode的数据。随着dns的发展标志中的16位功能已经有点不够用了,因此现在有很多dns服务器运行EDNS(扩展DNS),原来回应数据如果超过512字节将会被丢弃进而可以转为tcp连接,EDNS则可以支持超过512字节的大数据包回应。
QR 1位 | 查询时这位为0,回应则为1 |
Opcode 4位 | 定义查询或回应的类型,值为0表示是一个标准的查询/回应 |
AA 1位 | 在回应数据包中使用,值为1表示回应是一个权威回应。 |
TC 1位 | 当回应大于512字节时此标志位置1,最终数据长度会被删减为512字节,此时客户端可采用tcp来询问 |
RD 1位 | 客户端使用递归时此位会置1 |
RA 1位 | 只在回应数据包中设置,当为1时表示可采用递归回应 |
保留位 3位 | 全都设置为0 |
rCode 4位 | 仅在回应消息中有用,表示返回类型 |
rCode | 错误类型 |
0 | 没有错误 |
1 | 格式错误 |
2 | 名称服务器错误 |
3 | 域参照错误 |
4 | 不支持的查询类型 |
5 | 不允许的动作 |
3.DNS的安全隐患
目前对于DNS的安全隐患主要分为2类,一类是攻击真实的域名服务器让服务器掉线,比如利用服务器软件漏洞,曾经还发生过对根域名服务器的成功攻击。另一类是抓住dns协议的漏洞来进行攻击。dns协议很简单,就一个请求和回复,在这个过程中会对服务器返回结果的ip地址和首部中16位标识进行验证,如果ok那dns客户端总是相信服务器返回的结果是正确的。正是这个地方攻击者可以做手脚,比如DNS缓冲区中毒攻击,它需要攻击者能够看到dns服务器的查询数据包,有了查询数据攻击者才能伪造回应信息给dns服务器。它的原理是攻击者替换dns服务器中的多行数据从而导致客户端收到错误的ip地址,然后去访问攻击者想要客户端访问的网站。现在关键是攻击者如何才能将恶意数据放入dns服务器中呢?可以想象攻击者要么获得对服务器的访问,要么向发送请求的dns服务器回应错误的信息,以达到伪造的目的。对于这种攻击可以采用dns数据加密的方式。还有一种攻击类似于syn flood,假设攻击者给很多服务器发送大量请求报文,这可能造成网络的流量猛增而瘫痪。不过dns是采用无连接的udp,当udp缓冲区被塞满时将会丢弃多余的数据包,而dns客户端请求不到ip地址将会重试几次请求或者用户重新在浏览器点击链接。因此这种攻击只要采用防火墙进行过滤网络就会快速恢复。