为什么 systemd-resolvd 无法透明地查询其上游 DNS 解析器以获取短主机名?

为什么 systemd-resolvd 无法透明地查询其上游 DNS 解析器以获取短主机名?

我使用 dnsmasq 在我的 LAN 上提供 DHCP 服务。 dnsmasq 还提供 DNS 服务。

当主机通过 DHCP 获取 IP 地址时,dnsmasq 将通过提供DHCP 分配的 IP 地址foo来响应该名称的 DNS 查询。如下所示:foofoo

$ dig foo @$dnsmasq_ip

; <<>> DiG 9.16.1-Ubuntu <<>> foo @[snip]
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13710
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
foo.                    0       IN      A       192.168.0.[snip]

;; Query time: 0 msec
;; SERVER: 192.168.0.22#53(192.168.0.22)
;; WHEN: Sun May 01 21:03:03 PDT 2022
;; MSG SIZE  rcvd: 51

但是,当我不直接查询 dnsmasq 服务器时,DNS 查询会转至systemd-resolved. systemd-resolved响应SERVFAIL,而不是提供 IP 地址foo。这可以从下面看到。 (注意:dnsmasqdig运行在不同的服务器上,具有不同的 IP 地址。)

$ dig foo 

; <<>> DiG 9.16.1-Ubuntu <<>> foo
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 13439
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;foo.                                   IN      A

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun May 01 21:06:53 PDT 2022
;; MSG SIZE  rcvd: 35

如果我dig请求完全限定的域名,systemd-resolved将查询dnsmasq并响应结果。我相信我只在使用短主机名时遇到上述SERVFAIL错误。dig

我的问题是,为什么systemd-resolved无法透明地中继短主机名的查询?有什么方法可以启用短主机名的中继吗?

答案1

systemd-resolved无法透明地查询短主机名似乎是一个功能。可以禁用的功能。

与传统 glibc 存根解析器的兼容性

使用单播 DNS 不会解析 A 和 AAAA 记录的单标签名称(除非使用 ResolveUnicastSingleLabel= 覆盖,请参阅resolved.conf(5))。这类似于 resolv.conf(5) 中设置的 no-tld-query 选项。

来源:https://systemd.network/systemd-resolved.service.html

注意:我尚未证实这ResolveUnicastSingleLabel=确实能解决我的问题,但看起来很可能会。

相关内容