Ubuntu 20.04 默认启用 systemd-resolved 管理 DNS,直接修改 /etc/resolv.conf 往往会在重启后失效,推荐通过修改 /etc/systemd/resolved.conf 配合 resolvectl 命令进行持久化配置。
先说结论:系统自带服务,配置需兼顾服务状态与符号链接,避免被网络管理器覆盖。
- 适合需要持久化 DNS 且不使用 NetworkManager 托管的场景
- 先确认当前解析状态与链接关系
- 验收时检查 resolvectl 输出与连通性
- 若使用 Netplan,建议优先在 Netplan 配置中指定 DNS
命令速用版
sudo systemctl status systemd-resolved
sudo nano /etc/systemd/resolved.conf
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
sudo systemctl restart systemd-resolved为什么会这样
systemd-resolved 是 systemd 套件的一部分,作为本地存根解析器运行。它监听本地 53 端口,接管系统的 DNS 请求。Ubuntu 20.04 中,/etc/resolv.conf 通常是指向 /run/systemd/resolve/stub-resolv.conf 的符号链接。如果直接编辑该文件,重启网络服务或系统后,链接可能被重置,导致配置丢失。
分步处理
1. 检查当前状态:运行 systemctl status systemd-resolved 确认服务正在运行。
2. 编辑配置文件:打开 /etc/systemd/resolved.conf,取消 [Resolve] 部分 DNS 行的注释,填入首选 DNS 服务器 IP。配置示例如下:
[Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=9.9.9.9
#DNSOverTLS=opportunistic3. 确认符号链接:检查 /etc/resolv.conf 是否指向 /run/systemd/resolve/stub-resolv.conf。如果指向其他位置,执行以下命令重新链接:
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf4. 重启服务:执行 sudo systemctl restart systemd-resolved 使配置生效。
Netplan 协同配置
Ubuntu 20.04 默认使用 Netplan 管理网络。如果系统中存在 Netplan 配置(/etc/netplan/*.yaml),其 DNS 设置优先级可能高于 resolved.conf。建议优先在 Netplan 配置文件中指定 DNS,例如:
network:
version: 2
ethernets:
eth0:
nameservers:
addresses: [8.8.8.8, 1.1.1.1]配置后执行 sudo netplan apply 生效。若必须使用 resolved.conf 直接配置,请确保 Netplan 未接管该接口的 DNS 设置。
怎么验证是否生效
使用 resolvectl status 查看当前 DNS 服务器配置是否已更新。使用 dig www.example.com 测试域名解析是否正常返回 IP 地址。
resolvectl status
dig www.example.com常见坑
1. 符号链接断裂:某些工具会强制覆盖 /etc/resolv.conf 为普通文件,导致 systemd-resolved 失效。需定期检查链接状态。
2. 与 Netplan 冲突:如果使用 Netplan 配置网络,DNS 设置可能在 Netplan 配置文件中优先级更高,导致 resolved.conf 配置不生效。
3. Docker 影响:Docker 守护进程可能会修改宿主机的 DNS 配置,需留意 daemon.json 设置。
参考来源
- Ubuntu Server Guide - Network configuration: https://ubuntu.com/server/docs/network-configuration
- systemd-resolved.service Man Page: https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html