直接改 /etc/resolv.conf 通常不持久,因现代 linux 发行版(如 ubuntu 18.04+、centos 8+、fedora)默认由 systemd-resolved 或 networkmanager 动态管理该文件;需先用 ls -l /etc/resolv.conf 和 systemctl is-active systemd-resolved 判断管理服务,再通过 /etc/systemd/resolved.conf 或 nmcli 等对应机制持久配置 dns。

直接改 /etc/resolv.conf 通常能快速见效,但多数现代 Linux 发行版(Ubuntu 18.04+、CentOS 8+、Fedora 等)会自动覆盖它——硬写进去,重启或重连网络后就没了。真要根治,得看系统用的是哪套 DNS 管理机制。
确认 systemd-resolved 是否在接管 DNS
Ubuntu、Debian 11+、Fedora 默认启用 systemd-resolved,它会把 /etc/resolv.conf 指向 127.0.0.53,再由自己转发请求。如果它没配好,所有域名解析都会挂:
- 运行
systemctl status systemd-resolved,确认状态是active (running) - 检查
/etc/systemd/resolved.conf,确保[Resolve]段里有有效 DNS,比如:[Resolve] DNS=8.8.8.8 1.1.1.1 FallbackDNS=114.114.114.114
- 改完必须执行
sudo systemctl restart systemd-resolved,否则不生效 - 验证:
resolvectl status应该显示你刚配的 DNS 地址,且resolvectl query baidu.com能返回 IP
容器或虚拟机里报错,别只改宿主机
Docker 容器默认继承宿主机的 DNS 配置,但经常被 127.0.0.11 或空配置坑住;KVM/VirtualBox 虚拟机则可能因 NAT 模式下 DNS 转发未开启而失败:
- Docker:编辑
/etc/docker/daemon.json,强制指定 DNS:{ "dns": ["8.8.8.8", "114.114.114.114"] }然后sudo systemctl restart docker - VirtualBox/KVM:检查虚拟网络是否启用 DHCP + DNS 代理;NAT 模式下可临时切为桥接模式测试
- 确认宿主机
sysctl net.ipv4.ip_forward是 1(尤其 Docker 或自建网关场景)
/etc/hosts 里 hostname 解析失败也会触发这个错误
很多工具(如 sudo、ssh、某些 Python 库)启动时会反查本机 hostname 对应的 IP。如果 /etc/hosts 里没这一行,就会卡在 DNS 查询上,报出 “Temporary failure in name resolution”:
- 运行
hostname查出当前主机名(比如dev-nn001) - 检查
/etc/hosts是否含:127.0.0.1 localhost localhost.localdomain 127.0.0.1 dev-nn001
- 注意:不能只写
127.0.0.1 localhost就完事,hostname 必须显式映射到127.0.0.1或实际 IP - 改完无需重启服务,立即生效
最易忽略的是:错误提示里那个 “temporary” 并不总代表“过一阵就好”,而是 libc 在超时后放弃尝试——背后可能是 DNS 请求被防火墙静默丢弃、systemd-resolved 与 NetworkManager 冲突、或者容器网络命名空间里压根没挂载 DNS 配置。动手前先跑一遍 ping -c2 8.8.8.8 和 nslookup baidu.com 8.8.8.8,比盲目改配置快得多。











