在CentOS系统中,配置DNS缓存是提升网络性能和响应速度的有效手段,通过将频繁访问的域名解析结果暂存在本地,系统可以避免每次都向外部DNS服务器发起请求,从而显著降低网络延迟,减轻上游DNS服务器的负担,对于服务器和开发环境而言,一个稳定高效的DNS缓存服务尤为重要,本文将详细介绍在CentOS上配置DNS缓存的两种主流方法,并提供验证与维护的实用技巧。

使用 Dnsmasq 搭建DNS缓存服务
Dnsmasq是一款轻量级且功能强大的工具,适用于提供DNS缓存和DHCP服务,它配置简单,资源占用低,是许多小型网络和单机环境的首选。
安装 Dnsmasq
通过yum或dnf包管理器来安装Dnsmasq,在CentOS 7及更高版本上,通常使用以下命令:
sudo yum install dnsmasq
配置 Dnsmasq
Dnsmasq的主配置文件位于/etc/dnsmasq.conf,为了将其配置为一个纯粹的本地DNS缓存服务器,我们需要进行如下修改:
- 监听地址:确保服务只监听本地回环地址,避免对外提供服务。
listen-address=127.0.0.1 - 上游DNS服务器:默认情况下,Dnsmasq会读取
/etc/resolv.conf文件中的地址作为上游服务器,通常无需修改,除非你想指定特定的公共DNS(如8.8.8.8或1.1.1.1)。 - 缓存大小:可以根据需要调整缓存条目数量,默认值通常是150。
cache-size=1000
启动并启用服务
配置完成后,启动Dnsmasq服务并设置其开机自启:
sudo systemctl start dnsmasq sudo systemctl enable dnsmasq
更新系统DNS解析器
最后一步是让系统使用我们刚刚搭建的DNS缓存服务,这需要修改/etc/resolv.conf文件,将nameserver指向本地地址。
sudo vim /etc/resolv.conf
在文件最顶部添加一行:

nameserver 127.0.0.1
注意:在某些由NetworkManager管理的系统中,/etc/resolv.conf可能会在重启后被覆盖,为使其永久生效,可以修改网络配置脚本(如/etc/sysconfig/network-scripts/ifcfg-eth0),添加PEERDNS=no,或使用nmcli工具进行配置。
使用 Systemd-Resolved(现代CentOS推荐)
从CentOS 7开始,systemd引入了systemd-resolved服务,它内置于系统中,提供了完整的DNS缓存和解析功能,对于现代CentOS发行版,这是一个更集成、更推荐的选择。
检查并启用服务
首先检查服务状态,如果未运行则启动它。
systemctl status systemd-resolved sudo systemctl enable systemd-resolved --now
配置 Systemd-Resolved
其配置文件为/etc/systemd/resolved.conf,打开文件并找到[Resolve]部分,进行如下修改:
[Resolve]
DNS=8.8.8.8 1.1.1.1
#FallbackDNS=
Domains=
Cache=yes
DNSStubListener=yes
DNS=:指定上游DNS服务器地址。Cache=yes:确保开启缓存功能。
更新解析器指向
systemd-resolved提供了一个本地的DNS存根监听在0.0.53,我们需要将系统的/etc/resolv.conf指向它,最佳实践是创建一个符号链接指向systemd-resolved管理的配置文件:
sudo mv /etc/resolv.conf /etc/resolv.conf.bak sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
重启服务使配置生效:
sudo systemctl restart systemd-resolved
如何验证DNS缓存是否生效
无论使用哪种方法,都可以通过dig命令来验证缓存是否工作。

-
首次查询一个域名,记录查询时间:
dig example.com
注意输出中的
Query time,例如Query time: 48 msec。 -
立即再次执行相同命令:
dig example.com
Query time应该会显著降低,例如Query time: 1 msec,这表明结果是从本地缓存中获取的。
如果使用systemd-resolved,还可以通过以下命令查看缓存统计信息:
systemd-resolve --statistics
Dnsmasq 与 Systemd-Resolved 对比
| 特性 | Dnsmasq | Systemd-Resolved |
|---|---|---|
| 易用性 | 配置直观,适合独立部署 | 与系统集成度高,配置简单 |
| 功能范围 | 同时提供DNS和DHCP服务 | 专注于DNS解析、缓存和LLMNR |
| 资源占用 | 非常轻量 | 作为systemd一部分,资源占用也较小 |
| 适用场景 | 需要DHCP服务的局域网、轻量级缓存需求 | 现代CentOS桌面或服务器,追求原生集成 |
相关问答 (FAQs)
问题1:为什么我的 /etc/resolv.conf 文件在重启后总是被还原?
解答:这是因为在现代Linux发行版中,/etc/resolv.conf文件通常由NetworkManager服务动态管理,当网络状态发生变化或系统重启时,NetworkManager会根据其网络配置重新生成此文件,要永久生效,最佳方法是使用NetworkManager的工具(如nmcli)来配置DNS,或者修改网络接口配置文件(例如在/etc/sysconfig/network-scripts/ifcfg-*中设置PEERDNS="no"并手动添加DNS条目),或者如上文所述,将/etc/resolv.conf链接到systemd-resolved的输出文件。
问题2:DNS缓存会保存多久?如何清理缓存?
解答:DNS缓存条目的保存时间由该域名DNS记录中的TTL(Time To Live)值决定,当缓存时间超过TTL后,该条目会失效,下次查询时会重新向上游服务器请求,如果需要手动清理缓存,可以重启对应的服务,对于Dnsmasq,使用sudo systemctl restart dnsmasq,对于systemd-resolved,则使用更优雅的命令sudo systemd-resolve --flush-caches,这会清空所有缓存条目而不重启整个服务。