在数字化时代,网络连接的稳定性和速度直接影响着我们的工作与生活体验,当您在Ubuntu系统上浏览网页、访问服务时,背后一个关键但常被忽视的角色就是DNS(域名系统),它如同互联网的“电话簿”,负责将我们易于记忆的域名(如www.google.com)翻译成机器能够理解的IP地址,默认的DNS服务可能存在速度慢、隐私泄露或被劫持的风险,一个强大而优雅的解决方案,就是利用本地主机地址0.0.1来搭建或指向一个本地DNS解析服务,本文将深入探讨在Ubuntu系统中,如何理解、配置并优化基于0.0.1的DNS设置,从而提升网络性能、增强隐私保护并获得更高的控制权。

理解核心概念:127.0.0.1 与 DNS
在开始配置之前,我们必须清晰地理解两个核心概念:0.0.1和DNS。
什么是 127.0.0.1?
0.0.1是一个特殊的IP地址,被称为“环回地址”,它指向您正在使用的设备本身,当您的计算机向0.0.1发送网络请求时,这个请求不会经过任何外部网络设备(如路由器或交换机),而是直接在内部被处理,它就是“我自己”的代名词,使用这个地址运行服务,可以确保极高的响应速度和与外部网络的隔离性,是测试和运行本地服务的理想选择。
什么是 DNS?
DNS(Domain Name System)的核心功能是域名解析,如果没有DNS,我们将不得不记住一长串毫无规律的数字(IP地址)才能访问网站,DNS服务器则维护着一个巨大的数据库,存储着域名与IP地址的对应关系,当您在浏览器中输入一个网址时,您的计算机会向DNS服务器发送查询请求,获取对应的IP地址,然后才能建立连接。
为什么要将 127.0.0.1 用作 DNS?
将DNS查询指向本地的0.0.1,意味着您在本地运行了一个DNS解析程序(或称为“解析器”),这样做的好处是多方面的:
- 速度提升:本地DNS解析器会缓存查询结果,当您再次访问同一个网站时,系统无需再向远程DNS服务器发送请求,而是直接从本地缓存中读取结果,响应时间几乎为零。
- 隐私与安全:您的所有DNS查询都由本地程序处理,然后可以转发给您信任的、支持加密(如DNS-over-TLS或DNS-over-HTTPS)的上游DNS服务器(如Cloudflare的
1.1.1或Quad9的9.9.9),这可以有效防止互联网服务提供商(ISP)或网络中的其他实体窥探您的浏览历史,并避免DNS劫持和污染。 - 控制与灵活性:您可以自定义解析规则,屏蔽广告域名、恶意软件站点,或者为本地开发环境创建自定义的域名(如
my-project.local指向0.0.1),极大地方便了开发工作。 - 可靠性:减少了对单一外部DNS服务器的依赖,即使上游DNS服务器暂时不可用,本地缓存依然可以解析您最近访问过的网站。
在 Ubuntu 上部署本地 DNS 服务器
现代Ubuntu系统(通常是18.04及以后版本)默认集成了systemd-resolved服务,这是一个功能强大的本地DNS解析器,是实现我们目标的最佳起点,对于需要更高级功能的用户,经典的dnsmasq也是一个绝佳的选择。
使用内置的 systemd-resolved(推荐)
systemd-resolved在大多数Ubuntu安装中已经默认运行,它提供了一个“存根监听器”,地址为0.0.53,虽然不是0.0.1,但其工作原理和效果完全一致,都是为了提供一个本地DNS服务。
步骤 1:检查服务状态
确认systemd-resolved正在运行:
systemctl status systemd-resolved
如果看到active (running)的绿色字样,说明服务已正常启动。
步骤 2:配置 /etc/resolv.conf
系统的DNS查询行为由/etc/resolv.conf文件控制,我们需要确保该文件指向systemd-resolved的存根监听器。
检查/etc/resolv.conf的属性:

ls -lh /etc/resolv.conf
在标准的Ubuntu系统中,它应该是一个指向../run/systemd/resolve/stub-resolv.conf的符号链接,如果是这样,那么配置基本正确。stub-resolv.conf通常如下:
nameserver 127.0.0.53
options edns0 trust-ad
search .
这里的nameserver 127.0.0.53就是关键,它告诉系统将所有DNS查询都发送到本地的systemd-resolved服务。
如果/etc/resolv.conf不是符号链接或内容不正确,您可以修复它:
# 备份现有文件 sudo mv /etc/resolv.conf /etc/resolv.conf.bak # 创建正确的符号链接 sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
步骤 3:设置上游 DNS 服务器
systemd-resolved本身不解析域名,而是将查询转发给上游的公共DNS服务器,您可以指定自己信任的服务器以获得更好的性能和隐私。
编辑配置文件:
sudo nano /etc/systemd/resolved.conf
找到[Resolve]部分,取消注释并修改以下行:
[Resolve] DNS=1.1.1.1 8.8.4.4 FallbackDNS=9.9.9.9 1.0.0.1 #DNSOverTLS=yes #Cache=yes
DNS=:设置首选的上游DNS服务器,这里使用了Cloudflare和Google的备用服务器。FallbackDNS=:设置备用DNS服务器。DNSOverTLS=yes:取消此行注释以启用DNS-over-TLS加密,增强隐私。
保存文件后,重启服务使配置生效:
sudo systemctl restart systemd-resolved
使用 Dnsmasq 实现更高级的控制
dnsmasq是一个轻量级且功能丰富的DNS转发器和DHCP服务器,非常适合需要精细控制本地DNS的用户。
步骤 1:安装 Dnsmasq
sudo apt update sudo apt install dnsmasq
安装后,服务会自动启动。
步骤 2:配置 Dnsmasq
dnsmasq的主配置文件是/etc/dnsmasq.conf,建议先备份,然后进行编辑:
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak sudo nano /etc/dnsmasq.conf
在文件中添加或修改以下关键配置:
# 监听本地地址 listen-address=127.0.0.1 # 设置上游DNS服务器 server=1.1.1.1 server=8.8.8.8 # 设置缓存大小 cache-size=1000 # (可选) 屏蔽广告域名 # addn-hosts=/etc/dnsmasq.adblock.hosts
步骤 3:管理 /etc/resolv.conf

使用dnsmasq时,需要确保/etc/resolv.conf只包含0.0.1作为nameserver,并且防止被其他程序(如NetworkManager)覆盖。
# 停止并禁用systemd-resolved,避免冲突 sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved # 创建静态的resolv.conf echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
注意:禁用systemd-resolved可能会影响某些依赖它的网络功能,请谨慎操作,对于大多数用户,坚持使用方法一更为稳妥。
重启dnsmasq服务:
sudo systemctl restart dnsmasq
验证与故障排除
配置完成后,使用dig或nslookup命令来验证DNS查询是否正在通过本地服务。
dig google.com
在输出中,关注SERVER:字段,如果显示0.0.53#53(127.0.0.53)(对于systemd-resolved)或0.0.1#53(127.0.0.1)(对于dnsmasq),则说明配置成功,再次执行相同命令,观察Query time:,会发现第二次查询的时间显著缩短,证明缓存正在工作。
常见问题排查:
- DNS解析失败:检查服务状态(
systemctl status ...),确认配置文件语法无误,检查防火墙设置。 - 配置未生效:确保
/etc/resolv.conf指向正确的地址,并且没有被网络管理工具覆盖。 - 速度无提升:可能是首次查询,请多试几次,检查缓存设置是否合理。
下表小编总结了两种主要方法的对比:
| 特性 | systemd-resolved | dnsmasq |
|---|---|---|
| 集成度 | Ubuntu原生集成,无需安装 | 需手动安装 |
| 配置复杂度 | 较低,适合大多数用户 | 中等,提供更多自定义选项 |
| 监听地址 | 0.0.53 (存根) |
0.0.1 |
| 加密DNS | 原生支持DNS-over-TLS | 需要借助其他工具(如stubby) |
| 广告屏蔽 | 通过/etc/systemd/resolved.conf配置有限 |
通过hosts文件或配置文件轻松实现 |
| 适用场景 | 日常使用、追求稳定与简单 | 开发环境、需要精细控制(如广告屏蔽、本地域名) |
高级应用与最佳实践
一旦基础配置完成,您还可以探索更多高级功能:
- 启用加密 DNS:如前所述,在
/etc/systemd/resolved.conf中设置DNSOverTLS=yes,为您的DNS查询增加一层安全保护。 - 实现广告屏蔽:通过维护一个包含广告域名的
hosts文件,并在dnsmasq中引用它,可以在整个系统层面屏蔽广告,更专业的解决方案是使用Pi-hole,它本质上是dnsmasq的一个功能强大的封装。 - 配置本地开发域名:对于Web开发者,在
dnsmasq.conf中添加一行如address=/my-app.test/127.0.0.1,即可让http://my-app.test直接指向本地开发服务器,无需修改hosts文件。
通过将Ubuntu系统的DNS查询指向本地的0.0.1,我们不仅优化了网络访问速度,更重要的是夺回了数字生活的控制权和隐私权,无论是利用系统内置的systemd-resolved进行快速、安全的配置,还是借助dnsmasq实现高度定制化的本地网络环境,这都是在Ubuntu上提升系统体验的一项极具价值的实践。
相关问答 FAQs
问题1:127.0.0.1 和 127.0.0.53 有什么区别?为什么 systemd-resolved 使用后者?
回答:0.0.1是标准的环回地址,泛指“本机”,而0.0.53是systemd-resolved服务专用的“存根监听器”地址。systemd-resolved选择使用一个不同的地址(0.0.53)而不是通用的0.0.1,主要是为了避免端口冲突,这样,如果用户还想在同一台机器上运行其他需要监听0.0.1:53端口的DNS服务(如dnsmasq或bind9),就不会与systemd-resolved发生冲突,对于用户而言,虽然地址不同,但其作为本地DNS解析入口的功能是完全相同的。
问题2:如果我手动编辑了 /etc/resolv.conf,但重启系统后它又被还原了,该怎么办?
回答:在Ubuntu系统中,/etc/resolv.conf通常由systemd-resolved或NetworkManager等服务自动管理,直接手动编辑是不会持久化的,正确的做法不是去“对抗”这个机制,而是去配置这些管理服务本身。
- 对于使用 systemd-resolved 的用户:您不应该直接编辑
/etc/resolv.conf,而应确保它是一个指向../run/systemd/resolve/stub-resolv.conf的符号链接,通过编辑/etc/systemd/resolved.conf来配置您的DNS设置,并重启systemd-resolved服务。 - 对于希望完全自己控制的用户(例如使用 dnsmasq):您需要禁用自动管理
resolv.conf的服务,可以禁用systemd-resolved,并配置NetworkManager(通过编辑/etc/NetworkManager/NetworkManager.conf,设置dns=none)来停止管理DNS,之后,您创建的静态/etc/resolv.conf文件就不会被覆盖了。