Ubuntu 20.04 DNS配置终极指南告别手动修改resolv.conf的时代每次重启后DNS设置就失效修改/etc/resolv.conf却总被系统自动覆盖这可能是Ubuntu用户最常遇到的网络配置困扰之一。本文将彻底解析systemd-resolved的工作原理并提供一个经得起重启考验的标准解决方案。1. 为什么直接修改resolv.conf会失效在传统的Linux系统中/etc/resolv.conf是DNS解析的核心配置文件直接编辑这个文件就能立即生效。但Ubuntu 20.04引入systemd-resolved服务后这套方法不再适用——你会发现每次重启后修改都被还原。关键原因在于现代Ubuntu系统中/etc/resolv.conf实际上是一个符号链接ls -l /etc/resolv.conf # 典型输出resolv.conf - ../run/systemd/resolve/stub-resolv.conf这个链接指向的文件由systemd-resolved服务动态管理任何手动修改都会被系统覆盖。更糟糕的是直接修改这个文件可能会破坏systemd-resolved的正常工作流程。2. systemd-resolved架构解析要理解正确的配置方法我们需要先了解systemd-resolved的三层架构设计前端接口监听127.0.0.53接收来自应用的DNS查询解析引擎处理缓存、LLMNR/mDNS等高级功能后端配置实际连接上游DNS服务器这种架构带来了几个重要特性本地缓存加速重复查询支持DNSSEC验证多链路DNS策略路由统一的配置管理接口3. 正确配置DNS的三种方法3.1 方法一修改resolved.conf主配置文件这是最推荐的标准方法配置步骤如下使用sudo权限编辑配置文件sudo nano /etc/systemd/resolved.conf取消DNS行的注释并添加首选DNS服务器[Resolve] DNS8.8.8.8 208.67.222.222可选配置其他参数FallbackDNS1.1.1.1 9.9.9.9 Domains~. DNSSECallow-downgrade重启服务使配置生效sudo systemctl restart systemd-resolved提示多个DNS服务器用空格分隔系统会按顺序尝试3.2 方法二使用resolvectl动态配置对于需要临时修改或测试的场景resolvectl工具提供了实时控制接口# 查看当前状态 resolvectl status # 设置全局DNS sudo resolvectl dns eth0 8.8.8.8 208.67.222.222 # 设置特定域名的DNS sudo resolvectl domain eth0 ~example.com # 清空DNS缓存 sudo resolvectl flush-caches这种方式的优点是即时生效但缺点是配置不会持久化重启后失效。3.3 方法三NetworkManager集成配置对于使用NetworkManager管理网络的环境可以通过nmcli工具配置# 为特定连接添加DNS sudo nmcli connection modify 有线连接1 ipv4.dns 8.8.8.8 208.67.222.222 # 设置DNS搜索域 sudo nmcli connection modify 有线连接1 ipv4.dns-search example.com # 禁用DHCP提供的DNS sudo nmcli connection modify 有线连接1 ipv4.ignore-auto-dns yes # 应用更改 sudo nmcli connection up 有线连接14. 验证与故障排除配置完成后需要验证DNS是否正常工作# 测试基础解析 ping -c3 example.com # 使用dig检查详细解析过程 dig example.com # 检查使用的DNS服务器 resolvectl status # 查看实际的resolv.conf内容 cat /run/systemd/resolve/resolv.conf常见问题及解决方案DNS不生效检查服务状态sudo systemctl status systemd-resolved配置被覆盖确保没有其他服务(如dhclient)在修改DNS设置部分域名解析失败尝试禁用DNSSECsudo resolvectl dnssec eth0 off5. 高级配置技巧5.1 按网络接口配置不同DNS对于多网卡环境可以为不同接口指定专属DNSsudo resolvectl dns eth0 192.168.1.1 sudo resolvectl dns wlan0 8.8.8.85.2 配置DNS-over-TLS提升DNS查询安全性# /etc/systemd/resolved.conf [Resolve] DNS9.9.9.9#dns.quad9.net DNSOverTLSopportunistic5.3 自定义搜索域简化内部网络访问# /etc/systemd/resolved.conf [Resolve] Domains~internal.company.com ~lab.company.com6. 与传统配置的兼容方案对于必须使用传统resolv.conf的遗留应用可以关闭stub解析器sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf但这样会失去systemd-resolved的缓存和DNSSEC等高级功能非必要不建议使用。