Linux中的DNS缓存
1. 概述
我们每天都知道和使用的互联网的基本基础是两个或多个网络设备通过 IP 地址命名空间进行有效和可靠的通信。我们记得名字比数字容易得多,因此创建了域名系统(DNS),它允许我们通过 blogdemo.com等名称访问互联网地址。
在本教程中,我们将进一步了解 DNS,尤其是通过本地和可安装的 DNS 缓存工具在 Linux 中进行 DNS 缓存。
2. 什么是DNS缓存?
DNS 缓存就像**最近 DNS 查找的临时数据库,**当我们的计算机试图弄清楚如何在 Internet 上加载网站时,它可以快速引用它。它存储最近和尝试访问的所有记录。
每当我们尝试在我们的计算机上加载网站时,我们的网络浏览器都会向我们的路由器请求我们输入的网站的适当 IP 地址。所有路由器都有一个 DNS 服务器地址存储,它将主机名转换为适当的 IP 地址,以便可以加载网站。
DNS 缓存很有用,因为它会在最近访问的网站被发送到 Internet 之前拦截它们的主机名请求,并将它们引用到其本地数据库。这显着减少了加载已访问网站所需的时间,因为它们各自的 IP 地址已经被缓存。
3. 使用systemd-resolved 进行 DNS 缓存
systemd-resolved 是一个本地可用的工具,它是*systemd *系统管理工具套件的一部分。systemd在几乎所有主要的 Linux 发行版中都很容易获得。
大多数 Linux 发行版都安装了systemd-resolved,但它通常不活动。
让我们使用systemd-resolved创建并运行一个小型本地缓存 DNS 服务器,我们将设置它在启动时启动。此外,我们将设置系统的其余部分以将其 DNS 查询重定向到我们创建的缓存服务器。
3.1. 检查systemd-resolved是否已经在运行
默认情况下,Ubuntu 19.04 等 Linux 发行版已运行systemd-resolved。
让我们检查它是否在我们的系统上运行:
$ sudo resolvectl status
如果它已经在运行,我们应该在控制台输出中看到确认:
Global
LLMNR setting: no
MulticastDNS setting: yes
DNSOverTLS setting: opportunistic
DNSSEC setting: allow-downgrade
如果我们收到一条失败的消息,那么我们需要启用和配置systemd-resolved。
3.2. 如何启用systemd-resolved
让我们启动systemd-resolved服务:
$ sudo systemctl start systemd-resolved.service
我们还可以确保systemd-resolved在系统启动时运行:
$ sudo systemctl enable systemd-resolved.service
3.3. 配置
要配置systemd-resolved将查询以解析域的 DNS 服务器,我们需要编辑systemd-resolved配置文件并包含必要的公共或私有 DNS 地址对。
在本文中,我们将使用Google 的公共 DNS 地址对——它是免费的,并且支持 DoT 和 DNSSEC:
- 8.8.8.8
- 8.8.4.4
让我们打开主要的systemd-resolved配置文件并添加 Google 的公共 DNS 对:
$ sudo nano /etc/systemd/resolved.conf
DNS=8.8.8.8 8.8.4.4
我们现在可以保存并退出编辑器。
最后,我们需要重新启动systemd-resolved服务以开始使用我们输入的名称服务器。
通过创建指向*“/run/systemd/resolve/stub-resolv.conf”的符号链接来配置systemd-resolved来管理“/etc/resolv.conf”文件对我们来说是一个很好的做法。为此,我们需要删除或重命名当前的“/etc/resolv.conf”文件,创建符号链接,然后重新启动systemd-resolved*服务:
$ sudo mv /etc/resolv.conf /etc/resolv.conf.original
$ sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
$ sudo systemctl restart systemd-resolved.service
4. 使用 BIND 9 进行 DNS 缓存
Berkely Internet Name Domain (BIND 9) 是一个功能强大的名称服务器程序,我们可以使用它来设置本地 DNS。它是最流行和广泛使用的名称服务器程序之一。
4.1. 安装
在安装bind9之前,让我们首先更新我们的系统包存储库。如果使用apt,我们将运行:
$ sudo apt update
$ sudo apt install bind9 bind9utils -y
或者,如果我们使用*yum *,我们可以运行:
$ sudo yum update
$ sudo yum install bind9 bind9utils -y
这将安装bind9及其实用程序。 安装后,我们可以使用几个命令来启动、启用、停止和重新加载bind9服务,使用其命名的 systemd单元文件:
$ sudo systemctl start --now named
$ sudo systemctl enable --now named
$ sudo systemctl stop --now named
$ sudo systemctl restart --now named
4.2. 测试
让我们使用dig 来测量第一次和后续加载域所需的时间:
$ dig +noall +stats google.com
;; Query time: 23 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Jan 01 11:19:05 EST 2022
;; MSG SIZE rcvd: 56
请注意,我们使用上面的*+noall和+stats*选项使输出更具可读性。
我们上面的查找总共花费了 23 毫秒。然后我们可以重新运行上面的命令,我们应该期望得到这个输出:
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Jan 01 11:20:01 EST 2022
;; MSG SIZE rcvd: 56
这次查询时间用了 0 毫秒,因为在我们初次访问时, bind9已经缓存了 google 的网站。
4.3. 配置
默认配置文件为:
- /etc/bind – 默认的bind9配置文件路径
- /var/cache/bind – named的工作目录,其中包含由它生成的临时文件
- /etc/bind/named.conf – bind9的主要配置文件
- /var/log/syslog – bind9的默认日志文件
每当我们对配置文件进行更改时,我们都需要重新启动bind9服务以使更改生效。
5. 使用dnsmasq 进行 DNS 缓存
dnsmasq 是一个提供 DNS 缓存功能的 Linux 实用程序。它的设计轻巧且占用空间小,适用于资源受限的路由器。它在大多数 Linux 发行版中都可用,并且可以通过包管理器 。
5.1. 安装
让我们输入以下命令来安装dnsmasq:
$ sudo apt-get install dnsmasq
对于yum 用户,让我们使用以下命令:
$ sudo yum install dnsmasq
安装后,我们可以使用以下命令来启动和启用dnsmasq:
$ sudo systemctl start dnsmasq
$ sudo systemctl enable dnsmasq
5.2. 测试
让我们用dig来测试一下dnsmasq是否正常工作,以及在查询已经访问过的网站时节省了多少时间:
$ dig +noall +stats google.com
;; Query time: 27 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Jan 01 10:24:05 EST 2022
;; MSG SIZE rcvd: 56
我们上面的查找总共花费了 27 毫秒。当我们重新运行命令时,我们应该期望得到以下输出:
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Jan 01 10:24:05 EST 2022
;; MSG SIZE rcvd: 56
这次查询时间用了 0 毫秒,因为dnsmasq在我们初次访问时已经缓存了 google 的网站。
我们还可以通过重新启动它来清除dnsmasq缓存:
$ sudo systemctl restart dnsmasq
5.3. 配置
我们可以在*“/etc/dnsmasq.conf”目录下找到dnsmasq配置文件。该文件包含许多配置,我们可以根据需要更改这些配置以使dnsmasq*工作。
每当我们编辑配置文件时,我们都需要重新启动dnsmasq服务以使我们所做的更改生效。