【发布时间】:2021-06-28 19:49:13
【问题描述】:
我正在尝试将一个简单版本的 dig 实现为一个带有 python 的项目。我想通过迭代来实现 DNS 查找。我阅读了RFC 文档,我想我应该检查 AA(Authoritative Answer) 位是否作为响应,如果它没有设置为 1,我应该向给定响应中提供的 IP 发送相同的请求,直到该位被设置。 当我尝试 google.com 并使用 Wireshark 检查响应时,它提供了正确的 IP,但 AA 位仍然为 0,当我继续发送请求时,它似乎无处可去。 这是进行迭代查找的正确方法吗?如果是,如何区分权威答案和非权威答案? 这是向 1.1.1.1 服务器询问 google.com 时的结果:
Flags: 0x8080 Standard query response, No error
1... .... .... .... = Response: Message is a response
.000 0... .... .... = Opcode: Standard query (0)
.... .0.. .... .... = Authoritative: Server is not an authority for domain
.... ..0. .... .... = Truncated: Message is not truncated
.... ...0 .... .... = Recursion desired: Don't do query recursively
.... .... 1... .... = Recursion available: Server can do recursive queries
.... .... .0.. .... = Z: reserved (0)
.... .... ..0. .... = Answer authenticated: Answer/authority portion was not authenticated by the server
.... .... ...0 .... = Non-authenticated data: Unacceptable
.... .... .... 0000 = Reply code: No error (0)
【问题讨论】:
-
“我正在尝试将一个简单版本的 dig 实现为一个带有 python 的项目。”只是为了学习(关于 DNS 和/或 Python)或其他原因?因为否则 Python
dnspython模块是 Python 中所有 DNS 需求所需的全部,它提供高级和低级接口来完成所有操作(从仅解析记录,构建/解析 DNS 数据包到线路级别) -
"我想我应该检查 AA(Authoritative Answer) 位是否作为响应,如果它没有设置为 1,我应该向给定响应中提供的 IP 发送相同的请求,直到该位被设置。”您似乎对 DNS 的工作方式有一些误解。您需要首先确定递归和权威名称服务器如何工作,以及当您查询其中一个或另一个时会发生什么。作为介绍,RFC 可能过于简洁/困难,en.wikipedia.org/wiki/Domain_Name_System 上的这篇文章可能是一种更温和的方法。
-
或者,混合我之前的两个 cmets,在尝试自己的新代码之前,只需使用 dnspython 并查看网络上的痕迹,以便您了解发生了什么。然后,如果您想更好地理解 DNS/Python,您可以通过查看新的网络跟踪尝试自己重现相同的结果(通过比较网络跟踪,但当然有些事情会改变,例如 DNS ID 或名称的大小写)。
-
+1 @PatrickMevzek 三个 cmets。此外,了解如何从根到 gTLD 再到域名服务器。有非常简单的步骤可以完成此操作。了解 AA 位的实际含义以及设置该位的人。
-
@PatrickMevzek 我不允许为此使用任何模块,但是我使用 dig +trace 来查看发生了什么,它首先将 NS 记录请求发送到根服务器和 gtld 服务器,然后发送一个对权威服务器的记录请求并显示响应,但由于 1.1.1.1 不是权威服务器,所以当 1.1.1.1 响应我时未设置 AA 位。我做对了吗?
标签: python dns network-protocols