查看数据包字节代码时,如何识别dns数据包。 IP报头的协议字段会告诉UDP帧,但在UDP帧内没有协议字段来指定接下来会发生什么,从我可以看到,帧内没有任何内容可以唯一地将其识别为dns数据包
答案 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
)中,ANCOUNT
和NSCOUNT
值将完全为零(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位字将是QTYPE
和QCLASS
。 QTYPE
的{{3}}非常少,几乎所有数据包都包含QCLASS
(“Internet”)的值QCLASS
。您可能偶尔查看1
IN
(混乱)。
现在就是这样 - 如果我想到其他任何事情,我会在以后添加它。
答案 1 :(得分:-4)
检查端口号怎么样?源端口和目标端口应为53。