凌峰创科服务平台

CentOS如何搭建DNS缓存服务器?

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

CentOS如何搭建DNS缓存服务器?-图1
(图片来源网络,侵删)

为什么选择 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

粘贴到新文件中,这里提供一个基础且常用的配置示例:

CentOS如何搭建DNS缓存服务器?-图2
(图片来源网络,侵删)
# ------------------------------------------------------------------------------
# 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)来永久修改。

CentOS如何搭建DNS缓存服务器?-图3
(图片来源网络,侵删)

推荐 - 使用 NetworkManager (适用于现代 CentOS)

  1. 找到你的网络连接名称,通常会是 ifcfg-ens33ifcfg-eth0 等。

    nmcli connection show

    假设你的连接名称是 ens33

  2. 为该连接设置 DNS 服务器为 0.0.1

    sudo nmcli connection modify ens33 ipv4.dns "127.0.0.1"
  3. 重启网络连接以应用更改。

    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 缓存是否生效

这是最关键的一步,我们需要确认缓存确实在工作。

  1. 清空本地 DNS 缓存(如果有的话)

    • 对于 dnsmasq,最简单的方式是重启它。
      sudo systemctl restart dnsmasq
  2. 执行第一次 DNS 查询

    • 使用 dignslookup 命令。dig 提供的信息更详细。
      # 使用 dig 查询一个不常用的域名,并查看响应时间
      dig google.com
    • 你会看到在 ANSWER SECTION 下方有答案,并且在 Query time 一行会有一个数值(42 ms)。
  3. 立即执行第二次 DNS 查询

    dig google.com
    • 如果缓存生效,你会看到 Query time 变得非常小,通常在 1 ms0 ms 左右。
    • 更重要的是,在 dig 输出的头部,你会看到 ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 这几行,在第二次查询时,你会看到多了一行 ;; ANSWER SECTION,这直接表明答案来自缓存。
  4. 检查日志(如果开启了)

    sudo tail -f /var/log/dnsmasq.log

    你会看到第一次查询被记录下来,而第二次查询则不会被记录(因为直接从缓存返回)。


常见问题与解决

端口冲突 (Address already in use)

错误信息可能包含 Failed to start dnsmasq.service: Unit dnsmasq.service is maskedAddress already in use

  • 原因:系统中可能已经有其他服务在监听 53 端口(如 systemd-resolvednamed)。
  • 解决
    1. 找出占用 53 端口的进程:
      sudo ss -tulnp | grep :53
    2. 如果是 systemd-resolved,可以禁用它:
      sudo systemctl stop systemd-resolved
      sudo systemctl disable systemd-resolved
      # 并删除其创建的符号链接
      sudo rm /etc/resolv.conf
      # 然后重新用 NetworkManager 方法创建 /etc/resolv.conf
    3. 如果是 named (BIND),你需要决定是使用 dnsmasq 还是 named,如果只用 dnsmasq,则停止并禁用 named
      sudo systemctl stop named
      sudo systemctl disable named

无法解析域名

  • 原因:可能是上游 DNS 服务器配置错误,或者防火墙阻止了查询。
  • 解决
    1. 检查 /etc/dnsmasq.d/10-custom-cache.conf 中的 server= 指令是否正确。
    2. 临时关闭防火墙进行测试:
      sudo systemctl stop firewalld

      如果能解析,说明是防火墙规则问题,你需要允许 53 端口的 TCP 和 UDP 流量。

      sudo firewall-cmd --permanent --add-service=dns
      sudo firewall-cmd --reload

通过以上步骤,你就成功地在 CentOS 上搭建了一个功能完善的 DNS 缓存服务器。

分享:
扫描分享到社交APP
上一篇
下一篇