手动 DNS 根 NS 查询对 1.1.1.1 失败,但对 8.8.8.8 成功

手动 DNS 根 NS 查询对 1.1.1.1 失败,但对 8.8.8.8 成功

出于教育目的,我使用 python 发送手工制作的数据包来查询根 NS。期望获得与 类似的结果dig NS . @1.1.1.1

NS .以下内容仅与预期的任何其他作品相关NS <domain>

给定以下数据包结构:

(Pdb) req
                     1
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             0x28c2            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|  0x0  |0|0|1|0|  0  |  0x0  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             0x0001            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             0x0000            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             0x0000            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             0x0000            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<--
/                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             0x0002            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             0x0001            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<--

(Pdb) bytes(req)
b'(\xc2\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01'

然后将其发送到cloudflare1.1.1.1和 google8.8.8.8

(Pdb) len(req.send(("8.8.8.8", 53)).records)
13

(Pdb) len(req.send(("1.1.1.1", 53)).records)
0

检查通过 Wireshark 发送的查询dig显示与上面的 python 查询完全相同的字段,只是dig发送了一条额外的edns记录。

我试图找出为什么上述查询有效8.8.8.8但失败了1.1.1.1

答案1

如果您调整dig命令行以发送此查询的同样最小版本,您将获得:

$ dig . NS +noedns +ignore @1.1.1.1

; <<>> DiG 9.18.16-1~deb12u1-Debian <<>> . NS +noedns +ignore @1.1.1.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42553
;; flags: qr tc rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;.                              IN      NS

;; Query time: 3 msec
;; SERVER: 1.1.1.1#53(1.1.1.1) (UDP)
;; WHEN: Sun Jul 30 16:11:19 CEST 2023
;; MSG SIZE  rcvd: 17

$

即,1.1.1.1您收到一个(空的)截断响应(注意标志TC)。
我不确定为什么在这种情况下,它们不会简单地为 rrset 单独服务,因为这是合适的,但这是导致您的问题NS的行为。1.1.1.1

如果没有 EDNS0,答案大小将被限制为 512 字节,而有了 EDNS0,客户端可以指示他们可以接受的更大的消息大小(目前通常为 1232 字节)。

+noedns对查询的实际更改,+ignore仅显示截断消息本身而不是尝试通过 TCP 获取完整答案)

相关内容