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 status3. 进阶配置与故障排查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] DNSSECallow-downgrade经过这些配置后建议进行一次完整的重启循环测试sudo reboot now。等待系统重启后立即运行ping example.com和systemctl status systemd-resolved双重验证。最后分享一个实用技巧在/etc/cloud/cloud.cfg.d/目录下创建99-dns.cfg文件可以防止云初始化工具覆盖你的DNS设置。这个细节在AWS、Azure等云服务器环境中尤为重要。