我们将使用 dnsmasq 这个轻量级、易于配置的软件来完成这个任务,它非常适合作为局域网或单台机器的 DNS 缓存。

为什么选择 dnsmasq?
- 轻量级:资源占用非常小。
- 功能强大:不仅能做 DNS 缓存,还能做 DHCP 和 TFTP 服务器。
- 配置简单:配置文件非常直观,易于上手。
- 高性能:内存缓存机制,响应速度快。
第一步:安装 dnsmasq
我们需要更新系统包列表并安装 dnsmasq。
# 1. 更新系统软件包 sudo yum update -y # 2. 安装 dnsmasq sudo yum install -n dnsmasq -y
安装完成后,dnsmasq 服务会自动启动,但我们先不要急着使用它,先进行配置。
第二步:配置 dnsmasq
dnsmasq 的主配置文件是 /etc/dnsmasq.conf,为了不覆盖官方的默认配置(其中包含很多有用的注释和示例),我们建议创建一个新的配置文件来覆盖默认设置。
# 创建一个新的配置文件 sudo nano /etc/dnsmasq.d/10-custom-cache.conf
粘贴到新文件中,这里提供一个基础且常用的配置示例:

# ------------------------------------------------------------------------------ # DNS 缓存服务器基础配置 # ------------------------------------------------------------------------------ # 1. 指定上游 DNS 服务器 # 当 dnsmasq 无法从缓存中解析域名时,它会向这些服务器发起请求。 # 推荐使用可靠的公共 DNS,如 Google (8.8.8.8) 或 Cloudflare (1.1.1.1)。 # 你也可以使用你的网络运营商提供的 DNS。 server=8.8.8.8 server=1.1.1.1 # 2. 设置本地域名解析 # 这可以让 dnsmasq 解析本地主机名,如果你的机器有固定主机名,可以开启它。 # local=/yourlocaldomain.com/ # 3. 监听地址 # 默认情况下,dnsmasq 只会监听本机的回环地址 (127.0.0.1)。 # 如果你想让局域网内的其他机器也能使用这个缓存服务器,需要取消下面这行的注释, # 并将 IP 地址改为服务器的局域网 IP 地址。 # listen-address=192.168.1.100 # <--- 请替换为你的服务器局域网 IP # 4. 不读取 /etc/resolv.conf 文件 # 默认情况下,dnsmasq 会读取系统的 /etc/resolv.conf 文件来获取上游 DNS 服务器。 # 为了避免与我们上面指定的 `server=` 指令冲突,最好禁用它。 no-resolv # 5. 启用 DNS 缓存功能 # 这是 dnsmasq 的核心功能,默认就是启用的,但明确写出来更清晰。 # 缓存大小通常由系统内存决定,无需手动配置。 cache-size=1000 # 可选,可以手动设置缓存条目数,默认约为 150-200 # 6. 启用日志功能(可选,但推荐) # 这对于排查问题非常有帮助,日志会输出到系统日志。 log-queries log-facility=/var/log/dnsmasq.log # 7. 禁用 DNS 功能(如果仅用作 DHCP) # 如果你的主要目的是 DHCP,可以禁用 DNS。 # 但我们的目标是缓存,所以这行不需要。 # port=0
配置说明:
server=...:这是最重要的部分,告诉dnsmasq当缓存中没有结果时,去问谁。listen-address=...:- 仅本机使用:保持默认,
dnsmasq只监听0.0.1,这是最安全的设置。 - 局域网共享:取消注释,并填入你 CentOS 服务器的局域网 IP,这样局域网内其他设备就可以将 DNS 服务器指向这台机器了。
- 仅本机使用:保持默认,
no-resolv:强烈建议开启,避免配置冲突。log-queries:开启后,所有 DNS 查询都会被记录,方便调试。
保存并退出编辑器(在 nano 中是 Ctrl+X,然后按 Y,再按 Enter)。
第三步:配置系统使用 dnsmasq
为了让系统默认使用我们配置好的 dnsmasq 作为 DNS 解析器,我们需要修改 /etc/resolv.conf 文件。
⚠️ 重要警告:直接修改 /etc/resolv.conf 在系统重启或网络服务重启后可能会被重置,我们推荐使用网络管理器(NetworkManager)来永久修改。

推荐 - 使用 NetworkManager (适用于现代 CentOS)
-
找到你的网络连接名称,通常会是
ifcfg-ens33或ifcfg-eth0等。nmcli connection show
假设你的连接名称是
ens33。 -
为该连接设置 DNS 服务器为
0.0.1。sudo nmcli connection modify ens33 ipv4.dns "127.0.0.1"
-
重启网络连接以应用更改。
sudo nmcli connection down ens33 && sudo nmcli connection up ens33
检查 /etc/resolv.conf 文件,它应该会自动更新为:
nameserver 127.0.0.1
直接修改 (不推荐,但简单)
如果你不使用 NetworkManager,或者只是临时测试,可以直接编辑文件。
# 备份原始文件 sudo cp /etc/resolv.conf /etc/resolv.conf.bak # 编辑文件 sudo nano /etc/resolv.conf
替换为:
nameserver 127.0.0.1
注意:这种方法在 CentOS 7/8 上很可能在重启网络服务后失效。
第四步:启动并启用 dnsmasq 服务
所有配置都已完成,我们可以启动并设置 dnsmasq 开机自启。
# 1. 启动 dnsmasq 服务 sudo systemctl start dnsmasq # 2. 设置 dnsmasq 开机自启 sudo systemctl enable dnsmasq # 3. 检查服务状态 sudo systemctl status dnsmasq
你应该看到绿色的 active (running) 字样,表示服务正在运行。
第五步:验证 DNS 缓存是否生效
这是最关键的一步,我们需要确认缓存确实在工作。
-
清空本地 DNS 缓存(如果有的话)。
- 对于
dnsmasq,最简单的方式是重启它。sudo systemctl restart dnsmasq
- 对于
-
执行第一次 DNS 查询。
- 使用
dig或nslookup命令。dig提供的信息更详细。# 使用 dig 查询一个不常用的域名,并查看响应时间 dig google.com
- 你会看到在
ANSWER SECTION下方有答案,并且在Query time一行会有一个数值(42 ms)。
- 使用
-
立即执行第二次 DNS 查询。
dig google.com
- 如果缓存生效,你会看到
Query time变得非常小,通常在1 ms或0 ms左右。 - 更重要的是,在
dig输出的头部,你会看到->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...和;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0这几行,在第二次查询时,你会看到多了一行;; ANSWER SECTION,这直接表明答案来自缓存。
- 如果缓存生效,你会看到
-
检查日志(如果开启了)。
sudo tail -f /var/log/dnsmasq.log
你会看到第一次查询被记录下来,而第二次查询则不会被记录(因为直接从缓存返回)。
常见问题与解决
端口冲突 (Address already in use)
错误信息可能包含 Failed to start dnsmasq.service: Unit dnsmasq.service is masked 或 Address already in use。
- 原因:系统中可能已经有其他服务在监听 53 端口(如
systemd-resolved、named)。 - 解决:
- 找出占用 53 端口的进程:
sudo ss -tulnp | grep :53
- 如果是
systemd-resolved,可以禁用它:sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved # 并删除其创建的符号链接 sudo rm /etc/resolv.conf # 然后重新用 NetworkManager 方法创建 /etc/resolv.conf
- 如果是
named(BIND),你需要决定是使用dnsmasq还是named,如果只用dnsmasq,则停止并禁用named:sudo systemctl stop named sudo systemctl disable named
- 找出占用 53 端口的进程:
无法解析域名
- 原因:可能是上游 DNS 服务器配置错误,或者防火墙阻止了查询。
- 解决:
- 检查
/etc/dnsmasq.d/10-custom-cache.conf中的server=指令是否正确。 - 临时关闭防火墙进行测试:
sudo systemctl stop firewalld
如果能解析,说明是防火墙规则问题,你需要允许 53 端口的 TCP 和 UDP 流量。
sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
- 检查
通过以上步骤,你就成功地在 CentOS 上搭建了一个功能完善的 DNS 缓存服务器。
