本页内容

  • 准备工作
  • 准备系统
  • 安装并配置 Dnsmasq
  • 验证 Dnsmasq 安装
  • 配置 UFW 防火墙
  • 配置客户端
  • 结论

Dnsmasq 是一个适用于本地环境(LAN)的小型轻量级网络服务。它提供 DNS、DHCP 和 TFTP 等网络服务。Dnsmasq 可用作 DNS 转发器、递归 DNS 服务器以及 DNS 缓存系统。它还会从 /etc/hosts 文件加载 DNS 内容,这使得你能够为本地主机名设置域名。

Dnsmasq 被设计为轻量级且占用内存极小,适合路由器、防火墙等低资源设备。Dnsmasq 可运行在 Linux、BSDs、Android 以及 macOS 上。

本教程将在 Debian 12 服务器上使用 Dnsmasq 安装并配置一个本地 DNS 服务器。我们将搭建一个可用于本地网络的本地 DNS 服务器,添加本地域名、启用 DNS 缓存,并通过 Dnsmasq 启用 DHCP 服务器。你还将学习如何配置并添加一台客户端机器来使用本地 DNS 服务器。完成本教程后,你将能够通过本地域名访问所有应用程序,并且由于启用了 DNS 缓存,你的 DNS 请求速度会更快。

准备工作

在开始之前,你必须满足以下要求才能完成本教程:

  • 一台 Debian 12 服务器——本示例使用主机名为 ' dnsmasq-server '、IP 地址为 192.168.5.20 的 Debian 服务器。
  • 一个具有 sudo/root 管理员权限的非 root 用户。

对于客户端机器,你可以使用任何 Linux 发行版,因为每个发行版的 DNS 配置都类似。

准备系统

在这一步,你将准备用作本地 DNS 服务器的 Debian 服务器。你将更新软件包索引,停止并禁用 ' systemd-resolved ' 服务,然后通过 ' /etc/resolv.conf ' 文件创建静态 DNS 解析器配置。

在 Debian 系统上,DNS 解析器由 'systemd-resolved' 服务管理,该服务通过 D-BUS 接口提供网络名称解析。要搭建 Dnsmasq 之类的 DNS 服务器软件,你必须禁用 ' systemd-resolved ' 服务。

在开始之前,运行以下 apt 命令来更新并刷新你的 Debian 软件包索引。

sudo apt update

接下来,运行以下命令来停止并禁用 ' systemd-resolved ' 服务。在 Debian 系统上,DNS 配置由 NetworkManager 和 systemd-resolved 服务管理。

sudo systemctl disable --now systemd-resolved
sudo systemctl stop systemd-resolved

通过以下命令删除 DNS 解析器配置文件 '/etc/resolv.conf' 的链接文件。

sudo unlink /etc/resolv.conf

之后,使用以下 nano 编辑器命令创建一个新的 DNS 解析器配置文件 ' /etc/resolv.conf '。

sudo nano /etc/resolv.conf

将以下行添加到文件中。这将把 Cloudflare 和 Google 的公共 DNS 添加为你 Debian 服务器的解析器。

nameserver 1.1.1.1
nameserver 8.8.8.8

完成后保存文件并退出编辑器。现在进入下一步进行 Dnsmasq 的安装与配置。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

安装并配置 Dnsmasq

在这一步,你将使用 Dnsmasq 安装并搭建本地 DNS 服务器。你将把 Dnsmasq 配置为运行在默认 DNS 端口 53 以及内部 IP 地址 ' 192.168.5.20 ' 上。你还将为 Dnsmasq 服务定义域名、启用 DNS 缓存,最后通过 Dnsmasq 启用 DHCP 服务器。

默认的 ' dnsmasq ' 软件包可在 Debian 仓库中获取。运行以下 apt 命令来安装 Dnsmasq 软件包。

sudo apt install dnsmasq

出现提示时,输入 y 确认并按 ENTER 继续。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

Dnsmasq 安装完成后,运行以下 systemctl 命令工具来验证 'dnsmasq' 服务,确保该服务已启用并正在运行。

sudo systemctl is-enabled dnsmasq
sudo systemctl status dnsmasq

你将收到类似如下的输出——dnsmasq 服务已启用,并将在启动时自动运行。当前 dnsmasq 服务的状态为 running(运行中)。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

Dnsmasq 已在你的 Debian 系统上运行,接下来你将通过 '/etc/dnsmasq.conf ' 文件开始 Dnsmasq 的配置。

首先,运行以下命令来备份默认的 Dnsmasq 配置文件。

sudo cp /etc/dnsmasq.conf{,.orig}

现在使用以下 nano 编辑器命令打开 Dnsmasq 配置文件 ' /etc/dnsmasq.conf '。

sudo nano /etc/dnsmasq.conf

将以下行添加到文件中。

# dnsmasq run on UDP port 53
# with IP address localhost and 192.168.5.20
# and network interface eth1
port=53
listen-address=127.0.0.1,192.168.5.20
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 domain names
# 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.20
# enable DNS Cache and adjust cache-size
cache-size=1000
# enable DHCP via dnsmasq
# define lease db file
# make the dhcp server as an authoritative
dhcp-range=192.168.5.80,192.168.5.150,12h
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
dhcp-authoritative

完成后保存文件并关闭编辑器。

你将为 Dnsmasq 使用的详细选项:

  • port :Dnsmasq 运行时所使用的端口。
  • listen-address :Dnsmasq 运行时所使用的 IP 地址。你可以使用多个 IP 地址。
  • interface :Dnsmasq 绑定并运行的网络接口。
  • domain-needed :禁用对不带主域地址的名称的转发。除非你给出完整的本地域名(如 ' mysql1.howtoforge.local '),否则无法访问像 ' mysql1 ' 这样的主机。
  • bogus-pri v:禁用对非路由地址的转发。
  • 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.20 。
  • cache-size :在 Dnsmasq 上启用 DNS 缓存。请务必调整该大小,以提升性能和速度。
  • dhcp-range :通过 Dnsmasq 启用 DHCP 服务器。请为你的网络调整 IP 地址池和租约时间。
  • dhcp-leasefile :定义用于存储 DHCP 租约的文件。
  • dhcp-authoritative :将 DHCP 服务器设为权威服务器。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

接下来,使用以下 nano 编辑器命令打开配置文件 '/etc/hosts'。你可以为内部应用程序定义子域名,它们将自动配置到 Dnsmasq 域名 ' howtoforge.local ' 下。

sudo nano /etc/hosts

将以下行添加到文件中。在本示例中,你将定义子域名 app1 、 db1 和 files 。这些子域名的根域名就是 Dnsmasq 服务器本身 ' howtoforge.local '。

通过以下行,' app1.howtoforge.local ' 将解析到 IP 地址 ' 192.168.5.10 ',子域名 ' db1.howtoforge.local ' 将指向服务器 IP 地址 ' 192.168.5.25 ',而子域名 'files.howtoforge.local ' 将指向 IP 地址 '192.168.5.50 '。

192.168.5.10 app1
192.168.5.25 db1
192.168.5.50 files 

完成后保存文件并退出编辑器。

接下来,使用以下 nano 编辑器命令打开 ' /etc/resolv.conf ' 文件,并将 Dnsmasq 服务器的 IP 地址添加为 ' nameserver '。

sudo nano /etc/resolv.conf

将以下行添加到文件顶部。请务必将 IP 地址替换为你的 Dnsmasq 服务器 IP 地址。

nameserver 127.0.0.1
nameserver 192.168.5.20

完成后保存文件并退出编辑器。

现在运行以下 'dnsmasq' 命令来验证 Dnsmasq 配置,确保配置格式正确。你应该收到类似 ' dnsmasq - syntax check OK ' 的输出。

sudo dnsmasq --test

最后,运行以下 systemctl 命令工具来重启 ' dnsmasq' 服务并应用更改。

sudo systemctl restart dnsmasq

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

至此,你已经完成了在 Debian 系统上通过 Dnsmasq 配置本地 DNS 服务器的工作。你还配置了本地域名和子域名、启用了 DNS 缓存,并通过 Dnsmasq 启用了 DHCP 服务器。

在接下来的步骤中,你将验证 Dnsmasq 服务器的安装与配置。

验证 Dnsmasq 安装

在这一步,你将通过检查系统中的 Dnsmasq 服务和 LISTEN 端口来验证 Dnsmasq 安装。然后,你将验证通过 '/etc/hosts' 文件配置好的本地域名和子域名。

运行以下命令来确保 Dnsmasq 服务正在端口 53 上运行。然后,通过 systemctl 命令工具验证 Dnsmasq 服务的状态。

ss -tulpn | grep 53
sudo systemctl status dnsmasq

你将收到类似如下的输出——Dnsmasq 服务正在默认端口 53 上运行,它已启用并将在启动时自动运行。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

接下来,你将验证通过 ' /etc/hosts ' 文件在 Dnsmasq 上配置好的域名和子域名。但在此之前,运行以下 apt 命令将 ' dnsutils ' 软件包安装到你的系统。'dnsutils' 软件包提供了用于测试 DNS 服务器配置的命令行工具。

sudo apt install dnsutils

出现提示时输入 y 并按 ENTER 继续安装。

' dnsutils ' 安装完成后,运行以下 dig 命令来验证你配置好的域名和子域名。

验证 Dnsmasq 主域名 ' howtoforge.local ',它指向 Dnsmasq 服务器 IP 地址 '192.168.5.20' 。

dig howtoforge.local

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

通过以下 dig 命令验证你通过 '/etc/hosts' 文件定义的子域名。

dig app1.howtoforge.local +short
dig db1.howtoforge.local +short
dig files.howtoforge.local +short

子域名 ' app1.howtoforge.local 指向 IP 地址 ' 192.168.5.10 ',子域名 ' db1.howtoforge.local ' 指向 IP 地址 ' 192.168.5.25 ',最后 ' files.howtoforge.local ' 指向 IP 地址 ' 192.168.5.50 '。

下面是你会收到的类似输出。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

至此,你已在 Debian 服务器上将 Dnsmasq 配置并测试为本地 DNS 服务器。在接下来的步骤中,你将使用 UFW 防火墙来配置并保护 Dnsmasq。

配置 UFW 防火墙

现在你将在本地 DNS 服务器上配置防火墙。你将通过 UFW 防火墙限制对 DNS 服务器的访问,从而保护 Dnsmasq 安装。

运行以下 apt 命令在你的 Debian 系统上安装 UFW 防火墙。

sudo apt install ufw -y

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

安装 UFW 后,运行以下命令将 OpenSSH 服务和 DNS 端口 53 添加到 UFW 防火墙。在本示例中,你将指定允许访问 Dnsmasq 服务器的网络来源,即 IP 地址段为 192.168.5.0/24 的本地网络。

请务必将本地网络 IP 地址替换为你内部网络的子网。

sudo ufw allow OpenSSH
sudo ufw allow from 192.168.5.0/24 to any port 53 proto udp

接下来,运行以下命令来启动并启用 UFW 防火墙。

sudo ufw enable

当询问配置时,输入 y 确认并按 ENTER 继续。UFW 防火墙现在应该正在运行并已启用,将在启动时自动启动。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

最后,运行以下命令来验证 UFW 防火墙的状态。你应该看到 UFW 防火墙为 'active'(活动),并且 OpenSSH 服务和 DNS 端口 53 已添加到防火墙。

sudo ufw status

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

UFW 防火墙配置完成后,你现在可以添加客户端来连接你的本地 DNS 服务器。

配置客户端

在这一步,你将配置一台基于 Debian 发行版、主机名为 ' client ' 的客户端机器。你将把本地 DNS 服务器 Dnsmasq 添加到客户端机器。

运行以下命令删除 DNS 解析器配置文件 '/etc/resolv.conf' 的链接。然后,使用以下 nano 编辑器命令创建一个新的解析器配置 ' /etc/resolv.conf '。

sudo unlink /etc/resolv.conf
sudo nano /etc/resolv.conf

在文件中输入以下行。请务必将 IP 地址替换为你的 Dnsmasq 服务器 IP 地址。

nameserver 192.168.5.20

完成后保存文件并退出编辑器。

接下来,运行以下命令将 'dnsutils' 软件包安装到客户端机器。

sudo apt install dnsutils

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

现在运行以下 dig 命令来验证域名 ' howtoforge.local ',它将指向 Dnsmasq 服务器的 IP 地址。

dig howtoforge.local

下面是你会收到的输出。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

对于子域名,运行以下 dig 命令。每个子域名将指向 Dnsmasq 服务器上 ' /etc/hosts ' 文件中定义的 IP 地址。

dig app1.howtoforge.local +short
dig db1.howtoforge.local +short
dig files.howtoforge.local +short

下面是你在客户端机器上会收到的类似输出。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

接下来,你还需要确保能够通过 Dnsmasq 本地 DNS 服务器访问公共域名。你可以通过检查 ' github.com ' 等公共域名来验证这一点。

dig github.com

你将收到类似此截图的输出——在输出底部,你应该看到你的请求由运行在 ' 192.168.5.20'、默认端口 ' 53 ' 上的 Dnsmasq 本地 DNS 服务器应答。由此可见,你已成功通过 Dnsmasq 本地 DNS 服务器连接到公共域名。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

最后,你将通过 'drill' 和 'dig' 命令来验证 DNS 缓存。' drill ' 命令是 ' ldnsutils ' 软件包的一部分,因此运行以下 apt 命令来安装它。

sudo apt install ldnsutils

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

安装 ldnsutils 后,运行以下 drill 命令来验证你在 Dnsmasq 服务器上配置的 DNS 缓存。

drill duckduckgo.com | grep "Query time"
drill duckduckgo.com | grep "Query time"

你将收到类似以下截图的输出——第一次发出请求时,' Query time '(查询时间)为 60ms。但第二次请求同一域名时,查询时间降至 1 ms,这说明该 DNS 请求已被本地 DNS 服务器 Dnsmasq 缓存。

在 Debian 12 上用 dnsmasq 搭建本地 DNS 服务器

你也可以通过带有 ' +stats ' 选项的 dig 命令来验证 DNS 缓存。

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

至此,你已完成客户端机器的配置,并验证了 Dnsmasq 本地 DNS 服务器完全正常工作,从你通过 '/etc/hosts' 文件定义的本地域名和子域名,到你已在 Dnsmasq 上启用的 DNS 缓存。

结论

在本教程中,你使用 Dnsmasq 创建了自己的本地 DNS 服务器。你在 Debian 12 服务器上使用 Dnmasq 为你的本地环境搭建了自己的本地 DNS 服务器。此外,这包括为 Dnsmasq 配置本地域名和子域名、启用 DNS 缓存以获得更快的重复 DNS 响应,以及通过 Dnsmasq 启用 DHCP 服务器。

最后,你还添加并配置了客户端机器来使用你创建的本地 DNS 服务器。在此过程中,你还学习了如何使用 dig 命令排查 DNS 服务器故障,以及如何在 Linux 系统上搭建 DNS 解析器。