利用 DNSmasq 提升 Linux 系统 DNS 缓存性能
DNSmasq 是一款强大的工具,可以为 Linux 系统提供 DNS 请求缓存服务。虽然配置过程可能略具挑战,但它带来的好处是显而易见的。
DNS 缓存的主要作用在于加速 DNS 查询过程,将网站域名转换为对应的 IP 地址。当网络中的多个用户频繁访问相同网站时,本地 DNS 缓存服务器能够显著减少网页加载时间,提高用户体验。
首先,让我们深入了解一下 DNS 缓存的原理。
DNS 缓存是什么?
互联网依赖 DNS(域名系统)来管理所有公开可访问的在线站点及其相应的 IP 地址。 这类似于一个电话簿,让我们可以通过域名来访问网站,而无需记住复杂的 IP 地址。 这对于互联网基础设施与网站之间的交互至关重要。
每当您在搜索引擎中请求一个网页时,幕后都会发生 DNS 解析过程。
虽然您的系统可以访问大量的外部 DNS 服务器,但拥有一个本地 DNS 缓存副本可以大大加快传输和解析速度,这就是 DNS 缓存发挥作用的地方。
在将请求发送到互联网之前,DNS 缓存会处理最近和频繁访问的域的地址解析,从而进一步缩短解析时间。
每次需要将 IP 地址解析为域名时,都会访问 DNS 服务器。这会对 DNS 服务器造成额外的负担,尤其是在网站同时接收大量请求的情况下。
通过使用 DNS 缓存来减少 DNS 请求和响应时间。已解析的 IP 地址和主机信息会被保存在本地。下次需要解析 IP 或域名时,系统会直接从 DNS 缓存中检索结果,而无需启动新的 DNS 查询。
DNS 缓存如何解决 Amazon EC2 实例的 DNS 间歇性解析问题?
大多数 Linux 系统默认情况下不启用本地 DNS 缓存。这意味着所有 DNS 请求都会直接发送到 Amazon 提供的权威 DNS 解析器,而这些解析器对可以处理的请求数量有限制。当请求量过大时,就会出现 DNS 解析问题。
在系统中部署本地 DNS 缓存有助于降低 CPU 和网络使用率,同时防止 DNS 解析错误。本地 DNS 缓存可以响应对外部 DNS 资源(例如 Amazon RDS 和 S3)的查询。
连接到 Amazon VPC 的 Amazon EC2 实例在启动过程中使用 DHCP 协议来请求 DNS 服务器地址。
当您使用 Amazon VPC 构建虚拟私有云时,Route 53 DNS 解析器会利用 VPC 上的解析器来响应在本地 Amazon VPC Web 地址和私有管理区域中运行的 EC2 实例的 DNS 请求。Resolver 会在公共 DNS 服务器上查找所有其他网址。
DNS 缓存充当先前 DNS 查询的临时记录。当系统尝试访问在线网站时,可以快速检查这些记录。它会维护每个现有和后续会话的日志。这种 DNS 缓存机制可以简化域解析,防止 Amazon EC2 Linux 实例出错。
许多用户在访问 AWS 时倾向于使用 Amazon 的 Route 53 服务作为 DNS。它易于使用且价格合理。然而,有多种因素可能会影响用户选择本地 DNS 服务器。
虽然 bind9 仍然是设置本地 DNS 缓存服务器的一个不错的选择,但 dnsmasq 在 EC2 实例和本地计算机上的安装和配置过程要简单得多。
什么是 dnsmasq?
DNSmasq 是一款轻量级的 Linux 工具,支持 DNS、DHCP、TFTP 和 DNS 缓存。 它结构紧凑、占用资源少,非常适合资源受限的网络和防火墙环境。
安装和配置过程非常简单。 对于需要为子网配置 DNS 和 DHCP 的场景,dnsmasq 是一种灵活且实用的解决方案。
可以为每个服务器或底层控制器配置 DHCP 分配的标识符和相关说明。 dnsmasq 同时支持动态和静态 DHCP 选项。它具有高度的可移植性,能够为至少 1,000 个客户端管理 DNS 和 DHCP 服务。
当收到 DNS 查询时,dnsmasq 可以直接从本地缓存响应,或者将查询转发到权威 DNS 服务器。除了响应带有 DHCP 配置的地址的 DNS 请求外,它还会检查 `/etc/hosts` 文件中的内容,以识别公共 DNS 中未列出的本地主机名。
使用 dnsmasq 工具替代浏览器内置的 DNS 缓存,可以显著提高互联网浏览性能。它非常适合资源受限的集成环境,因为设置简单,且只需要很少的磁盘空间。
dnsmasq 的特性
- 使用 dnsmasq 集成内部 DNS 服务器非常简单,只需配置它将特定域名的解析查询转发到指定的权威服务器即可。
- 使用配置的本地 DNS 服务器可以减少服务器负载,提高系统可靠性。
- 启用防火墙的端点的 DNS 配置非常简单,并且独立于 ISP 使用的 DNS。
- 如果在计算机上执行 DNS 检查时无法访问连接到互联网的端口,查找操作会立即暂停,避免长时间等待。
- 通过 PPP(点对点协议)或 DHCP 查询,dnsmasq 可以配置为直接从底层域解析服务器定期收集数据。
安装
在安装和配置 dnsmasq 之前,需要禁用 systemd-resolved 服务。
systemctl stop systemd-resolved
您也可以使用 mask 命令禁用它,防止它在系统重启后自动启动。
systemctl mask systemd-resolved
禁用 systemd-resolved 服务后,接下来需要安装 dnsmasq。 几乎所有的 Linux 发行版都预装了 DNSmasq。如果没有预装,您可以手动安装。 打开终端并输入以下命令执行安装。
sudo apt-get install dnsmasq
如果您使用的是 yum 包管理器,请使用以下命令:
sudo yum install -y dnsmasq
此命令会自动安装该工具并在后台启动 dnsmasq。
安装成功后,您可以使用以下命令检查 dnsmasq 的状态。
systemctl status dnsmasq
如果状态显示为 “active (running)”,则表示安装成功,dnsmasq 已经配置并监听 53 端口。如果状态显示为 “inactive (dead)”,则需要重启 Ubuntu 系统和 dnsmasq 服务, 这通常可以解决问题。
配置
现在,dnsmasq 已经准备好在您的计算机上用作本地缓存 DNS 服务器。 默认配置文件位于 `/etc/dnsmasq.conf`。为了在系统中正确设置 dnsmasq,需要修改此配置文件。
使用以下命令打开并编辑配置文件:
nano /etc/dnsmasq.conf
配置文件只能使用 root 权限进行编辑。 清除文件中的所有内容(包括注释),然后复制粘贴并保存以下配置设置。
port=53 domain-needed bogus-priv listen-address=127.0.0.1 expand-hosts domain=geek-demo.com cache-size=1000
下面简要介绍一下每个参数的含义:
- `port` – 指定 dnsmasq 用于接收 DNS 请求的端口。
- `domain-needed` – 只向上游 DNS 服务器传输域名。
- `bogus-priv` – 防止域名和端口转发。
- `listen-address` – 定义名称服务器地址。通常,localhost (127.0.0.1) 用作设置本地 DNS 服务器的默认设置。
- `domain` – 配置 dnsmasq 附加到短标识符的域名。
- `cache-size` – 存储中允许的最大 DNS 缓存大小。
完成所有必要的更改后,保存并关闭配置文件。 下一步是编辑 `/etc/resolv.conf` 文件,添加本地主机解析地址。 使用 nano 编辑器打开它:
nano /etc/resolv.conf
在此文件中,您可以找到系统用于地址解析的所有名称服务器。 在列表的第一行添加环回地址,即 “nameserver 127.0.0.1”。
保存并退出配置文件。 为了使更新的设置生效,请重新启动 dnsmasq 服务:
systemctl restart dnsmasq
测试本地 DNS 缓存服务器
测试本地 DNS 服务器非常简单。打开命令行并使用 dig 命令检查 DNS 缓存。 第一次运行 dig 命令时,结果应该较为普通。
┌──(root💀kali)-[/home/writer] └─# dig techblik.com.com 1 ⚙ ; <<>> DiG 9.18.0-2-Debian <<>> techblik.com.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 623 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;techblik.com.com. IN A ;; ANSWER SECTION: techblik.com.com. 227 IN A 172.66.43.163 techblik.com.com. 227 IN A 172.66.40.93 ;; Query time: 31 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP) ;; WHEN: Sat Oct 15 07:52:49 EDT 2022 ;; MSG SIZE rcvd: 74
这里需要注意的是,从上游名称服务器查询详细信息需要大约 31 毫秒。再次执行相同的 dig 命令,您会发现查询时间显著减少。
┌──(root💀kali)-[/home/writer] └─# dig techblik.com.com 1 ⚙ ; <<>> DiG 9.18.0-2-Debian <<>> techblik.com.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21942 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;techblik.com.com. IN A ;; ANSWER SECTION: techblik.com.com. 281 IN A 172.66.40.93 techblik.com.com. 281 IN A 172.66.43.163 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP) ;; WHEN: Sat Oct 15 07:58:10 EDT 2022 ;; MSG SIZE rcvd: 74
这里,查询时间为 0 毫秒。这是因为在执行初始搜索后,dnsmasq 已经存储了数据,后续查询都直接使用了缓存,因此速度极快。如果要清除存储的 DNS 缓存,您需要重新启动 dnsmasq 服务。
总结
在本文中,我们学习了如何设置和配置 dnsmasq 作为本地 DNS 服务器。 如果您希望进一步提高浏览速度,您可能还会对如何在不同操作系统中更改 DNS 服务器感兴趣。