本页内容

  • 先决条件
  • 准备系统
  • 在 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

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

完成这些设置后,你的 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。

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

现在运行以下命令来安装 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 ' 服务当前正在运行、已启用,并将在启动时自动运行。

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

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 服务器成为权威服务器。

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

接下来,使用以下 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 服务器

至此,你已完成在 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 上运行,服务状态当前为运行中。同时它已启用,将在启动时自动启动。

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

接下来,运行以下 dnf 命令将 'bind-utils' 软件包安装到你的 Rocky Linux 服务器。该软件包提供了多个用于测试和排查 DNS 服务器故障的命令行工具。

sudo dnf install bind-utils

当提示时输入 y 并按 ENTER 继续。

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

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

dig howtoforge.local

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

最后,运行以下命令以验证你通过 ' /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。

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

有了这些结果,你已完成将 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

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

通过以下命令验证 firewalld。你应该会看到 DNS 服务已添加到 firewalld,并且该网络的来源 IP 地址也已添加到 firewalld。

sudo firewall-cmd --list-all

输出:

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

配置客户端(基于 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

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

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

sudo dnf install bind-utils

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

对于基于 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

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

接下来,使用以下命令验证你通过 '/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。

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

至此,本地域名和子域名已成功配置。那么,像 Github.com 这样的公共域名呢?

运行以下命令以从你的客户端机器验证互联网域名。这将确保即使本地 DNS 由 Dnsmasq 服务器解析,你也能够连接到互联网。

dig github.com

你将收到类似以下输出 —— 对 github.com 的 dig 查询是通过运行在 IP 地址 192.168.5.50、默认端口 53 上的本地 DNS 服务器进行连接的。

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

最后,通过以下 dig 命令验证 DNS 缓存设置。这将显示你执行的查询的统计信息,包括对目标域名的 ' Query time '(查询时间)。

dig +noall +stats duckduckgo.com
dig +noall +stats duckduckgo.com

然后你将收到类似以下输出 —— 你得到的第一次查询的 ' Query time ' 为 63ms。但对于第二次和第三次查询,Query Time 为 2ms,这意味着你对同一域名的查询已被 Dnsmasq 本地 DNS 服务器缓存。

在 Rocky Linux 上用 dnsmasq 搭建本地 DNS 服务器

结论

在本教程中,你使用 Dnsmasq 创建了自己的本地 DNS 服务器。你在 Rocky Linux 9 服务器上使用 Dnsmasq 为本地环境搭建了自己的 DNS 服务器。此外,这还包括为 Dnsmasq 配置本地域名和子域名、启用 DNS 缓存以提升速度,以及通过 Dnsmasq 启用 DHCP 服务器。

最后,你还添加并配置了客户端机器(基于 Debian 和 RHEL 的发行版)以使用你创建的本地 DNS 服务器。在此过程中,你还学习了如何使用 dig 命令排查 DNS 服务器故障,以及如何在 Linux 系统上设置 DNS 解析器。