缓存DNS服务器的工作方式是执行系统进行的所有DNS查询, 然后将结果保存或缓存到内存中。每当你对域重复请求时, 一旦将结果缓存在内存中, 结果几乎就会立即从内存中提供。
这似乎不太重要, 但是如果你的ISP的DNS服务器花时间进行响应, 则会大大降低你的Internet浏览速度。例如, 美国新闻频道MSNBC的主页需要联系100多个唯一的域名才能正确加载。如果你的ISP的名称服务器比正常时间花了十分之一秒的时间, 则表示该页面将需要10秒的时间才能完成加载。
本地缓存DNS服务器不仅可以在你的家庭或办公室中使用, 还可以在你的服务器上使用。如果你有一个进行大量DNS查找的应用程序, 例如, 运行反垃圾邮件软件的繁忙电子邮件服务器, 它将从本地缓存DNS服务器获得速度的提升。
最后, systemd-resolved
支持最新的安全DNS标准DNSSEC和DNSoverTLS或DoT。这些帮助确保你的安全并在线保留隐私。
我将在本指南中启用和配置的本地缓存DNS服务器是systemd-resolved
的。该工具是系统管理工具系统化套件的一部分。如果你的系统使用的是systemd, 并且几乎所有主要的Linux发行版都在使用, 则你已经安装了systemd-resolved
, 但没有运行。即使存在, 大多数发行版也不使用systemd-resolved
。
通过运行小型本地缓存DNS服务器(我们将其配置为在启动时启动), 可以解决systemd-resolved问题。然后, 我们将重新配置系统的其余部分, 以将其DNS查询定向到本地缓存systemd解析的DNS。
某些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的一部分。我们需要做的就是启动它以使DNS缓存服务器运行, 然后启用它以在引导时启动它。
以sudo的身份从shell提示符运行以下命令, 以使非root用户启动systemd-resolved
:
$ sudo systemctl start systemd-resolved.service
接下来, 运行以下命令以在系统启动时启动systemd-resolved
:
$ sudo systemctl enable systemd-resolved.service
剩下的最后一项配置是设置systemd-resolved
将查询到已解析域的DNS服务器。这里有很多选项, 但是以下任一对都是免费, 快速的, 并且它们都支持DNSSEC和DoT:
Google公共DNS
8.8.8.8
8.8.4.4
Cloudflare公共DNS
1.1.1.1
1.0.0.1
使用你喜欢的文本编辑器打开系统解析的主配置文件, 这里我使用了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
, 但我们将研究覆盖大多数用例的两种配置。第一个是推荐配置, 第二个是兼容性配置。两者之间的区别在于如何管理/etc/resolv.conf
文件。
/etc/resolv.conf
文件包含系统上的程序应查询的名称服务器的IP地址。需要进行DNS查询的程序将查询该文件, 以查找进行查询的服务器。
systemd解析的两种模式集中在如何管理此文件的内容上。在推荐模式下, 将/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
的其他程序配置为将127.0.0.53设置为/etc/resolv.conf
中的系统名称服务器。
当我们配置此模式时, systemd-resolved将通过使其与/run/systemd/resolve/stub-resolv.con
f的符号链接来管理/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
的任何其他程序都可能会更改此编辑。在这种情况下, 你将需要配置这些程序以使用此名称服务器来使编辑永久化。
进行这些更改后, 很难准确地发现系统如何进行DNS查询。观察正在发生的事情的最有效方法是将systemd-resolved
放入调试模式并查看日志文件。
systemd-resolved
是systemd服务, 这意味着可以通过创建包含调试设置的嵌入式服务文件来轻松地将其置于调试模式。以下命令将在正确的位置创建正确的文件:
$ sudo systemctl edit systemd-resolved.service
将以下行粘贴到编辑器中, 然后保存并退出:
[Service]
Environment=SYSTEMD_LOG_LEVEL=debug
成功保存并退出后, systemd解析的服务将自动重新加载。
打开同一台服务器的第二个终端, 并遵循systemd解析的服务的日志日志:
$ sudo journalctl -f -u systemd-resolved
以”使用DNS服务器”开头的一行, 例如:
Using DNS server 1.1.1.1 for transaction 19995.
准确告诉你正在使用哪个DNS服务器进行DNS查询。在这种情况下, 将查询位于1.1.1.1的Cloudflare DNS服务器。
出现”高速缓存未命中”的行表示该域名尚未被高速缓存。例如。:
Cache miss for example.com IN SOA
以”正面缓存命中”开头的行, 例如:
Positive cache hit for example.com IN A
表示systemd-resolved之前已查询此域, 并且已从本地内存中的缓存提供了答案。
完成systemd-resolved的工作后, 应禁用调试模式, 因为它将在繁忙的系统上创建非常大的日志文件。你可以通过运行以下命令禁用调试日志记录:
$ sudo systemctl edit systemd-resolved.service
并删除这两行, 然后添加, 然后保存并退出编辑器。
systemd-resolved是少数同时支持DNSSEC和DNSoverTLS的DNS服务器之一。这两项都有助于确保你接收的是真实的DNS信息(DNSSEC), 并且确保没有人可以在DNS流量通过Internet时对其进行监听。 (点)。
通过使用文本编辑器打开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查询就会受到保护。 Google和Cloudflare公共DNS服务器都支持这些协议。
现在, 系统已配置为即使ISP的DNS服务器未如预期那样快速响应, 也可以快速有效地进行DNS查询。此外, 由于使用最新的安全DNS协议来保护DNS查询, 因此数字生活可以更加安全。