DNSMasq,小巧玲珑的超级守护进程!

作者:Shawn Powers

我一直很喜欢在消费级路由器上安装第三方固件。无论是 DD-WRT、Tomato、OpenWRT 还是其他任何你喜欢的“比原厂更好”的固件,它都非常经济实用。不幸的是,我的路由需求已经超过了我那台可靠的 Linksys 路由器。虽然我当然可以购买一台几百美元的企业级路由器,但我真的不喜欢那样花钱。谢天谢地,我找到了一款令人难以置信的小型路由器(EdgeRouter Lite),它可以每秒路由一百万个数据包,并有三个千兆以太网端口。到目前为止,它是一款令人难以置信的路由器,但这只是它的全部功能——路由。 这就引出了本文的重点。

我一直使用 DD-WRT 内置的 DHCP 和 DNS 服务器来为我的网络提供服务。我喜欢将这两项服务与路由器绑定在一起,因为即使我网络上的所有其他服务器都出现故障,我仍然可以上网。我认为下一个最好的选择是使用 Raspberry Pi 专门用于这些服务。由于我目前所有的 RPi 设备都连接到房子周围的电视(运行 XBMC),我决定征用我在 2013 年 11 月评测过的 Cubox 电脑(图 1)。它一直闲置在我的架子上积灰尘,我宁愿让它做一些有用的事情。

图 1. Cubox 比 Raspberry Pi 功能更强大,但即使是 RPi 也比 DNSMasq 所需的功率更大!

虽然 Cubox 肯定足够强大来运行 BIND 和 ISC DHCP 服务器,但对于我的网络来说,这确实是杀鸡用牛刀了。此外,BIND 每次更新时都需要进行序列号递增等操作,这真的让我很恼火。直到我开始研究替代 DNS 服务器,我才意识到 DNSMasq 有多么强大。而且,它的工作方式非常简单。首先,让我们看看它的功能

  • 极小的内存和 CPU 占用:我知道是这样的,因为它是在基于 Linux 的消费级路由器上运行的程序,在这些路由器中,内存和 CPU 都是非常宝贵的。

  • DNS 服务器:DNSMasq 以不同于传统 BIND 守护进程的方式处理 DNS。它不提供域传输、主/从关系等复杂性。它确实提供了非常简单且高度可配置的选项,在我看来,这些选项在中小规模网络中更有用。它甚至可以自动执行反向 DNS(PTR 记录)!(更多细节稍后介绍。)

  • DHCP 服务器:DNSMasq 的 DNS 部分在某些高级功能方面有所欠缺,但它提供的 DHCP 服务实际上非常强大。大多数运行 DD-WRT 等固件的路由器不提供 DNSMasq 提供的高级功能的 Web 界面,但它可以与某些独立的 DHCP 服务器相媲美,甚至超越它们。

  • TFTP 服务器:DNSMasq 与 DHCP 的高级功能完美协同工作,甚至提供了一个内置的 TFTP 服务器,用于启动瘦客户端或发送配置文件等操作。

  • 单个配置文件:可以使用多个配置文件,我甚至建议为了清晰起见这样做。然而,最终,DNSMasq 只需要您编辑一个配置文件即可管理其所有强大的服务。该配置文件的注释也非常完善,这使得使用起来更加方便。

安装

DNSMasq 已经存在很长时间了。在任何 Linux 操作系统上安装它都应该像在发行版的软件包管理系统中搜索它一样简单。在基于 Debian 的系统上,这意味着类似


sudo apt-get install dnsmasq

或者,在 Red Hat/CentOS 系统上


yum install dnsmasq (as root)

配置文件(只有一个!)通常存储在 /etc/dnsmasq.conf 中,就像我之前提到的,它的注释非常完善。即使是最先进的功能,通常也只需阅读配置文件并取消注释您想要启用的指令即可轻松搞清楚。甚至对于那些需要您输入特定于您的环境的信息的指令,也有示例。

安装 dnsmasq 软件包后,它很可能会自动启动。从那时起,每当您更改配置(或更改 /etc/hosts 文件)时,您都需要重新启动服务或向守护进程发送 HUP 信号。我建议使用 init 脚本来执行此操作


sudo service dnsmasq restart

但是,如果您的系统没有为 dnsmasq 设置 init 服务,您可以通过键入如下内容来发出 HUP 信号


sudo kill -HUP $(pidof dnsmasq)

这将找到 PID(进程 ID)并发送信号以重新加载其配置文件。这两种方法都应该有效,但 init 脚本会在出现错误时提供更多反馈。

首先:DNS

在 DNSMasq 提供的所有功能中,我发现它的 DNS 服务是最有用和最棒的。您可以获得上游 DNS 服务器(通常由您的 ISP 提供)的全部功能,同时无缝集成您自己网络的 DNS 记录。要使用 BIND 完成那种“拆分 DNS”类型的设置,您需要创建一个伪 DNS 主文件,即使这样,如果您在本地主文件中缺少 DNS 名称,也会遇到问题,因为默认情况下,对于它认为自己负责服务的记录,BIND 不会查询其他服务器。另一方面,DNSMasq 在收到请求时遵循一个非常简单的过程。图 2 显示了该过程。

图 2. DNSMasq 使 DNS 查询简单、灵活且高度可配置。

对于我的目的来说,这意味着我可以将一个条目放入我的服务器的 /etc/hosts 文件中,例如“server.brainofshawn.com”,DNSMasq 将返回 /etc/hosts 文件中的 IP 地址。如果主机向 DNSMasq 查询服务器的 /etc/hosts 文件中没有的条目,例如 www.brainofshawn.com,它将查询上游 DNS 服务器并返回我的 Web 主机的实时 IP。DNSMasq 使拆分 DNS 场景非常易于维护,并且因为它使用服务器的 /etc/hosts 文件,所以修改条目也很简单。

然而,我个人最喜欢的 DNSMasq DNS 服务功能是它支持轮询负载均衡。这通常不适用于 /etc/hosts 文件条目,但使用 DNSMasq,它可以。假设您的 /etc/hosts 文件中有两个条目,如下所示


192.168.1.10	webserver.example.com
192.168.1.11	webserver.example.com

在常规系统上(也就是说,如果您将其放入客户端的 /etc/hosts 文件中),DNS 查询始终会首先返回 192.168.1.10。另一方面,DNSMasq 将看到这两个条目,并在每次查询时混合它们的顺序。因此,192.168.1.10 不再是第一个 IP,有一半的时间,它将返回 192.168.1.11 作为第一个 IP。这是一种非常基本的负载均衡形式,但这是一个大多数人不知道存在的功能!

最后,DNSMasq 将根据服务器 /etc/hosts 文件中找到的条目自动创建并提供反向 DNS 响应。在前面的示例中,运行命令


dig -x 192.168.1.10

将获得响应“webserver.example.com”作为反向 DNS 查找。如果您为一个 IP 地址设置了多个 DNS 条目,DNSMasq 将使用第一个条目作为反向 DNS 响应。因此,如果您的服务器的 /etc/hosts 文件中有如下一行


192.168.1.15 www.example.com mail.example.com ftp.example.com

对 www.example.com、mail.example.com 或 ftp.example.com 的任何常规 DNS 查询都将得到 “192.168.1.15” 的响应,但对 192.168.1.15 的反向 DNS 查找将得到单个响应 “www.example.com”。

DNSMasq 非常灵活且功能丰富,很难找到不使用它的理由。当然,使用更强大的 DNS 服务器(如 BIND)有合理的理由,但对于大多数中小型网络来说,DNSMasq 更合适,而且简单得多。

提供 DHCP 服务

可以仅将 DNSMasq 用于 DNS,并禁用它提供的 DHCP 服务。然而,与 DNS 非常相似,DNSMasq 提供的简单性和强大功能使其成为中小型网络的完美选择。它支持用于自动 IP 分配的动态范围以及基于网络中计算机 MAC 地址的静态保留。此外,由于它也充当您网络的 DNS 服务器,因此对于连接到您的网络但可能没有 DNS 条目的计算机,它具有非常出色的主机名-DNS 集成。它是如何工作的?图 3 显示了当 DNS 服务器接收到查询时,如果它也充当 DHCP 服务器,则使用的修改方法。(额外的步骤在流程图中显示为橙色菱形。)

图 3. 如果您使用 DHCP,它会自动集成到您的 DNS 系统中——非常适合查找动态分配的 IP!

基本上,如果您的朋友带着笔记本电脑来到您的家中并连接到您的网络,当它请求 DHCP 地址时,它会告诉 DNSMasq 服务器其主机名。从那时起,直到租约到期,服务器收到的任何针对该主机名的 DNS 查询都将作为它通过 DHCP 分配的 IP 返回。如果您有一台连接到您的网络且您知道其主机名的计算机,但它获得了动态分配的 IP 地址,这将非常方便。在我家,我有一台 Hackintosh 计算机,它只是通过 DNSMasq 的 DHCP 服务器获得一个随机分配的 IP。图 4 显示了当我 ping 网络上的名称“hackintosh”时会发生什么。即使它没有列在任何服务器的配置文件中,由于它处理 DHCP,它也会动态创建一个 DNS 条目。

图 4. 我的 Hackintosh 的任何地方都没有 DNS 条目,但由于 DNSMasq,可以通过其主机名进行 ping 操作。

可以使用以下格式在单个配置文件中输入静态 DHCP 条目


dhcp-host=90:fb:a6:86:0d:60,xbmc-livingroom,192.168.1.20
dhcp-host=b8:27:eb:e3:4c:5f,xbmc-familyroom,192.168.1.21
dhcp-host=b8:27:eb:16:d9:08,xbmc-masterbedroom,192.168.1.22
dhcp-host=00:1b:a9:fa:98:a9,officelaser,192.168.1.100
dhcp-host=04:46:65:d4:e8:c9,birdcam,192.168.1.201

也可以在静态声明中省略主机名,但将主机名添加到 DHCP 保留中会将其添加到 DNS 服务器的已知地址列表中,即使客户端本身没有告诉 DHCP 服务器其主机名。您也可以只将主机名添加到 DNSMasq 服务器的 /etc/hosts 文件中,但我更喜欢使用主机名来创建我的静态 DHCP 条目,这样我可以一目了然地看出保留是针对哪台计算机的。

如果这还不够...

以上场景是我在本地网络上使用 DNSMasq 的全部用途。它比我以前使用过的任何 DHCP/DNS 组合都更令人难以置信,包括我在大型网络中使用过的基于 Windows 和 OS X 服务器的服务。然而,它为那些需要它们的人提供了更多服务。

可以通过配置文件激活 TFTP 服务器,以提供启动文件、配置文件或您可能需要在网络上提供的任何其他 TFTP 文件。该服务与 DHCP 服务器完美集成,以提供启动文件名、PXE/BOOTP 信息以及启动最挑剔的设备所需的自定义 DHCP 选项。即使您出于非启动相关的原因需要 TFTP 服务,DNSMasq 的服务器也只是一个标准的 TFTP 服务,适用于任何需要它的计算机或设备。

如果您读过 Kyle Rankin 最近关于 DNSSEC 的文章,并想确保您的 DNS 信息安全,则无需安装 BIND。DNSMasq 支持 DNSSEC,并再次在配置文件中提供了配置示例。

确实,DNSMasq 是消费级互联网路由器的无名英雄。它允许这些小型设备为您的整个网络提供 DNS 和 DHCP 服务。但是,如果您在常规服务器(或微小的 Raspberry Pi 或 Cubox)上安装该程序,它可以成为满足您所有网络需求的极其强大的平台。如果不是因为我需要获得更强大、更可靠的路由器,我永远不会了解到 DNSMasq 有多么神奇。如果您曾经对 BIND 感到沮丧,或者您只是想更好地控制网络上的 DNS 和 DHCP 服务,我敦促您仔细了解一下 DNSMasq。它不仅仅适用于您的 DD-WRT 路由器!

Shawn 是Linux Journal的副编辑,并且从 Linux 诞生之初就接触了它。他对开源充满热情,并且热爱教学。他还喝太多咖啡,这经常在他的写作中体现出来。

加载 Disqus 评论