出于教育目的,我使用 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 获取完整答案)