我已经使用 Ubuntu Server 21.10 大约 6 个月了,没有发生过任何意外。最近,由于 DNS 解析失败,我的一些服务(包括容器中的服务以及 Docker 守护程序本身)突然遇到问题。
yoshie@vdocker:~$ systemd-resolve --status
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: missing
Link 2 (enp0s4)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
DNS Servers: 8.8.8.8 8.8.4.4
DNS Domain: localdomain
yoshie@vdocker:~$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=11.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=10.7 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
yoshie@vdocker:~$ ping google.com
ping: google.com: Temporary failure in name resolution
我可以看到/etc/resolv.conf
确实缺少了。但在网上查找,似乎不建议自己编写此文件。根据本网站resolvconf
,该文件可以由、network-manager
或 DHCP 客户端写入。
我没有resolvconf
或者network-manager
没有安装:
yoshie@vdocker:~$ resolvconf
Command 'resolvconf' not found, but can be installed with:
sudo apt install openresolv # version 3.12.0-1, or
sudo apt install resolvconf # version 1.84ubuntu1
yoshie@vdocker:~$ sudo service network-manager status
Unit network-manager.service could not be found.
我确实启用了 DHCP,但我的 DHCP 服务器配置了8.8.8.8
和8.8.4.4
,我认为systemd-resolve --status
DNS 地址就是从那里获取的。但解析仍然失败。
我尝试在我的 netplan 配置中指定 DNS 服务器,但是这样做导致我的服务器无法访问,因此我不得不通过控制台会话撤消更改。
我开始关注这些说明用于使用 systemd-resolved 配置 DNS,但似乎我需要的一些目录不存在,所以我放弃了该过程,因为我怀疑它不适合 Ubuntu。
我尝试重新启动服务器,但没有效果。
在原始 Ubuntu 21.10 安装中,DNS 解析的预期工作机制是什么?应该在哪个过程中写入 resolv.conf?为什么 DNS 解析过去一直有效,但现在却突然失败了?
答案1
由于您的系统已安装并正在运行 systemd-resolved,因此它将成为此处的首选机制。符号链接 /etc/resolv.conf 可/run/systemd/resolve/resolv.conf
直接访问已配置的 DNS 服务器,或/run/systemd/resolve/stub-resolv.conf
使用 systemd-resolved 作为本地 DNS 缓存。
Ubuntu 使用 systemd-networkd 进行 IP 配置和 DHCP(通过 netplan,但 netplan 只是一个转换器);networkd 通过 D-Bus 将 DNS 服务器地址上传到 systemd-resolved,并且不使用“resolvconf”工具。
如果系统有静止的IP 配置,那么手动创建具有静态 DNS 服务器地址的 resolv.conf 也是可以的。