如何在 Ubuntu 20.04 上使用 systemd-resolved 配置 DNS?

文章导读
Ubuntu 20.04 默认启用 systemd-resolved 管理 DNS,直接修改 /etc/resolv.conf 往往会在重启后失效,推荐通过修改 /etc/systemd/resolved.conf 配合 resolvectl 命令进行持久化配置。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D Netplan 协同配置
  5. E 怎么验证是否生效
  6. F 常见坑
  7. G 参考来源
A A

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 确认服务正在运行。

如何在 Ubuntu 20.04 上使用 systemd-resolved 配置 DNS?

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=opportunistic

3. 确认符号链接:检查 /etc/resolv.conf 是否指向 /run/systemd/resolve/stub-resolv.conf。如果指向其他位置,执行以下命令重新链接:

sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

4. 重启服务:执行 sudo systemctl restart systemd-resolved 使配置生效。

如何在 Ubuntu 20.04 上使用 systemd-resolved 配置 DNS?

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 地址。

如何在 Ubuntu 20.04 上使用 systemd-resolved 配置 DNS?
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