识别DNS数据包

时间:2011-09-27 06:57:07

标签: sockets unix networking dns

查看数据包字节代码时,如何识别dns数据包。 IP报头的协议字段会告诉UDP帧,但在UDP帧内没有协议字段来指定接下来会发生什么,从我可以看到,帧内没有任何内容可以唯一地将其识别为dns数据包

2 个答案:

答案 0 :(得分:12)

除了它在端口53上之外,还有一些你可以注意的事情可能会给你提供提示你正在查看DNS流量。

我将在这里详细介绍RFC 1035§4.1中使用的字段名称:

                                1  1  1  1  1  1
  0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      ID                       |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    QDCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ANCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    NSCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ARCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

如上所示,标题长度为12个字节 - 一个2字节ID,2个字节的标志和4 x 2字节的计数。

在任何DNS数据包中,QDCOUNT字段都只是一个(0x0001)。从技术上讲,协议允许使用其他值,但实际上它们从未使用过。

在查询(QR == 0)中,ANCOUNTNSCOUNT值将完全为零(0x0000),而ARCOUNT通常为0, 1或2,取决于是否使用EDNS0 (RFC 2671)TSIG (RFC 2845)。 <{1}}在查询中也将为零。

响应有点难以识别,除非您正在观察对话的两个方面,并且可以将每个响应与触发它的查询相关联。

显然会设置RCODE位,如上所述,QR仍应为1。然而,其余的计数器将具有许多不同的排列。但是, 非常不太可能任何计数器都大于255,所以你应该能够依赖字节4,6,8和10都为零。

在标题之后,您将开始查找资源记录,第一个是要求的实际问题(第4.1.2节)。不幸的是,协议的设计者认为适合在两个固定字段(QDCOUNT和{{1}前面包含可变长度标签字段(QNAME) }})。

[更复杂的是,标签可以压缩,使用向后指针指向数据包中的其他位置。幸运的是,你几乎不会在问题部分看到压缩标签,因为根据定义你不能从那里倒退。从技术上讲,一个反常的实现者可以将压缩指针发送回头部,但这不应该发生]。

因此,开始读取每个长度字节,然后跳过那么多字节,直到达到空字节,然后接下来的两个16位字将是QTYPEQCLASSQTYPE的{​​{3}}非常少,几乎所有数据包都包含QCLASS(“Internet”)的值QCLASS。您可能偶尔查看1 IN(混乱)。

现在就是这样 - 如果我想到其他任何事情,我会在以后添加它。

答案 1 :(得分:-4)

检查端口号怎么样?源端口和目标端口应为53。