本页内容
- 先决条件
- 准备系统
- 在 Rocky Linux 上安装 Dnsmasq
- 配置 Dnsmasq
- 验证 Dnsmasq 安装
- 配置 Firewalld
- 配置客户端(基于 Debian 或 RHEL) 对于基于 RHEL 的发行版 对于基于 Debian 的发行版
- 结论
- 对于基于 RHEL 的发行版
- 对于基于 Debian 的发行版
Dnsmasq 是一个用于本地环境的小型轻量级 DNS 服务器。它可以用来提供 DNS 服务器、DHCP 服务器和 TFTP 服务器。就 DNS 服务器而言,Dnsmasq 可以用作转发器、递归 DNS 服务器和 DNS 缓存系统。它还会从 /etc/hosts 文件加载 DNS 内容,这使你可以为本地主机名设置域名。
Dnsmasq 的设计轻量且占用空间小,适合路由器和防火墙等低资源设备。Dnsmasq 的系统需求低且资源消耗少。它可以在 Linux、BSD、Android 和 macOS 上运行。
本教程将介绍如何在 Rocky Linux 9 服务器上使用 Dnsmasq 安装并搭建本地 DNS 服务器。你将安装 Dnsmasq 并搭建本地 DNS 服务器,并启用一些附加功能,例如启用本地域名、通过 /etc/hosts 文件设置子域名,以及启用 DNS 缓存以加快访问速度。最后,你将通过 Dnsmasq 启用 DHCP 服务器。
你还将学习如何将客户端机器配置为使用本地 DNS 服务器作为主 DNS 解析器。
先决条件
在开始之前,你必须先满足几个先决条件。以下是先决条件列表:
- 一台 Rocky Linux 9 服务器 —— 本示例使用主机名为 ' dnsmasq-rocky '、IP 地址为 ' 192.168.5.50 ' 的 Rocky Linux。
- 一个具有 sudo/root 管理员权限的非 root 用户。
- SELinux 以 ' permissive '(宽松)模式运行。
对于客户端机器,你可以使用任何 Linux 发行版。作为客户端机器,你可以使用基于 Debian 或 RHEL 的发行版。
准备系统
在基于 RHEL 的操作系统上,默认的 DNS 解析器 '/etc/resolv.conf' 由 NetworkManager 服务生成。在安装 Dnsmasq 之前,你将通过 /etc/resolv.conf 文件设置一个静态 DNS 解析器,并禁用 NetworkManager 服务的 DNS 解析器。
首先,使用以下 nano 编辑器命令打开 NetworkManager 配置文件 /etc/NetworkManager/NetworkManager.conf。
sudo nano /etc/NetworkManager/NetworkManager.conf
在 ' [section] ' 部分中添加一行 ' dns=none '。
[main] dns=none
完成后保存文件并退出编辑器。
接下来,使用以下 nano 编辑器命令打开 DNS 解析器配置文件 '/etc/resolv.conf'。
sudo nano /etc/resolv.conf
删除所有现有行,并将其替换为以下几行。这样,你将使用 Cloudflare 和 Google 的公共 DNS 作为主 DNS 服务器。
nameserver 1.1.1.1 nameserver 8.8.8.8
完成后保存文件并退出。
最后,运行以下 systemctl 命令以重启 NetworkManager 并应用更改。
sudo systemctl restart NetworkManager

完成这些设置后,你的 DNS 解析器将不会被 NetworkManager 服务更改,你可以随时添加或更改 DNS 解析器。
在接下来的步骤中,你将在 Rocky Linux 上开始 Dnsmasq 的安装与配置。
在 Rocky Linux 上安装 Dnsmasq
在此步骤中,你将在 Rocky Linux 服务器上安装 Dnsmasq 软件包。然后,你将启动并启用 Dnsmasq 服务,使其在系统启动时自动运行。
默认情况下,' dnsmasq ' 软件包在 Rocky Linux 的 AppStream 仓库中可用。运行以下 dnf 命令以获取有关 ' dnsmasq ' 软件包的信息。
sudo dnf info dnsmasq
在撰写本文时,Rocky Linux 9 上可用的 Dnsmasq 版本为 v2.85。

现在运行以下命令来安装 Dnsmasq。当提示确认时输入 y,然后按 ENTER 继续。
sudo dnf install dnsmasq dnsmasq-utils
Dnsmasq 的安装现在应该已经开始。
安装 Dnsmasq 后,运行以下 systemctl 命令以启动并启用 ' dnsmasq ' 服务。执行以下命令后,' dnsmasq ' 服务现在应该正在运行并已启用,将在启动时自动启动。
sudo systemctl start dnsmasq
sudo systemctl enable dnsmasq
通过以下 systemctl 命令工具验证 ' dnsmasq ' 服务。
sudo systemctl status dnsmasq
你将收到类似以下输出 —— ' dnsmasq ' 服务当前正在运行、已启用,并将在启动时自动运行。

Dnsmasq 已安装并运行,接下来你将开始配置 Dnsmasq,使其作为本地 DNS 服务器运行。
配置 Dnsmasq
在此步骤中,你将把 Dnsmasq 配置为本地 DNS 服务器,并启用一些功能,例如 DNS 缓存和 DHCP 服务器,同时为本地应用配置域名和子域名。这样你的应用就可以通过本地域名/子域名访问,例如 ' db1.howtoforge.local '、' app.howtoforge.local ' 等等。
首先,运行以下命令将默认的 Dnsmasq 配置文件复制到 '/etc/dnsmasq.conf.orig',然后使用以下 nano 编辑器命令打开原始的 Dnsmasq 配置文件 '/etc/dnsmasq.conf'。
sudo cp /etc/dnsmasq.conf{,.orig}
sudo nano /etc/dnsmasq.conf
将以下几行添加到文件中。
# dnsmasq run on UDP port 53 # with IP address localhost and 192.168.5.50 # and network interface eth1 port=53 listen-address=127.0.0.1,192.168.5.50 interface=eth1 # disable forwarding of non-routed address # disable forwarding names without the main domain.com # automatically append the domain part to simple names # disable dnsmasq to read /etc/resolv.conf file domain-needed bogus-priv expand-hosts no-resolv # upstream DNS server for non-local domains # using Cloudflare and google public DNS server=1.1.1.1 server=8.8.8.8 # define the domain for dnsmasq domain=howtoforge.local address=/howtoforge.local/192.168.5.50 # enable DNS Cache and adjust cache-size cache-size=10000 # enable dhcp via dnsmasq # define lease db file # make the dhcp server as an authoritative dhcp-range=192.168.5.100,192.168.5.150,12h dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases dhcp-authoritative
完成后保存文件并退出编辑器。
以下是你将在 Dnsmasq 安装中使用的详细选项:
- port:你用来运行 Dnsmasq 的端口。
- listen-address:你用来运行 Dnsmasq 的 IP 地址。你可以使用多个 IP 地址。
- interface:Dnsmasq 将绑定并运行的网络接口。
- domain-needed:禁用对不带主域名的名称的转发;除非给出完整的本地域名(例如 'mysql1.howtoforge.local'),否则无法访问像 'mysql1' 这样的主机。
- bogus-priv:禁用对不可路由地址的转发。
- expand-hosts:自动将本地域名部分附加到简单名称上。
- no-resolv:忽略服务器上的 '/etc/resolv.conf' 文件。
- server:定义你将对非本地地址或域名使用的上游 DNS 服务器。本示例使用 Cloudflare 和 Google 的公共 DNS 服务器。
- domain:定义 Dnsmasq 服务器的域名。在本示例中,Dnsmasq 服务器将获得本地域名 howtoforge.local。
- address:定义 Dnsmasq 上该域名对应的 IP 地址。在本示例中,域名 howtoforge.local 将被解析到 IP 地址 192.168.5.50。
- cache-size:在 Dnsmasq 上启用 DNS 缓存。请务必调整大小,这能提升性能和速度。
- dhcp-range:通过 Dnsmasq 启用 DHCP 服务器。请为你的网络调整 IP 地址池和租约时间。
- dhcp-leasefile:定义用于存储 DHCP 租约的文件。
- dhcp-authoritative:使 DHCP 服务器成为权威服务器。

接下来,使用以下 nano 编辑器命令打开 ' /etc/hosts ' 文件。你现在将为本地环境中的应用程序定义一些子域名。
sudo nano /etc/hosts
将以下几行添加到文件中。在本示例中,你将创建三个子域名 wiki、mysql 和 files。每个子域名都将遵循 Dnsmasq 服务器的主域名 'howtoforge.local',并指向一个特定的 IP 地址。
子域名 wiki.howtoforge.local 将指向 IP 地址 ' 192.168.5.10 ',子域名 ' mysql.howtoforge.local ' 指向 IP 地址 ' 192.168.5.25 ',而 ' files.howtoforge.local ' 将指向 IP 地址 ' 192.168.5.30 '。
192.168.5.10 wiki 192.168.5.25 mysql 192.168.5.30 files
完成后保存文件并退出编辑器。
现在使用以下 nano 编辑器命令打开 DNS 解析器配置文件 ' /etc/resolv.conf '。
sudo nano /etc/resolv.conf
将以下几行添加到文件顶部。请务必将 IP 地址替换为 Dnsmasq 服务器的 IP 地址。
nameserver 127.0.0.1 nameserver 192.168.5.50
完成后保存文件并退出编辑器。
现在运行以下命令以验证 Dnsmasq 配置,并确保你的配置正确无误。你将收到类似 ' dnsmasq: syntax check OK ' 的输出。
sudo dnsmasq --test
最后,运行以下 systemctl 命令工具以重启 'dnsmasq' 服务并应用更改。
sudo systemctl restart dnsmasq

至此,你已完成在 Rocky Linux 系统上将 Dnsmasq 配置为本地 DNS 服务器的工作。你还通过 '/etc/hosts' 文件为 Dnsmasq 服务器配置了域名以及若干子域名。最后,你通过 Dnsmasq 启用了 DNS 缓存和 DHCP 服务器。
在接下来的步骤中,你将验证 Dnsmasq 服务器的安装与配置。
验证 Dnsmasq 安装
Dnsmasq 配置完成后,你现在将验证 Dnsmasq 服务本身。你将验证 Dnsmasq 以确保它在默认端口 50 上运行且服务正在运行。然后,你将通过 ' dns-utils ' 软件包验证你创建的本地域名和子域名。
运行以下命令以验证系统上开放的端口。然后通过 systemctl 命令工具验证 ' dnsmasq ' 服务。
ss -tulpn | grep 53
sudo systemctl status dnsmasq
你将收到类似以下输出 —— Dnsmasq 正在默认端口 53 上运行,服务状态当前为运行中。同时它已启用,将在启动时自动启动。

接下来,运行以下 dnf 命令将 'bind-utils' 软件包安装到你的 Rocky Linux 服务器。该软件包提供了多个用于测试和排查 DNS 服务器故障的命令行工具。
sudo dnf install bind-utils
当提示时输入 y 并按 ENTER 继续。

现在运行以下 dig 命令以验证 Dnsmasq 服务器的域名 ' howtoforge.local '。你应该会看到 ' howtoforge.local ' 指向服务器的 IP 地址 ' 192.168.5.50 '。
dig howtoforge.local

最后,运行以下命令以验证你通过 ' /etc/hosts ' 文件定义的子域名。
dig wiki.howtoforge.local +short
dig mysql.howtoforge.local +short
dig files.howtoforge.local +short
你将收到类似以下输出 —— 子域名 wiki.howtoforge.local 指向 IP 地址 192.168.5.10,子域名 mysql.howtoforge.local 指向 IP 地址 192.168.5.25,最后子域名 files.howtoforge.local 指向服务器的 IP 地址 192.168.5.30。

有了这些结果,你已完成将 Dnsmasq 配置为本地 DNS 服务器的工作。在接下来的步骤中,你将通过 Firewalld 保护 DNS 端口。
配置 Firewalld
在此步骤中,你将配置 firewalld 以开放 DNS 服务端口,并将内部网络的 IP 地址添加到 firewalld,作为允许访问 DNS 服务端口的主要来源。
运行以下 firewall-cmd 命令将 DNS 服务添加到 firewalld。然后,将内部网络 IP 地址添加为来源。
sudo firewall-cmd --add-service=dns
sudo firewall-cmd --add-source=192.168.5.0/24
接下来,运行以下命令以保存你创建的临时规则并重新加载 firewalld 以应用更改。
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reload

通过以下命令验证 firewalld。你应该会看到 DNS 服务已添加到 firewalld,并且该网络的来源 IP 地址也已添加到 firewalld。
sudo firewall-cmd --list-all
输出:

配置客户端(基于 Debian 或 RHEL)
在此步骤中,你将学习如何配置基于 Debian 和基于 RHEL 的发行版,以使用你通过 Dnsmasq 创建的本地 DNS 服务器。
对于基于 RHEL 的发行版
使用以下 nano 编辑器命令为 NetworkManager 添加一个新配置文件 ' /etc/NetworkManager/conf.d/dns-servers.conf '。
sudo nano /etc/NetworkManager/conf.d/dns-servers.conf
将以下几行添加到文件中,并确保将 IP 地址替换为 Dnsmasq 服务的 IP 地址。通过此配置,你将使用 Dnsmasq 服务器的 IP 地址为客户端设置默认 DNS 解析器。这将自动写入 DNS 解析器配置 ' /etc/resolv.conf '。
[global-dns-domain-*] servers=192.168.5.50
完成后保存文件并退出编辑器。
接下来,运行以下 systemctl 命令以重启 NetworkManager 服务并应用更改。
sudo systemctl restart NetworkManager
你可以查看 '/etc/resolv.conf' 文件以验证设置。你应该会看到默认的名称服务器是本地 Dnsmasq 服务器的 IP 地址 192.168.5.50。
cat /etc/resolv.conf

接下来,运行以下 dnf 命令将 'bind-utils' 软件包安装到你的系统。
sudo dnf install bind-utils

对于基于 Debian 的发行版
如果你使用的是基于 Debian 的操作系统,你可以手动设置 DNS 解析器,并禁用系统上的 'systemd-resolved' 服务 —— 尤其是 Ubuntu 系统。
运行以下命令以停止并禁用 systemd-resolved 服务。
sudo systemctl disable --now systemd-resolved
现在运行以下命令以删除 DNS 解析器配置 '/etc/resolv.conf' 的符号链接文件。然后,通过以下 nano 编辑器命令创建一个新的解析器配置文件 ' /etc/resolv.conf '。
unlink /etc/resolv.conf
sudo nano /etc/resolv.conf
将以下行添加到文件中,并将 IP 地址替换为你的 Dnsmasq 服务器 IP 地址。
nameserver 192.168.5.50
完成后保存文件并退出编辑器。
接下来,运行以下 apt 命令将 ' dnsutils ' 软件包安装到你的系统。
sudo apt install dnsutils
一旦安装了 'bind-utils' 或 'dns-utils',你就可以通过 dig 命令验证你的 Dnsmasq 配置。
通过以下 dig 命令验证 Dnsmasq 服务器的域名 ' howtoforge.local '。你应该会看到域名 ' howtoforge.local ' 指向 Dnsmasq 服务器的 IP 地址 192.168.5.50。
dig howtoforge.local

接下来,使用以下命令验证你通过 '/etc/hosts' 文件配置的子域名。你应该会看到每个子域名都指向你在 '/etc/hosts' 文件中配置的特定 IP 地址。
dig wiki.howtoforge.local +short
dig mysql.howtoforge.local +short
dig files.howtoforge.local +short
你将收到类似以下输出 —— 子域名 wiki.howtoforge.local 指向 IP 地址 192.168.5.10,子域名 mysql.howtoforge.local 指向 IP 地址 192.168.5.25,最后子域名 files.howtoforge.local 指向服务器的 IP 地址 192.168.5.30。

至此,本地域名和子域名已成功配置。那么,像 Github.com 这样的公共域名呢?
运行以下命令以从你的客户端机器验证互联网域名。这将确保即使本地 DNS 由 Dnsmasq 服务器解析,你也能够连接到互联网。
dig github.com
你将收到类似以下输出 —— 对 github.com 的 dig 查询是通过运行在 IP 地址 192.168.5.50、默认端口 53 上的本地 DNS 服务器进行连接的。

最后,通过以下 dig 命令验证 DNS 缓存设置。这将显示你执行的查询的统计信息,包括对目标域名的 ' Query time '(查询时间)。
dig +noall +stats duckduckgo.com
dig +noall +stats duckduckgo.com
然后你将收到类似以下输出 —— 你得到的第一次查询的 ' Query time ' 为 63ms。但对于第二次和第三次查询,Query Time 为 2ms,这意味着你对同一域名的查询已被 Dnsmasq 本地 DNS 服务器缓存。

结论
在本教程中,你使用 Dnsmasq 创建了自己的本地 DNS 服务器。你在 Rocky Linux 9 服务器上使用 Dnsmasq 为本地环境搭建了自己的 DNS 服务器。此外,这还包括为 Dnsmasq 配置本地域名和子域名、启用 DNS 缓存以提升速度,以及通过 Dnsmasq 启用 DHCP 服务器。
最后,你还添加并配置了客户端机器(基于 Debian 和 RHEL 的发行版)以使用你创建的本地 DNS 服务器。在此过程中,你还学习了如何使用 dig 命令排查 DNS 服务器故障,以及如何在 Linux 系统上设置 DNS 解析器。