简短问题
空的 MNAME 是否有效?它最终会影响客户端,如 Windows PC 或智能手机吗?
我的情况
我正在调试一个问题,在 Android 应用程序中解析主机名有时会卡在对标准 Android Bionic 函数的本机调用中,该函数用于解析主机名。调用有时会在几秒钟后返回,有时会在 15 分钟后返回(!)。但是,当在从 Java 调用本机函数之前调用本机函数时,使用特定请求仅解析主机名的 IPv4 地址,调用会立即返回。如果再次调用该函数并请求主机名的 IPv6 地址,它会卡住。所以它一定与 DNS IPv6 有关。
我已经使用 Wireshark 进行了一些挖掘,下面的主机名和 IP 地址被替换为虚拟地址。
IPv4 挖掘
这是标准回应:
$ dig sub.domain.de -t A
; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> domain.de -t A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47021
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sub.domain.de. IN A
;; ANSWER SECTION:
domain.de. 5771 IN A 111.111.111.111
;; AUTHORITY SECTION:
. 8267 IN NS i.root-servers.net.
. 8267 IN NS c.root-servers.net.
. [...]
;; Query time: 3 msec
;; SERVER: 172.16.0.90#53(172.16.0.90)
;; WHEN: Wed Feb 24 16:02:52 CET 2021
;; MSG SIZE rcvd: 283
IPv6挖掘
IPv6 响应不包含答案,因为似乎没有为主机名分配 IPv6 地址。但是,它包含一个 SOA 记录,其中 MNAME 设置为零字节。
$ dig sub.domain.de -t AAAA
; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> sub.domain.de -t AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27732
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sub.domain.de. IN AAAA
;; AUTHORITY SECTION:
domain.de. 599 IN SOA . admin.domain.de. 2021022401 10800 3600 604800 600
;; Query time: 29 msec
;; SERVER: 172.16.0.90#53(172.16.0.90)
;; WHEN: Wed Feb 24 15:57:07 CET 2021
;; MSG SIZE rcvd: 102
上面的挖掘将 MNAME 描述为一个点“。”,但是当检查 Wireshark 响应时,我可以看到 MNAME 字段只是一个零字节。
长问题
- 空的 MNAME 字段是否有效?RIPE NCC 对 DNS SOA 值的建议说:“DNS 规范明确指出主要主服务器在此命名。必须确定并使用该值。[...]”
- Android DNS 解析器是否会对此感到困惑,拼命尝试根据名称未定义的主名称服务器解析主机名?
- 对于未指定 IPv6 地址的主机名,RCODE NOERROR 是否合法?由于主机名在 IPv6 领域中不存在,所以不应该是 NXDOMAIN 吗?或者该响应完全有效?
答案1
.
从技术上讲,这是该字段的一个可能值,但正如您注意到的,它实际上并不是名称服务器的名称,因此并不有效。- 不太可能,因为
SOA
MNAME
并不真正用于正常查找。虽然记录NS
对于在正常查找过程中查找名称服务器至关重要,但SOA
MNAME
仅在某些特定情况下使用,在这些情况下,哪个服务器是“主服务器”很重要(例如 NOTIFY 和 UPDATE 消息的一些默认值)。 - 是的。授权部分中的
NOERROR
+SOA
就是所谓的NODATA
响应。这是一个否定响应,只是表示请求的记录类型在该名称下不存在,而不像其他响应NXDOMAIN
那样表示该名称根本不存在。