在 Ubuntu 20.04 上配置网络时,有时候会遇到 DNS 解析不稳定的问题。比如内网主机名解析不了、访问网页偶尔很慢、服务器能 ping 通 IP 但无法解析域名,或者系统自动获取到的 DNS 服务器并不是自己想用的地址。

这种情况下,可以通过 systemd-resolved 来手动指定 DNS 服务器。这个方法比较适合服务器、开发机、内网环境、虚拟机或者需要固定 DNS 的 Ubuntu 20.04 系统。

本文记录的是通过修改 /etc/systemd/resolved.conf 来设置 DNS 的方法。

一、编辑 resolved.conf 配置文件 #

先打开配置文件:

Bash
sudo nano /etc/systemd/resolved.conf

找到 [Resolve] 配置段,在里面添加或修改 DNS= 这一行。

例如:

INI
[Resolve]
DNS=10.0.0.1 192.168.0.1

这里的两个 DNS 地址可以根据自己的网络环境调整。

例如:

  • 10.0.0.1 可能是公司内网 DNS
  • 192.168.0.1 可能是路由器地址
  • 如果是公网环境,也可以换成其他可用 DNS

多个 DNS 地址之间用空格分隔即可。

如果文件里原本有被注释掉的配置,比如:

INI
#DNS=

可以去掉前面的 #,然后改成自己的 DNS 地址。

二、重启 systemd-resolved 服务 #

保存文件后,需要重启 systemd-resolved 服务,让配置生效:

Bash
sudo systemctl restart systemd-resolved

重启后,可以查看服务状态:

Bash
systemctl status systemd-resolved

如果服务状态是 active (running),说明服务正常运行。

也可以使用下面的命令查看当前 DNS 情况:

Bash
resolvectl status

在输出内容里,重点看 DNS Servers 相关字段,确认是否已经使用刚刚配置的 DNS 地址。

三、处理 /etc/resolv.conf 软链接 #

在 Ubuntu 20.04 中,/etc/resolv.conf 很多时候并不建议直接手动写死,因为它可能会被系统、NetworkManager 或 systemd-resolved 接管。

如果希望系统解析文件使用 systemd-resolved 生成的结果,可以将 /etc/resolv.conf 指向对应的动态文件:

Bash
sudo ln -fs /run/systemd/resolve/resolv.conf /etc/resolv.conf

执行后可以检查一下软链接:

Bash
ls -l /etc/resolv.conf

正常情况下,应该能看到它指向:

TEXT
/run/systemd/resolve/resolv.conf

然后再查看当前解析文件内容:

Bash
cat /etc/resolv.conf

如果里面能看到自己配置的 DNS,说明配置基本已经生效。

四、测试 DNS 是否正常 #

配置完成后,可以用几个简单命令测试 DNS 解析是否正常。

例如测试域名解析:

Bash
nslookup google.com

或者:

Bash
dig google.com

如果系统没有安装 dig,可以先安装:

Bash
sudo apt install dnsutils

也可以直接测试系统是否能解析域名:

Bash
ping google.com

如果 ping 域名正常,说明 DNS 已经可以工作。

如果 ping 8.8.8.8 正常,但 ping google.com 不正常,通常就说明网络本身是通的,但 DNS 解析仍然有问题。

五、常见问题 #

1. 修改后 DNS 没有变化 #

如果修改 /etc/systemd/resolved.conf 后没有变化,可以先确认是否已经重启服务:

Bash
sudo systemctl restart systemd-resolved

然后检查:

Bash
resolvectl status

如果这里仍然看不到新 DNS,可能是 NetworkManager 或其他网络配置覆盖了 DNS 设置。

2. /etc/resolv.conf 被自动改回去了 #

如果直接编辑 /etc/resolv.conf,重启网络或系统后可能会被覆盖。更推荐通过 systemd-resolved 或 NetworkManager 设置 DNS,而不是长期手动修改 /etc/resolv.conf 文件内容。

如果需要让 /etc/resolv.conf 跟随 systemd-resolved,可以重新创建软链接:

Bash
sudo ln -fs /run/systemd/resolve/resolv.conf /etc/resolv.conf

3. 内网 DNS 和公网 DNS 如何选择 #

如果这台机器需要访问公司内网域名,应该优先使用公司或路由器提供的内网 DNS。

例如:

INI
DNS=10.0.0.1 192.168.0.1

如果只是普通公网服务器,可以使用运营商 DNS、路由器 DNS,或者其他可靠的公网 DNS。

但要注意,如果公司网络依赖内部 DNS,直接改成公网 DNS 可能会导致内网域名无法解析。

六、如何恢复默认配置 #

如果修改后网络解析异常,可以恢复默认配置。

重新编辑文件:

Bash
sudo nano /etc/systemd/resolved.conf

把之前添加的 DNS 配置注释掉:

INI
[Resolve]
#DNS=10.0.0.1 192.168.0.1

然后重启服务:

Bash
sudo systemctl restart systemd-resolved

如果之前修改过 /etc/resolv.conf 软链接,也可以根据自己的网络管理方式恢复。

一般情况下,可以先检查当前链接:

Bash
ls -l /etc/resolv.conf

再根据系统实际情况决定是否保留。

总结 #

Ubuntu 20.04 设置固定 DNS,可以通过修改:

TEXT
/etc/systemd/resolved.conf

[Resolve] 下面添加:

INI
DNS=10.0.0.1 192.168.0.1

然后重启服务:

Bash
sudo systemctl restart systemd-resolved

如果需要让系统解析文件使用 systemd-resolved 生成的结果,可以执行:

Bash
sudo ln -fs /run/systemd/resolve/resolv.conf /etc/resolv.conf

最后通过:

Bash
resolvectl status

和:

Bash
cat /etc/resolv.conf

检查 DNS 是否生效。

这个方法适合需要固定 DNS 的 Ubuntu 20.04 系统,尤其是服务器、开发环境、虚拟机和内网环境。配置时要注意,不同网络管理方式可能会覆盖 DNS 设置,所以修改后一定要进行解析测试。