对DNS报文的理解

评价:
0
(0用户)

在这段时间的学习中,我发现通过抓包来学习的方法不错,这样有助于更深刻的理解。下面是我对dns报文的一些理解。
学习了《tcp/ip卷一》 dns域名系统这一章,下面通过spynet capturenet抓一些dns通信报文进行一下分析,以加深理解。
本人是在windows 上使用nslookup工具来产生的dns通信。

—————————–dns查询报文————————————
首先是一个dns查询报文抓包:
0000: 00 14 78 b5 da ae 00 0c 6e ec 1e ae 08 00 45 00 ..x…..n…..e.
0010: 00 38 00 33 00 00 80 11 29 6f c0 a8 a8 02 dd 05 .8.3….)o……
0020: cb 62 04 0f 00 35 00 24 17 95 00 02 01 00 00 01 .b…5.$……..
0030: 00 00 00 00 00 00 03 66 74 70 02 75 75 03 6e 65 …….ftp.uu.ne
0040: 74 00 00 01 00 01 t…..

对以太网首部和ip首部字段就不再加以解释说明,直接以udp首部开始分析.

04 0f—udp源端口号1039;
00 35—udp目的端口号53;
00 24—udp报文长度36字节;
17 95—udp检验和;

接下来就是dns请求报文的内容了:
00 02—标识符;
01 00—16 bit标志,二进制表示为00000001 000000000
从高位到低位,第一位0表示这是一个dns查询报文; 第2-5位0000是opcode字段,这里表示是一个标准查询;
第6位0表示授权回答未设置; 第7位0表示可截断位未设置; 第8位1表示期望递归已设置; 第9位0表示可用递归未设置;
第10-12位000表示zero字段; 第13-16位0000表示4位返回码字段,表示没有差错产生。
00 01—问题数为1
00 00—资源记录数为0
00 00—授权资源记录数为0
00 00—附加资源记录数为0
03 66 74 70 02 75 75 03 6e 65 74 00—问题部分的查询名字段,它是一个或多个标识符的序列,每个标识符以首字节的计数值来说明随后
标识符的字节长度,每个名字以最后字节为0结束。03(计数),66 74 70(ftp),02(计数),75 75(uu),03(计数),6e 65 74(net),00(结束)
00 01—表示查询类型字段,这里表示一个a记录的查询;
00 01—表示查询类字段,通常是1,指互联网地址
—————————————————————————-

—————————–dns响应报文————————————
下面是对上面的一个dns查询报文所产生的dns响应报文抓包:
0000: 00 0c 6e ec 1e ae 00 14 78 b5 da ae 08 00 45 00 ..n…..x…..e.
0010: 00 a1 1a 1c 00 00 18 11 77 1d dd 05 cb 62 c0 a8 ……..w….b..
0020: a8 02 00 35 04 0f 00 8d 31 fe 00 02 81 80 00 01 …5….1…….
0030: 00 01 00 04 00 00 03 66 74 70 02 75 75 03 6e 65 …….ftp.uu.ne
0040: 74 00 00 01 00 01 c0 0c 00 01 00 01 00 00 0c 82 t……………
0050: 00 04 c0 30 60 09 c0 10 00 02 00 01 00 00 0d 2c …0`……….,
0060: 00 0c 06 61 75 74 68 36 30 02 6e 73 c0 10 c0 10 …auth60.ns….
0070: 00 02 00 01 00 00 0d 2c 00 0a 07 61 75 74 68 32 …….,…auth2
0080: 30 30 c0 3f c0 10 00 02 00 01 00 00 0d 2c 00 0a 00.?………,..
0090: 07 61 75 74 68 32 31 30 c0 3f c0 10 00 02 00 01 .auth210.?……
00a0: 00 00 0d 2c 00 09 06 61 75 74 68 30 30 c0 3f …,…auth00.?

00 35—udp源端口号53;
04 0f—udp目的端口号1039;
00 8d—udp报文长度141字节;
31 fe—udp检验和;
00 02—标识符,与dns请求报文中的相对应.
81 80—16 bit标志,二进制表示为10000001 10000000
从高位到低位,第一位1表示这是一个dns响应报文; 第2-5位0000是opcode字段,这里表示是一个标准查询;
第6位0表示授权回答未设置; 第7个0表示可截断位未设置; 第8位1表示期望递归已设置; 第9位1表示可用递归已设置;
第10-12位000表示zero字段; 第13-16位0000表示4位返回码字段,表示没有差错产生。
00 01—问题数为1
00 01—资源记录数为1
00 04—授权资源记录数为4
00 00—附加资源记录数为0

[问题]部分
03 66 74 70 02 75 75 03 6e 65 74 00—问题部分的查询名字段,它是一个或多个标识符的序列,每个标识符以首字节的计数值来说明随后
标识符的字节长度,每个名字以最后字节为0结束。03(计数),66 74 70(ftp),02(计数),75 75(uu),03(计数),6e 65 74(net),00(结束)
00 01—表示查询类型字段,这里表示一个a记录的查询;
00 01—表示查询类字段,通常是1,指互联网地址

[回答]部分:
c0 0c—回答字段部分中的域名字段。因为有重复域名的出现,这里使用了压缩方式。这里需要详细的讲解。

《tcp/ip卷一》书中是这样描述的:“当一个域名中的标识符是压缩的,它的单计数字节中的最高两位将被置为11。这表示它是一个16 bit指
针而不再是8 bit的计数字节。指针中的剩下14 bit说明在该dns报文中标识符所在的位置(起始位置由标识字段的第一字节起算)。一个指针
可能指向一个完整的域名,也可能只指向域名的结尾部分,因为给定域名的结尾标识符是相同的。”

c0 0c二进制表示为11000000 00001100,最高两位被置为11,剩下的14位"000000 00001100"说明标识符所在的位置相对于dns报文起始位置偏
移了12字节,因此就是指向"03 66 74 70 02 75 75 03 6e 65 74 00"中(问题部分中的查询名字段)的03字节,而03相对于dns报文起始位置
的偏移量正好为12。也就是说指针指向的内容为ftp.uu.net
00 01—表示查询类型字段,这里表示一个a记录的查询;
00 01—表示查询类字段,通常是1,指互联网地址
00 00 0c 82—表示生存时间为3202秒
00 04—表示资源数据长度为4
c0 30 60 09—表示资源数据,这里表示的是一个32 bit ip地址 192.48.96.9

[授权资源记录]部分:
c0 10—授权资源记录部分中的域名字段,根据上面的计算方法,这个16 bit指针,指向的内容偏移dns报文起始位置16字节,因此指向"02 75
75 03 6e 65 74 00"中的02字节,也就是说指针指向的内容为uu.net
00 02—表示查询类型字段,这里表示一个ns记录的查询;
00 01—表示查询类字段,通常是1,指互联网地址
00 00 0d 2c—表示生存时间为3372秒
00 0c—表示授权资源数据长度为12
06 61 75 74 68 36 30 02 6e 73 c0 10—表示授权资源数据,06(计数),61 75 74 68 36 30(auth60),02(计数),6e 73(ns),c0 10(仍然表示
一个16 bit指针,指向"02 75 75 03 6e 65 74 00"的内容,连起来,所表示的域名就是 auth60.ns.uu.net)

后面三条授权资源记录的解释就省略了,方法都是一样的。
—————————————————————————-

在nslookup交互式命令中打入set debug开启调试状态,可以显示更丰富的信息。
我们对照抓图,可以发现我们的分析跟图中显示完全符合。
其它类型的dns报文在理解上也是一样的.

注册并通过认证的用户才可以进行评价!

Leave a Reply