我在 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-resolved
resolv.conf
dns
systemd-resolved
systemd-resolved
resolvectl status
该drill
命令显式地查找resolv.conf
默认名称服务器;除此之外,它nsswitch.conf
完全跳过机制并自行完成所有工作。
(systemd-resolved
明确忽略resolv.conf
允许通过在 中指定drill
来重定向到的程序,并且还因为允许为不同的网络接口配置不同的 DNS 服务器。)systemd-resolved
nameserver 127.0.0.53
resolv.conf
systemd-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
可能指的是这个主机名解析模块这确保当前本地主机名、名称localhost
和localhost.localdomain
名称_gateway
始终得到解析,即使不存在网络连接也是如此。