首页 > 解决方案 > 深入了解 DNS 查询的工作原理

问题描述

现在是凌晨 04:40,我被困在我根本不明白的事情上。我正在尝试使用 DNS 协议直接查找域的名称服务器。如果我发送一个host -t ns google.com 1.1.1.1并用 Wireshark 监控它,我可以看到 DNS 查询的完整查询。但是,我想不通,为什么一次使用某些 ASCII 字符,而不是另一次。这是一个例子:

0000   70 4d 7b 94 dd e0 00 d8 61 a9 c5 ec 08 00 45 00   pM{.....a.....E.
0010   00 38 d6 ff 00 00 80 11 9f 50 c0 a8 01 bb 01 01   .8.......P......
0020   01 01 e8 40 00 35 00 24 a0 19 9e f7 01 00 00 01   ...@.5.$........
0030   00 00 00 00 00 00 06 67 6f 6f 67 6c 65 03 63 6f   .......google.co
0040   6d 00 00 02 00 01                                 m.....

在此 DNS 查询中,我正在查找google.com. 实际查询从 开始06 07

06在 ASCII 中是 ACK/确认。


现在,如果我们看一下gmail.com

0000   70 4d 7b 94 dd e0 00 d8 61 a9 c5 ec 08 00 45 00   pM{.....a.....E.
0010   00 37 d7 00 00 00 80 11 9f 50 c0 a8 01 bb 01 01   .7.......P......
0020   01 01 e8 58 00 35 00 23 8f cc 6f e2 01 00 00 01   ...X.5.#..o.....
0030   00 00 00 00 00 00 05 67 6d 61 69 6c 03 63 6f 6d   .......gmail.com
0040   00 00 02 00 01                                    .....

查询开始于05 67

05是 ENQ/查询。


为什么它们不同?如果我尝试发送06而不是05DNS 服务器给我没有响应但 Wireshark 告诉我:

未知的扩展标签

我见过05, 06,09到目前为止。09是我有史以来最大的“wat”,因为它是 HT/Horizo​​ntal Tab。

有很多DNS知识的人可以在这里帮助我吗?我不是在寻找“只使用 dig/nslookup/host 命令”。我目前正在尝试对DNS协议进行一些研究,这是我不明白的事情。

很好的阅读,我得到了很多帮助:http ://dev.lab427.net/dns-query-wth-netcat.html

标签: networkingdns

解决方案


对于这样的二进制协议,您不能假设每个字节都对应于匹配的 ASCII 字符。

查看 DNS RFC ( https://www.ietf.org/rfc/rfc1035.txt ) 的第 4.1.2 节。

DNS 请求中的域名被分解为“标签”。对于每个标签,第一个字节是标签的长度,然后写入字符串的字节。

对于您的 Google.com 示例,标签是​​“google”和“com”。06是第一个标签中的字节数。后面是“google”的字节。然后03是“com”标签中的字节数。在“com”字节之后,该00字节是用于标记结束的 NULL 标签。


推荐阅读