Ubuntu Server重启后DNS又失效?一招搞定systemd-resolved开机自启
Ubuntu Server重启后DNS失效?根治systemd-resolved开机自启问题
刚部署完Ubuntu Server时,最让人抓狂的莫过于配置好的DNS解析在重启后莫名失效。那种"昨天还能用,今早全挂了"的体验,相信不少运维新手都深有体会。今天我们就来彻底解决这个幽灵问题——不是临时修复,而是让systemd-resolved服务真正实现可靠的自启动。
1. 问题现象与本质分析
当你在终端输入ping qq.com却看到"Temporary failure in name resolution"时,通常意味着DNS解析出了问题。但有趣的是,直接ping公网IP(如8.8.8.8)却能成功,这种症状明确指向了域名解析环节的故障。
关键矛盾点在于:
- 手动执行
sudo systemctl restart systemd-resolved后立即恢复正常 - 每次服务器重启后问题必然复现
/etc/resolv.conf文件神秘"消失"或内容被重置
通过systemctl status systemd-resolved查看服务状态,你可能会发现服务处于inactive状态。这揭示了核心问题:systemd-resolved服务没有正确注册到系统启动流程中。Ubuntu自17.10版本后采用systemd-resolved作为默认DNS解析方案,但其服务配置存在一些微妙特性:
# 查看服务是否启用开机启动 systemctl is-enabled systemd-resolved2. 深度解决方案:三种自启配置方法
2.1 标准服务启用方法
最直接的方式是通过systemctl启用服务:
sudo systemctl enable systemd-resolved sudo systemctl start systemd-resolved但有些环境可能需要额外操作,因为Ubuntu Server的Netplan网络配置会干扰服务启动顺序。此时需要验证服务依赖:
# 查看服务依赖树 systemctl list-dependencies systemd-resolved2.2 网络配置集成方案
对于使用Netplan的场景(Ubuntu 18.04+默认),需确保YAML配置包含DNS设置:
network: version: 2 ethernets: eth0: dhcp4: true nameservers: addresses: [8.8.8.8, 1.1.1.1]应用配置后,执行以下命令使变更生效:
sudo netplan apply sudo systemctl restart systemd-networkd2.3 底层调试与验证
为确保服务真正实现自启动,可以通过以下方式验证:
检查服务单元文件:
cat /lib/systemd/system/systemd-resolved.service模拟重启测试:
sudo systemctl reboot # 重启后立即检查 systemctl status systemd-resolved resolvectl status
3. 进阶配置与故障排查
3.1 解析状态诊断工具
掌握这些诊断命令能快速定位问题:
| 命令 | 功能描述 | 关键输出 |
|---|---|---|
resolvectl status | 显示当前DNS配置 | 活动接口的DNS服务器 |
dig example.com | 手动DNS查询测试 | 查询耗时和结果 |
journalctl -u systemd-resolved | 查看服务日志 | 启动错误信息 |
3.2 常见问题解决方案
症状1:服务已启用但依然不工作
# 检查服务冲突 sudo lsof -i :53 # 清理DNS缓存 sudo resolvectl flush-caches症状2:/etc/resolv.conf符号链接错误
# 重建正确的符号链接 sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf4. 系统架构深度解析
理解systemd-resolved的工作机制有助于彻底解决问题:
三层解析架构:
- 应用程序 → glibc resolver → systemd-resolved → 上游DNS
- 通过
strace ping example.com可以观察解析过程
缓存机制:
# 查看DNS缓存 resolvectl statisticsDNSSEC验证: 在
/etc/systemd/resolved.conf中配置:[Resolve] DNSSEC=allow-downgrade
经过这些配置后,建议进行一次完整的重启循环测试:sudo reboot now。等待系统重启后,立即运行ping example.com和systemctl status systemd-resolved双重验证。
最后分享一个实用技巧:在/etc/cloud/cloud.cfg.d/目录下创建99-dns.cfg文件,可以防止云初始化工具覆盖你的DNS设置。这个细节在AWS、Azure等云服务器环境中尤为重要。
