【问题标题】:Iterative DNS lookup迭代 DNS 查找
【发布时间】: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


【解决方案1】:

这是向 1.1.1.1 服务器询问 google.com 时的结果:

DNS 查询并不总是以权威答案结束。事实上,1.1.1.1 是一个迭代解析器,因此他的工作是查询相关服务器(root ->.com -> google.com)并返回最终答案,因为1.1.1.1是返回它的那个。然后它会缓存响应并在有人问他同样的问题时返回它。

如果你想创建一个类似于挖掘的工具并寻找www.stackoverflow.com,你需要做1.1.1.1 所做的事情——从一个根开始(例如a.root-servers.net.),然后向它询问.com。然后向.com 服务器(例如a.gtld-servers.net)询问stackoverflow.com。最后,向负责stackoverflow.com(例如ns-1033.awsdns-01.org)的服务器询问A/AAAA 记录为www.stackoverflow.com。你从中得到的答案应该是权威的:

> dig www.stackoverflow.com @ns-1033.awsdns-01.org                                                                                                                          ──(Thu,Apr08)─┘

; <<>> DiG 9.16.1-Ubuntu <<>> www.stackoverflow.com @ns-1033.awsdns-01.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62794
;; flags: qr aa rd; QUERY: 1, ANSWER: 5, AUTHORITY: 4, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.stackoverflow.com.         IN      A

;; ANSWER SECTION:
www.stackoverflow.com.  3600    IN      CNAME   stackoverflow.com.
stackoverflow.com.      3600    IN      A       151.101.65.69
stackoverflow.com.      3600    IN      A       151.101.1.69
stackoverflow.com.      3600    IN      A       151.101.193.69
stackoverflow.com.      3600    IN      A       151.101.129.69

;; AUTHORITY SECTION:
stackoverflow.com.      172800  IN      NS      ns-1033.awsdns-01.org.
stackoverflow.com.      172800  IN      NS      ns-358.awsdns-44.com.
stackoverflow.com.      172800  IN      NS      ns-cloud-e1.googledomains.com.
stackoverflow.com.      172800  IN      NS      ns-cloud-e2.googledomains.com.

注意aa 标志:flags: qr aa rd

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 2010-10-28
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多