使用 dnsmasq 提供 DNS & DHCP 服务

许多技术爱好者发现能够控制他们的 主机名解析很重要. 设置服务器和服务通常需要某种形式的固定地址,有时还需要特殊形式的解析,例如定义 Kerberos 或 LDAP 服务器、邮件服务器等,这一切都可以通过 dnsmasq 来实现。

dnsmasq 是一个轻量级且简单的程序,它可以在您的网络上发布 DHCP 地址并在 DNS 中注册主机名和 IP 地址。 此配置还允许外部解析,因此您的整个网络将能够与自身对话并找到外部站点。

本文介绍在虚拟机或小型物理机(如 Raspberry Pi)上安装和配置 dnsmasq,以便它可以在您的家庭网络或实验室中提供这些服务。 如果您有一个现有的设置并且只需要调整本地工作站的设置,请阅读上一篇文章,其中介绍了在 NetworkManager 中配置 dnsmasq 插件。

安装 dnsmasq

首先,安装 dnsmasq 包:

sudo dnf install dnsmasq

接下来,启用并启动 dnsmasq 服务:

sudo systemctl enable --now dnsmasq

配置 dnsmasq

首先,备份 dnsmasq.conf 文件:

sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.orig

接下来,编辑文件并对以下内容进行更改以反映您的网络。 在本例中,mydomain.org 是域名,192.168.1.10 是 dnsmasq 服务器的 IP 地址,192.168.1.1 是默认网关。

sudo vi /etc/dnsmasq.conf

插入以下内容:

domain-needed
bogus-priv
no-resolv
server=8.8.8.8
server=8.8.4.4
local=/mydomain.org/
listen-address=::1,127.0.0.1,192.168.1.10
expand-hosts
domain=mydomain.org
dhcp-range=192.168.1.100,192.168.1.200,24h
dhcp-option=option:router,192.168.1.1
dhcp-authoritative
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases

测试配置以检查拼写错误和语法错误:

$ sudo dnsmasq --test
dnsmasq: syntax check OK.

现在编辑主机文件,它可以包含静态和动态分配的主机。 静态地址应位于您之前指定的 DHCP 范围之外。 使用 DHCP 但需要固定地址的主机应在此处输入 DHCP 范围内的地址。

sudo vi /etc/hosts

前两行应该已经存在。 添加剩余的行以配置路由器、dnsmasq 服务器和两个额外的服务器。

127.0.0.1   localhost localhost.localdomain
::1         localhost localhost.localdomain
192.168.1.1    router
192.168.1.10   dnsmasq
192.168.1.20   server1
192.168.1.30   server2

重启 dnsmasq 服务:

sudo systemctl restart dnsmasq

接下来将服务添加到防火墙以允许客户端连接:

sudo firewall-cmd --add-service={dns,dhcp}
sudo firewall-cmd --runtime-to-permanent

测试名称解析

首先,安装 bind-utils 以获取 nslookup 和 dig 包。 这些允许您执行正向和反向查找。 如果您不想安装额外的软件包,可以使用 ping。 但是这些工具值得安装,因为它们可以提供额外的故障排除功能。

sudo dnf install bind-utils

现在测试分辨率。 首先,测试正向(主机名到 IP 地址)解析:

$ nslookup server1
Server:       127.0.0.1
Address:      127.0.0.1#53
Name:         server1.mydomain.org
Address:      192.168.1.20

接下来,测试反向(IP 地址到主机名)解析:

$ nslookup 192.168.1.20
20.1.168.192.in-addr.arpa    name = server1.mydomain.org.

最后,测试解析网络外的主机名:

$ nslookup fedoramagazine.org
Server:       127.0.0.1
Address:      127.0.0.1#53
Non-authoritative answer:
Name:    fedoramagazine.org
Address: 35.196.109.67

测试 DHCP 租约

要测试 DHCP 租用,您需要启动一台使用 DHCP 获取 IP 地址的机器。 任何 Fedora 默认情况下,变体将执行此操作。 一旦你启动了客户端机器,检查它是否有一个地址并且它对应于 dnsmasq 的租用文件。

从运行 dnsmasq 的机器:

$ sudo cat /var/lib/dnsmasq/dnsmasq.leases
1598023942 52:54:00:8e:d5:db 192.168.1.100 server3 01:52:54:00:8e:d5:db
1598019169 52:54:00:9c:5a:bb 192.168.1.101 server4 01:52:54:00:9c:5a:bb

扩展功能

您可以通过 DHCP 为主机分配一个固定的 IP 地址,方法是将它添加到您的主机文件中,并使用您想要的地址(在您的 DHCP 范围内)。 为此,请将以下行添加到 dnsmasq.conf 文件中,该行将列出的 IP 分配给具有该名称的任何主机:

dhcp-host=myhost

或者,您可以指定一个 MAC 地址,该地址应始终被赋予一个固定的 IP 地址:

dhcp-host=11:22:33:44:55:66,192.168.1.123

如果需要自动化机器构建,可以指定 PXE 引导服务器

tftp-root=/tftpboot
dhcp-boot=/tftpboot/pxelinux.0,boothost,192.168.1.240

这应该指向您的 TFTP 服务器的实际 URL。

如果您需要指定 SRV 或 TXT 记录,例如 LDAP、Kerberos 或类似的记录,您可以添加这些:

srv-host=_ldap._tcp.mydomain.org,ldap-server.mydomain.org,389
srv-host=_kerberos._udp.mydomain.org,krb-server.mydomain.org,88
srv-host=_kerberos._tcp.mydomain.org,krb-server.mydomain.org,88
srv-host=_kerberos-master._udp.mydomain.org,krb-server.mydomain.org,88
srv-host=_kerberos-adm._tcp.mydomain.org,krb-server.mydomain.org,749
srv-host=_kpasswd._udp.mydomain.org,krb-server.mydomain.org,464
txt-record=_kerberos.mydomain.org,KRB-SERVER.MYDOMAIN.ORG

dnsmasq 中还有许多其他选项。 原始配置文件中的注释描述了其中的大部分。 有关完整详细信息,请阅读本地或本地手册页 在线的.