DNS协议分析_wireshark

1.1 DNS识别主机有两种方式:主机名、IP 地址。前者便于记忆,但路由器很难处理(主机名长度不定) ;后者定长、有层次结构,便于路由器处理,但难以记忆。折中的办法就是建立IP 地址与主机名间的映射

1.1 DNS

识别主机有两种方式:主机名、IP 地址。前者便于记忆,但路由器很难处理(主机名长度不定) ;后者定长、有层次结构,便于路由器处理,但难以记忆。折中的办法就是建立IP 地址与主机名间的映射,这就是域名系统DNS 做的工作。DNS 通常由其他应用层协议使用(如HTTP 、SMTP 、FTP) ,将主机名解析为IP 地址,其运行在UDP 之上,使用53号端口。 注:DNS 除了提供主机名到IP 地址转换外,还提供如下服务:主机别名、邮件服务器别名、负载分配。

1.2 HTTP使用DNS 情形

考虑这样的操作,在浏览器输入http://www.baidu.com/index.html并回车,首先需要将URL(存放对象的服务器主机名和对象的路径名) 解析成IP 地址,具体步骤为:

(1)同一台用户主机上运行着DNS 应用的客户机端(如浏览器)

(2)从上述URL 抽取主机名www.baidu.com ,传给DNS 应用的客户机端(浏览器)

(3)该DNS 客户机向DNS 服务器发送一个包含主机名的请求(DNS 查询报文)

(4)该DNS 客户机收到一份回答报文(即DNS 回答报文) ,该报文包含该主机名对应的IP 地址119.75.218.70

(5)浏览器由该IP 地址定位的HTTP 服务器发送一个TCP 链接

用Wireshark 捕获的DNS 报文如下图,显然第一行是DNS 查询报文,第二行是DNS 回答报文。

图1 Wireshark捕获的DNS 报文

二、DNS 报文

2.1 DNS报文格式

DNS 只有两种报文:查询报文、回答报文,两者有着相同格式,如下:

,

图2 DNS

报文格式

2.1.1 首部区域

标识数

对该查询进行标识,该标识会被复制到对应的回答报文中,客户机用它来匹配发送的请求与接收到的回答。

标志[1]

图3 DNS报文首部区域的标志

QR(1比特) :查询/响应的标志位,1为响应,0为查询。

opcode(4比特) :定义查询或响应的类型(若为0则表示是标准的,若为1则是反向的,若为2则是服务器状态请求) 。

AA(1比特) :授权回答的标志位。该位在响应报文中有效,1表示名字服务器是权限服务器(关于权限服务器以后再讨论)

TC(1比特) :截断标志位。1表示响应已超过512字节并已被截断(依稀好像记得哪里提过这个截断和UDP 有关,先记着)

RD(1比特) :该位为1表示客户端希望得到递归回答(递归以后再讨论)

,

RA(1比特) :只能在响应报文中置为1

,表示可以得到递归响应。

zero(3比特) :不说也知道都是0了,保留字段。

rcode(4比特) :返回码,表示响应的差错状态,通常为0和3,各取值含义如下: 0 无差错

1 格式差错

2 问题在域名服务器上

3 域参照问题

4 查询类型不支持

5 在管理上被禁止

6 -- 15 保留

问题数、回答RR 数、权威RR 数、附加RR 数

这四个字段都是两字节,分别对应下面的查询问题、回答、授权和附加信息部分的数量。一般问题数都为1,DNS 查询报文中,资源记录数、授权资源记录数和附加资源记录数都为0[1]。

2.1.2 区域

(1)问题区域

包含正在进行的查询信息。包含查询名(被查询主机名字的名字字段) 、查询类型、查询类。

图4 DNS报文的问题区域

,

查询名

查询名部分长度不定,一般为要查询的域名(也会有IP 的时候,即反向查询) 。此部分由一个或者多个标示符序列组成,每个标示符以首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。还是借个例子来说明更直观些,查询名为gemini.tuc.noao.edu 的话,查询名字段如下[1]:

图5 DNS报文问题区别的查询名

查询类型

通常查询类型为A(由名字获得IP 地址) 或者PTR(获得IP 地址对应的域名) ,类型列表如下:

表1 DNS报文查询类型

NS 记录指定了名字服务器。一般情况,每个DNS 数据库中,针对每个顶级域都会有一条NS 记录,这样一来,电子邮件就可以被发送到域名树中远处的部分。

查询类

通常为1,指Internet 数据。

,

(2)回答、权威、附加区域

回答区域包含了最初请求名字的资源记录,一个回答报文的回答区域可以包含多条资料记录RR(因为一个主机名可以对应多个IP

地址,冗余Web 服务器) 。权威区域包含了其他权威DNS 服务器的记录。附加区域包含其他一些" 有帮助" 的记录,例如,对于一个MX(邮件交换) 请求的回答报文中,回答区域包含一条资料记录(该记录提供邮件服务器的规范主机名) ,附加区域可以包含一条类型A 记录(该记录提供了该邮件服务器的规范主机名的IP 地址) 。

每条资料记录是一个五元组,如下:

(域名,生存期,类别,类型,值)

直接表示如下[1]:

图6 DNS报文的资源记录

域名(2字节或不定长)

记录中资源数据对应的名字,它的格式和查询名字段格式相同。当报文中域名重复出现时,就需要使用2字节的偏移指针来替换。例如,在资源记录中,域名通常是查询问题部分的域名的重复,就需要用指针指向查询问题部分的域名。关于指针怎么用,TCP/IP详解里面有,即2字节的指针,最前面的两个高位是11,用于识别指针。其他14位从报文开始处计数(从0开始) ,指出该报文中的相应字节数。注意,DNS 报文的第一个字节是字节0,第二个报文是字节1。一般响应报文中,资源部分的域名都是指针

C00C(1100000000001100,12正好是首部区域的长度) ,刚好指向请求部分的域名[1]。

,

类型(记录的类型,见表1)

A 记录,Name 是主机名,Value 是该主机名的IP 地址,因此,一条类型为A 的资源记录提供了标准的主机名到IP 地址的映射。

NS 记录,Name 是域(如foo.com) ,Value 是知道如何获得该域中主机IP 地址的权威DNS 服务器的主机名(如dns.foo.com) ,这个记录常用于沿着查询链进一步路由DNS 查询。 CNAME 记录,Name 是主机别名,Value 是主机别名对应的规范主机名,该记录能够向请求主机提供一个主机名对应的规范主机名。

MX 记录,Name 是邮件服务器别名,Value 是邮件服务器别名的规范主机名。通过MX 记录,一个公司的邮件服务器和其他服务器可以使用相同的别名。

注:有着复杂主机名的主机能拥有多个别名,前者称为规范主机名,后者称为主机别名(便于记忆) 。

对于Internet 信息,它总是IN 。

生存时间

用于指示该记录的稳定程度,极为稳定的信息会被分配一个很大的值(如86400,一天的秒数) 。该字段表示资源记录的生命周期(以秒为单位) ,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间[1]。

资源数据长度(2字节)

表示资源数据的长度(以字节为单位,如果资源数据为IP 则为0004) 。

资源数据

该字段是可变长字段,表示按查询段要求返回的相关资源记录的数据。

2.2 DNS查询报文实例

以www.baidu.com 为例,用Wireshark 俘获分组,结合2.1的理论内容,很容易看明白的,DNS 请求报文如下:

,

图7 DNS请求报文示例

2.3 DNS回答报文实例

,

图8 DNS回答报文示例

标签: