在Ubuntu操作系统中,域名系统(DNS)的解析是网络通信的核心环节,默认情况下,Ubuntu使用systemd-resolved服务来管理DNS设置,它会动态地从网络连接(如DHCP)中获取DNS服务器地址,这种灵活性虽然方便,但在某些场景下可能导致DNS设置被意外更改,例如连接到新的网络或路由器分配了不同的DNS,为了提升网络的安全性、稳定性和隐私性,锁定DNS成为一个重要的需求,锁定DNS可以防止DNS劫持,确保始终使用可信的、或具有特定功能(如广告拦截、儿童保护)的DNS服务器。

理解Ubuntu的DNS解析机制
在开始操作之前,有必要了解Ubuntu的现代DNS解析机制。systemd-resolved提供了一个本地DNS存根服务,监听在0.0.53:53地址上,系统的/etc/resolv.conf文件通常是一个指向/run/systemd/resolve/stub-resolv.conf的符号链接,其内容如下:
nameserver 127.0.0.53
options edns0 trust-ad
search .
这意味着,所有的DNS查询请求首先会发送到本地的存根服务,再由systemd-resolved根据其配置(从DHCP获取或静态配置)转发到上游的DNS服务器,直接修改/etc/resolv.conf文件往往是无效的,因为它会在系统重启或网络服务重启时被重新生成,要真正锁定DNS,我们需要从根源上配置systemd-resolved服务。
通过systemd-resolved锁定DNS
最可靠、最推荐的方法是通过编辑systemd-resolved的配置文件来设置静态的DNS服务器,并禁用可能干扰的本地存根监听器。
第一步:编辑resolved.conf配置文件
使用管理员权限打开/etc/systemd/resolved.conf文件,建议先备份原始文件:
sudo cp /etc/systemd/resolved.conf /etc/systemd/resolved.conf.bak sudo nano /etc/systemd/resolved.conf
在打开的文件中,找到[Resolve]部分,取消注释(即删除行首的号)并修改以下几行:
DNS=:在此处填入你希望锁定的DNS服务器IP地址,多个地址用空格隔开。FallbackDNS=:当主DNS服务器不可用时,系统会使用这里的备用DNS,可以设置为一些公共DNS作为后备。#DNSStubListener=yes:将此行改为DNSStubListener=no,这是关键一步,它会禁用监听在0.0.53的本地DNS存根服务。
修改后的示例配置可能如下所示:

[Resolve] DNS=1.1.1.1 1.0.0.1 FallbackDNS=8.8.8.8 8.8.4.4 #Domains= DNSStubListener=no #ReadEtcHosts=yes
第二步:更新resolv.conf符号链接
禁用了DNS存根监听器后,/etc/resolv.conf不能再指向stub-resolv.conf,我们需要将其指向systemd-resolved直接处理的resolv.conf文件。
删除现有的符号链接或文件:
sudo rm /etc/resolv.conf
创建一个新的符号链接,指向正确的文件:
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
第三步:重启服务并验证
为了让配置生效,重启systemd-resolved服务:
sudo systemctl restart systemd-resolved
验证你的设置是否成功,查看/etc/resolv.conf,它应该直接显示你在resolved.conf中设置的DNS服务器:

cat /etc/resolv.conf
输出应该类似于:
nameserver 1.1.1.1
nameserver 1.0.0.1
你也可以使用resolvectl status命令来查看详细的DNS解析状态,确认全局DNS设置是否已按预期锁定。
常用公共DNS服务器推荐
为了方便选择,以下是一些主流的公共DNS服务商及其特点:
| 服务商 | 主DNS | 备用DNS | 特点与备注 |
|---|---|---|---|
| Cloudflare | 1.1.1 | 0.0.1 | 注重隐私和速度,支持DNS-over-TLS/HTTPS |
| 8.8.8 | 8.4.4 | 稳定可靠,全球分布广泛,响应速度快 | |
| Quad9 | 9.9.9 | 112.112.112 | 自动拦截已知恶意域名,安全性高 |
| OpenDNS | 67.222.222 | 67.220.220 | 提供可选的家庭保护(内容过滤)服务 |
| 阿里DNS | 5.5.5 | 6.6.6 | 针对中国大陆用户优化,解析速度快 |
通过以上步骤,你就可以在Ubuntu系统中成功锁定DNS,确保无论网络环境如何变化,你的设备都将使用预设的、可信的DNS服务器,从而为网络活动增添一份保障。
相关问答FAQs
问题1:我已经按照步骤操作,但重启电脑后DNS设置又变回了默认值,这是为什么?
解答: 这个问题通常有两个可能的原因,第一,你没有正确禁用DNSStubListener,导致系统仍在使用本地存根,而/etc/resolv.conf的链接可能被网络管理器(如NetworkManager)重置,请确保/etc/systemd/resolved.conf中DNSStubListener=no这一行已经生效,第二,某些桌面环境的网络管理工具可能会覆盖/etc/resolv.conf,在这种情况下,除了上述方法,你还需要在图形界面的网络设置中,将IPv4/IPv6的DNS方法从“自动(DHCP)”改为“手动”,并留空DNS服务器地址,让systemd-resolved完全接管。
问题2:锁定DNS和使用VPN有什么区别?我需要同时使用吗?
解答: 锁定DNS和使用VPN是两个不同层面的安全措施,但可以协同工作,锁定DNS是确保你的设备在进行所有网络请求时,都向一个固定的、你指定的DNS服务器查询域名,而VPN(虚拟专用网络)则是将你的所有网络流量(包括DNS查询)通过一个加密隧道发送到远程服务器,从而隐藏你的真实IP并加密数据,一个高质量的VPN服务通常会自带自己的DNS服务器,并强制所有流量通过其DNS,这本身就已经实现了“锁定”的效果,如果你使用的VPN不强制DNS,或者你想在VPN连接断开时依然使用安全的DNS,那么在系统中锁定DNS就是一个非常好的补充安全层,两者可以同时使用,以提供更全面的保护。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/261723.html