我使用 dnsmasq 在我的 LAN 上提供 DHCP 服务。 dnsmasq 还提供 DNS 服务。
当主机通过 DHCP 获取 IP 地址时,dnsmasq 将通过提供DHCP 分配的 IP 地址foo
来响应该名称的 DNS 查询。如下所示:foo
foo
$ 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
。这可以从下面看到。 (注意:dnsmasq
和dig
运行在不同的服务器上,具有不同的 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=
确实能解决我的问题,但看起来很可能会。