运行您自己的 DNS 服务器是加快网络响应速度、减少对公共基础设施的依赖并从主机名路由等额外功能中受益的好方法。以下是如何使用 Dnsmasq 在 Linux 机器上设置 DNS 服务器。
DNS 是将域名等example.com转换为其服务器的数字 IP 地址的系统。这可能看起来像127.0.0.1. 每当您使用域名发出网络请求时,您的系统都会执行 DNS 查找以确定它应该联系的服务器地址。
这会增加您提出的每个请求的开销。尽管您的设备会缓存 DNS 响应,但在实际请求开始之前,对新域的访问将导致 DNS 往返。这发生在操作系统网络堆栈级别,作为用户的您是不可见的。
ISP 通常运行 DNS 服务器。如果您在路由器和设备上使用默认设置,则您可能依赖 ISP 的服务器。其他公共 DNS 服务器可从Cloudflare和Google等提供商处获得。
为什么要运行自己的 DNS?运行您自己的 DNS 服务器可以让您更好地控制您的网络。一个常见的动机是能够配置网络级域映射,例如web-server到192.168.0.101. 将您的路由器配置为使用您的 DNS 将导致您连接的任何设备都能够192.168.0.101通过http://web-server.
拥有自己的 DNS 服务器可让您将设置集中到一个位置,而不是/etc/hosts在每台设备上单独应用它们。它们将适用于您连接到网络的所有内容,包括无法通过其他方式自定义其路由堆栈的嵌入式硬件。
内部 DNS 服务器还可以提高性能并提供额外的弹性层。大规模 DNS 中断并非闻所未闻;为您与之交互的关键服务使用具有长期缓存的自定义服务器可以帮助您度过所选上游提供商的停机时间。
DNS 与 DnsmasqDnsmasq是一个轻量级的 DNS 服务器,它包含在大多数 Linux 发行版中。配置也非常简单。
在开始之前,值得考虑一下您需要 DNS 服务器提供哪些功能。在本指南中,我们将介绍如何使用本地缓存、一些自定义域路由以及 Google8.8.8.8作为我们的上游 DNS 提供商来设置 Dnsmasq 。
路由流程如下所示:
网络路由器接收来自您连接的设备之一的请求。路由器将配置为使用 Dnsmasq 主机作为其 DNS 服务器。
Dnsmasq 会检查它是否有定义的域名路由,例如web-serverto 192.168.0.101。如果请求是http://web-server/example-page,它将发送192.168.0.101回路由器。
当 Dnsmasq 没有匹配的路由时,它会将 DNS 请求转发给 Google 的8.8.8.8,从而在公共互联网上启用解析。这确保您在使用自己的 DNS 时仍然可以访问更广泛的网络。
您无需在客户端设备上进行任何配置更改。路由器后面的所有东西最终都会通过 Dnsmasq 进行 DNS 查询。但是,值得注意的是,所有流行的桌面和移动操作系统都支持设置 DNS 服务器,因此您可以将单个设备配置为使用 Dnsmasq,而无需在路由器级别启用它。
入门我们假设你已经有一台可以运行的 Linux 机器准备好托管 Dnsmasq。Dnsmasq 并不是特别需要资源——如果你的客户端设备很少,它很容易在 Raspberry Pi 上运行。
您的主机应该分配有静态 IP。从这里开始,IP192.168.0.1指的是 Dnsmasq 服务器。
确保已安装 Dnsmasq:
Assuming a Debian system apt update apt install dnsmasq
Dnsmasq 的配置文件通常位于/etc/dnsmasq.conf. 这已预先填充了初始设置。Dnsmasq 需要进行一些更改才能在本地网络场景中有效工作。运行sudo nano /etc/dnsmasq.conf以打开文件,然后使用 Ctrl+W 键盘快捷键查找并取消注释以下行:
#domain-needed #bogus-priv
#从每行的开头删除字符。以下是这些设置启用的内容:
domain-needed– 这会阻止 Dnsmasq 将没有域部分的本地名称转发到上游 DNS 服务器。在我们的安装中,这意味着example.com将有资格通过 Google 进行解析,但example或web-server不会。它为您的本地网络保留无点名称。
bogus-priv– 防止将 DNS 反向查找查询转发到上游 DNS 服务器。这意味着内部 IP192.168.0.101永远不会暴露给 Google。不启用此功能可能会无意中将您的内部网络架构泄露给您的上游提供商。
#从每行的开头删除字符。以下是这些设置启用的内容:
domain-needed– 这会阻止 Dnsmasq 将没有域部分的本地名称转发到上游 DNS 服务器。在我们的安装中,这意味着example.com将有资格通过 Google 进行解析,但example或web-server不会。它为您的本地网络保留无点名称。
bogus-priv– 防止将 DNS 反向查找查询转发到上游 DNS 服务器。这意味着内部 IP192.168.0.101永远不会暴露给 Google。不启用此功能可能会无意中将您的内部网络架构泄露给您的上游提供商。
要设置上游 DNS 服务器,请在配置文件中添加新行:
server=8.8.8.8 server=4.4.4.4
这指示 Dnsmasq 将未解析的查询转发到8.8.8.8. 如果该服务器不可用,4.4.4.4将改为使用。这些地址是 Google DNS 服务的主要和次要解析器。
接下来调整缓存大小。这默认为 150 个缓存请求的相对较低的值。增加这将使 Dnsmasq 从缓存中提供更多查找服务,从而减少网络延迟。找到该cache-size行,取消注释并更改其值:
cache-size=1000
立即保存并关闭文件。
将主机名映射到 IP有几种不同的方法可以将主机名映射到其 IP 地址。最简单的方法是将条目添加到服务器的现有/etc/hosts文件中。Dnsmasq 自动从该文件加载规则作为其默认配置的一部分。
打开/etc/hosts并将您的路线添加到文件底部。首先是 IP 地址,然后是要分配的名称:
192.168.0.101 web-server 192.168.0.105 gateway.lan
这些行意味着任何请求都http://web-server将被定向到192.168.0.101而http://gateway.lan将在 结束192.168.0.5。完成设备映射后,保存并关闭文件。
测试您的服务器重新启动 Dnsmasq 以应用所有更改:
sudo service dnsmasq restart
检查服务器是否正常运行:
sudo service dnsmasq status
您应该看到active (running)显示为绿色。如果没有,请检查状态信息底部的日志行以找出问题所在。
现在您已准备好测试您的服务器。您可以使用该dig工具进行手动 DNS 查找尝试。您可能需要先安装dnsutils软件包。
dig google.com @localhost dig gateway.lan @localhost
这两个命令都应该在ANSWER SECTION. 在 的情况下gateway.lan,结果应192.168.0.5根据 中设置的路由规则/etc/hosts。@localhost命令的一部分指示dig查询您的本地 DNS 服务器。
配置您的网络最后一步是配置您的网络路由器以通过您的 Dnsmasq 服务器进行 DNS 查找。执行此操作的步骤将因您使用的路由设备而异。
找到正确的设置页面后,将服务器的 IP(192.168.0.1在本指南中)设置为路由器的主要 DNS 服务器。将公共 DNS 提供商(例如 Google 的8.8.8.8)配置为辅助服务器是个好主意。这可确保您在 DNS 服务器崩溃和离线时仍能访问互联网。
现在所有连接到路由器的设备都将通过您的 Dnsmasq 实例进行 DNS 查询。他们将能够通过分配的名称(例如web-server和 )访问您的设备gateway.lan,并受益于网络级 DNS 缓存。
结论DNS 是一个复杂的话题,但 Dnsmasq 使基本服务器的运行变得容易。还有很多更多的设置,你可以探索一旦你掌握了核心功能的工作。这些使您可以过滤查询、管理中继和代理、在事件发生时运行脚本以及设置其他类型的 DNS 记录,例如邮件服务器的 MX 结果。
Dnsmasq 一旦上线,通常不需要太多的人工干预。您可以使用service dnsmasq status或监视日志systemctl status dnsmasq。现在您已准备好从您的自托管 DNS 服务器中受益,最大限度地提高性能并让您使用内部域名来访问本地网络设备。



