python - 为什么 DNS 响应不同?

标签 python dns dig

我有Python代码。

from dns import message, query, flags, rdatatype

q = message.make_query("bancontact.node1.web1.prod.kunstmaan.com", rdatatype.NS, want_dnssec=True)
q.flags |= flags.AD
res = query.udp(q, "170.252.72.92")

dig查询

dig bancontact.node1.web1.prod.kunstmaan.com ns  @170.252.72.92

我用 Wireshark 检查查询是否相等:

此查询来自 python:

0000   4c 17 eb fe 74 00 f0 18 98 74 f9 be 08 00 45 00   L...t....t....E.
0010   00 61 2b 0d 00 00 40 11 9a 71 c0 a8 01 0d aa fc   .a+...@..q......
0020   48 5c d0 42 00 35 00 4d 18 59 7d 2a 01 20 00 01   H\.B.5.M.Y}*. ..
0030   00 00 00 00 00 01 0a 62 61 6e 63 6f 6e 74 61 63   .......bancontac
0040   74 05 6e 6f 64 65 31 04 77 65 62 31 04 70 72 6f   t.node1.web1.pro
0050   64 09 6b 75 6e 73 74 6d 61 61 6e 03 63 6f 6d 00   d.kunstmaan.com.
0060   00 02 00 01 00 00 29 05 00 00 00 80 00 00 00      ......)........

这来自挖掘

0000   4c 17 eb fe 74 00 f0 18 98 74 f9 be 08 00 45 00   L...t....t....E.
0010   00 61 c8 9b 00 00 40 11 fc e2 c0 a8 01 0d aa fc   .a....@.........
0020   48 5c d4 49 00 35 00 4d 45 f3 4b fe 01 20 00 01   H\.I.5.ME.K.. ..
0030   00 00 00 00 00 01 0a 62 61 6e 63 6f 6e 74 61 63   .......bancontac
0040   74 05 6e 6f 64 65 31 04 77 65 62 31 04 70 72 6f   t.node1.web1.pro
0050   64 09 6b 75 6e 73 74 6d 61 61 6e 03 63 6f 6d 00   d.kunstmaan.com.
0060   00 02 00 01 00 00 29 10 00 00 00 00 00 00 00      ......)........

仅标识方面存在差异:2b 0dc8 9b, header 校验和:9a 71fc e2 ,源端口:d0 42 vs d4 49 和事务 ID:18 59 7d 2a vs 45 f3 4b fe .

查询等于,所有标志都等于,但响应来自 python 代码的查询:

DNS 119 Standard query response 0x7d2a NS bancontact.node1.web1.prod.kunstmaan.com OPT

与 dig 查询的响应不同

DNS 205 Standard query response 0x4bfe NS bancontact.node1.web1.prod.kunstmaan.com CNAME public.node1.web1.prod.kunstmaan.com SOA amrns1501.accenture.com OPT

有人能解释一下为什么会发生吗?

谢谢。

最佳答案

您的查询之间还有两个差异:

  1. 从 python 中,您有 05 00,从 dig 中,您有 10 00 作为“UDP Payload Size
  2. 从 python 中,您设置了 DNSSEC OK bit (80 00),来自 dig 未设置 (00 00)

因此,服务器无法将整个响应(对 python 查询)容纳在 1280 字节内,而只返回空响应。

DIG 表示它可以接受最多 4096 字节的响应,并且也没有请求 DNSSEC RRS,因此答案由服务器提供(没有 DNSSEC,它甚至可以容纳 1280 字节)。最重要的是,dig 默认情况下会使用 tcp 重试,以防它对初始 udp 查询的响应被截断。

此挖掘查询应导致对服务器的相同查询和来自服务器的(空)响应(与 python 相比):

dig bancontact.node1.web1.prod.kunstmaan.com ns  @170.252.72.92 +bufsize=1280 +dnssec +ignore +nocookie

关于python - 为什么 DNS 响应不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57934720/

相关文章:

dig - 通过一条命令获取 IPv4 和 IPv6

Python EXIF 无法找到拍摄日期信息,但在通过 Windows 属性查看器时存在

执行 dig -x 的 bash 脚本

python - 在python中枚举返回什么样的对象?

java - Java中的DNS查询

ruby-on-rails - ruby on rails 邮件程序和非 unicode 域 (.рф)

cocoa - Mac OS X 上的 Open Directory 目录域名

dns - 挖掘结果中的权威部分是什么意思?

python - 创建每日滚动当前最高值系列

python - 我无法在Python太空入侵者游戏中射击时移动我的角色(使用Zelle图形包)