DNS 的奇怪问题:drill 可以工作,但 getent 主机却不能

DNS 的奇怪问题:drill 可以工作,但 getent 主机却不能

我在 Raspberry Pi 4 上运行 Arch Linux ARM。我目前遇到域解析问题。 “用户空间”应用程序(包括 ping、Web 浏览器等)无法解析主机,尽管我可以访问https://1.1.1.1在铬中。钻头工作正常(?!),但getent hosts不工作。我尝试过覆盖/etc/resolv.conf和使用resolvconf -u(通过编辑/etc/resolvconf.conf)但无济于事。有任何想法吗? (/etc/hosts按预期工作)

$ cat /etc/resolv.conf 
domain lan
nameserver 1.1.1.1

$ drill unix.stackexchange.org
;; ->>HEADER<<- opcode: QUERY:, rcode: NXDOMAIN, id: 45971
;; flags qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;; unix.stackexchange.org.    IN       A

;; ANSWER SECTION:
unix.stackexchange.org. 14400   IN    CNAME    stackexchange.org.
stackexchange.org.      14400   IN    A        67.227.226.240

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 111 msec
;; SERVER: 192.168.42.129
;; WHEN: Tue Nov 26 13:09:11 2019
;; MSG SIZE rcvd: 70
$ grep hosts /etc/nsswitch.conf
hosts: files mymachines myhostname resolve [!UNAVAIL=return] dns

答案1

现代浏览器可能使用 DNS-over-HTTPS (,火狐浏览器)。因此,它们可能具有完全独立于主操作系统的有效主机名解析。

nsswitch.conf指定在传统的基于 DNS 查找 ( )之前首先尝试resolve(即) 。如果找不到所请求的数据,或者报告临时错误代码,则将失败视为查找结果。您可以通过运行查看所使用的DNS服务器。systemd-resolvedresolv.confdnssystemd-resolvedsystemd-resolvedresolvectl status

drill命令显式地查找resolv.conf默认名称服务器;除此之外,它nsswitch.conf完全跳过机制并自行完成所有工作。

systemd-resolved明确忽略resolv.conf允许通过在 中指定drill来重定向到的程序,并且还因为允许为不同的网络接口配置不同的 DNS 服务器。)systemd-resolvednameserver 127.0.0.53resolv.confsystemd-resolved

所以,我对正在发生的事情的解释是:

  • Chromium:之所以有效,是因为它使用 DNS-over-HTTPS。
  • drill:有效,因为它会跳过nsswitch.conf并直接查看resolv.conf
  • 基本上其他一切:使用中指定的机制nsswitch.conf并最终查询,systemd-resolved由于某种原因显然具有非功能性 DNS 设置(可能其请求被防火墙阻止,或者它正在与不合作的 DNS 服务器通信?),因此无法获取 DNS信息。resolv.conf仅当尝试使用返回“永久失败”结果代码时,此类程序才会使用中指定的 DNS 服务器systemd-resolved- 显然现在不会发生这种情况。

mymachines大概是nsswitch.conf这个主机名解析模块它将自动解析本地虚拟机和其他由systemd-machined.它对于解析非本地名称应该没有任何影响。

同样,myhostname可能指的是这个主机名解析模块这确保当前本地主机名、名称localhostlocalhost.localdomain名称_gateway始终得到解析,即使不存在网络连接也是如此。

相关内容