如何在Linux上设置本地DNS缓存服务器?

DNS查询通常不是您需要担心的事情。但有时候你需要!

如果您的家庭或办公室的ISP的域名服务器很慢,或者您的服务器正在执行大量的查询,那么您需要一个本地缓存DNS服务器。

缓存DNS服务器将如何帮助我?

一个缓存服务器通过执行系统发出的所有DNS查询,然后将结果保存或缓存到内存中来工作。一旦结果缓存在内存中,任何时候您对一个域名进行重复请求,结果都将几乎即刻从内存中提供。

这可能看起来不太重要,但如果您的ISP的DNS服务器在响应时花费了很长时间,那么您的互联网浏览速度将会明显变慢。例如,美国新闻频道MSNBC的主页需要联系超过100个唯一的域名才能正确加载。如果您的ISP的域名服务器响应的时间比正常时间长了1/10秒,那么页面加载所需的时间将会延长10秒。

一个本地缓存DNS服务器不仅能帮助您的家庭或办公室,也能帮助您的服务器。如果您有一个执行大量DNS查询的应用程序,例如运行反垃圾邮件软件的繁忙电子邮件服务器,它将受益于本地缓存DNS服务器的速度提升。

最后,systemd-resolved支持最新的安全DNS标准DNSSEC和DNSoverTLS或DoT。这有助于保护您的安全和在线隐私。

我们将使用哪个本地缓存DNS服务器?

在本指南中,我们将启用和配置的本地缓存DNS服务器是systemd-resolved。该工具是systemd系统管理工具套件的一部分。如果您的系统使用systemd(几乎所有主要Linux发行版都使用systemd),那么您已经安装了systemd-resolved,但尚未运行。尽管systemd-resolved已经存在,但大多数发行版并不使用它。

systemd-resolved通过运行一个小型的本地缓存DNS服务器来工作,我们将配置它在启动时自动启动。然后,我们将重新配置系统的其余部分,将它们的DNS查询重定向到本地缓存的systemd-resolved DNS。

如何检查您是否已经在使用systemd-resolved?

一些Linux发行版默认已经使用systemd-resolved,如Ubuntu 19.04。

如果您已经运行systemd-resolved,则不需要启用它或配置您的系统来使用它。但是,您可能需要确保像NetworkManager这样的网络管理工具已正确配置,因为它们可能会忽略系统网络配置。

在继续下一节之前,运行以下命令检查您是否已经运行systemd-resolved:

$ resolvectl status

如果您收到以下消息:

$ resolvectl status
Failed to get global data: Unit dbus-org.freedesktop.resolve1.service not found.

没有运行systemd-resolved,应该继续下一节。相反,如果您看到以以下内容开始的输出:

Global
       LLMNR setting: yes
MulticastDNS setting: yes
  DNSOverTLS setting: opportunistic
      DNSSEC setting: allow-downgrade
    DNSSEC supported: no
  Current DNS Server: 1.1.1.1
         DNS Servers: 1.1.1.1
                      1.0.0.1

那么您已经在运行systemd-resolved,无需启用它。

启用和配置systemd-resolved

我们不需要安装systemd-resolved,因为它已经是systemd的一部分。我们需要做的就是启动它以运行DNS缓存服务器,然后启用它以在启动时自动启动。

以非root用户的sudo权限,从shell提示符运行以下命令启动systemd-resolved:

$ sudo systemctl start systemd-resolved.service

接下来,运行以下命令以在系统启动时启动systemd-resolved:

$ sudo systemctl enable systemd-resolved.service

剩下的配置项是设置systemd-resolved将用于解析域名的DNS服务器。这里有很多选项,但以下任一对都是免费、快速且支持DNSSEC和DoT的:

Google Public DNS

  • 8.8.8.8
  • 8.8.4.4

Cloudflare Public DNS

  • 1.1.1.1
  • 1.0.0.1

使用您喜欢的文本编辑器打开主要的systemd-resolved配置文件,这里我使用了nano:

$ sudo nano /etc/systemd/resolved.conf

编辑以下行:

#DNS=

将一对IP地址列出。这里显示了Cloudflare的DNS服务器:

DNS=1.1.1.1 1.0.0.1

保存并退出文本编辑器。现在我们需要重新启动systemd-resolved,以便它开始使用这些名称服务器:

$ sudo systemctl restart systemd-resolved.service

systemd-resolved现在正在运行,并准备好在配置系统以开始使用它后加速和安全地进行DNS查询。

配置系统以使用systemd-resolved

系统可以通过几种方式配置为使用systemd-resolved,但我们将介绍两种涵盖了大多数用例的配置。第一种是推荐的配置,第二种是兼容性配置。二者的区别在于如何管理/etc/resolv.conf文件。

/etc/resolv.conf文件保存了系统上的程序应查询的名称服务器的IP地址。需要进行DNS查询的程序将参考此文件,以了解它们应该联系哪些服务器进行这些查询。

systemd-resolved的两种模式围绕着如何管理此文件的内容。在推荐模式下,将/etc/resolv.conf作为符号链接到/run/systemd/resolve/stub-resolv.conf。此文件由systemd-resolved管理,因此systemd-resolved管理系统上所有其他程序的DNS配置信息。

当其他程序尝试管理/etc/resolv.conf的内容时,可能会出现问题。兼容性模式保留/etc/resolv.conf,允许其他程序对其进行管理,而systemd-resolved使用该DNS信息。在此模式下,负责管理/etc/resolv.conf的其他程序必须配置为在/etc/resolv.conf中设置127.0.0.53作为系统名称服务器。

配置推荐模式

当我们配置此模式时,systemd-resolved将通过将/etc/resolv.conf作为符号链接到/run/systemd/resolve/stub-resolv.conf来管理/etc/resolv.conf。我们需要手动完成此操作,因为它不会自动配置。

首先,删除或重命名现有的/etc/resolv.conf文件。重命名是一个更好的选择,因为它将产生相同的效果,但您可以始终参考原始文件,以获取其中包含的信息。这里,我们使用mv命令将/etc/resolv.conf重命名:

$ sudo mv /etc/resolv.conf /etc/resolv.conf.original

接下来,创建符号链接:

$ sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

最后,重新启动systemd-resolved:

$ sudo systemctl restart systemd-resolved.service

配置兼容性模式

在此模式下,您需要确保systemd-resolved启动的本地名称服务器由系统服务查询。使用文本编辑器打开/etc/resolv.conf,这里使用了nano编辑器:

$ sudo nano /etc/resolv.conf

删除任何以“nameserver”开头的行,并添加以下行:

nameserver 127.0.0.53

这个编辑可能会被管理/etc/resolv.conf的其他程序修改。如果是这种情况,您需要配置这些程序使用此nameserver来使编辑生效。

调试systemd-resolved

在进行这些更改后,确切地了解您的系统在进行DNS查询时的情况可能比较困难。观察发生的情况最有效的方法是将systemd-resolved设置为调试模式并监视日志文件。

systemd-resolved是一个systemd服务,这意味着可以通过创建包含调试设置的附加服务文件来轻松将其置于调试模式。以下命令将在正确的位置创建正确的文件:

$ sudo systemctl edit systemd-resolved.service

将以下行粘贴到编辑器中,然后保存并退出:

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

成功保存并退出后,systemd-resolved服务将自动重新加载。

在同一台服务器上打开第二个终端,并跟踪systemd-resolved服务的journald日志:

$ sudo journalctl -f -u systemd-resolved

以“Using DNS server”开头的行,例如:

Using DNS server 1.1.1.1 for transaction 19995.

告诉您正在使用哪个DNS服务器进行DNS查询。在本例中,查询了Cloudflare DNS服务器1.1.1.1。

以“Cache miss”开头的行表示该域名尚未缓存。例如:

Cache miss for example.com IN SOA

以“Positive cache hit”开头的行,例如:

Positive cache hit for example.com IN A

表示systemd-resolved之前已经查询过这个域名,并且答案已从本地内存中的缓存中提供。

完成systemd-resolved的工作后,应禁用调试模式,因为它会在繁忙的系统上生成非常大的日志文件。可以通过运行以下命令禁用调试日志记录:

$ sudo systemctl edit systemd-resolved.service

然后删除您添加的两行,保存并退出编辑器。

使用安全的DNS查询

systemd-resolved是目前为数不多支持DNSSEC和DNSoverTLS的DNS服务器之一。这两者都有助于确保您收到的是真实的DNS信息(DNSSEC),并且在通过互联网传输时无人能够窃听(DoT)。

通过用文本编辑器打开systemd-resolved的主配置文件,很容易启用这些选项:

$ sudo nano /etc/systemd/resolved.conf

然后编辑文件,将以下两行设置为:

DNSSEC=allow-downgrade
DNSOverTLS=opportunistic

保存并退出编辑器,然后重新加载systemd-resolved:

$ sudo systemctl restart systemd-resolved.service

只要您设置的DNS服务器支持DNSSEC和DoT,您的DNS查询将受到保护。谷歌和Cloudflare的公共DNS服务器都支持这些协议。

结论

您的系统现在已经配置为在ISP的DNS服务器无法及时响应时快速高效地进行DNS查询。此外,由于使用了最新的安全DNS协议来保护DNS查询,您的数字生活更加安全。

如果你是Linux爱好者并且想要学习更多知识,那么请查看这个

类似文章