查看缓存统计
现在我们已经通过网络管理器运行了 dnsmasq,我们想了解缓存命中的数量,以确定我们的缓存是否真的有帮助。
killall -s USR1 dnsmasq
这会将当前统计信息转储到 /var/log/messages 或者 /var/log/syslog 文件,具体取决于操作系统/配置。
然后我们可以在日志文件中搜索“dnsmasq”,如下所示。
[jack@onitroad ~]# grep dnsmasq /var/log/messages Jan 8 05:29:40 centos7 dnsmasq[32618]: time 1452230980 Jan 8 05:29:40 centos7 dnsmasq[32618]: cache size 5000, 0/62 cache insertions re-used unexpired cache entries. Jan 8 05:29:40 centos7 dnsmasq[32618]: queries forwarded 64, queries answered locally 148924680 Jan 8 05:29:40 centos7 dnsmasq[32618]: server 192.168.72.1#53: queries sent 64, retried or failed 0
在此示例中,本地 dnsmasq 缓存已回答了 148,924,680 个 DNS 查询,只有 64 个查询从外部发送到定义的名称服务器。
我对服务器不应该有任何理由访问的随机域名进行了dig,并确认外部转发的查询按预期增加了 1 到 65,表明统计数据正常工作。
启用 Dnsmasq
Dnsmasq 可以用于很多事情,在这个例子中我们只使用它的本地查询缓存功能。
请注意,上游名称服务器需要为 dnsmasq 启用递归查询才能正确缓存记录。
而不是直接启用服务和修改配置文件,这里我们将简单地为网络管理器启用插件。
请注意,这些测试在 CentOS 7 中已经安装了 dnsmasq 包,如果你没有这个包,现在通过 yum 安装它。
要在网络管理器中启用 dnsmask,我们需要编辑 /etc/NetworkManager/NetworkManager.conf 文件并在 [main] 部分下添加以下配置。
[main] dns=dnsmasq
为了应用此更改,我们接下来需要重新启动网络管理器,这可以使用以下命令完成,请注意这是区分大小写的。
systemctl restart NetworkManager
就是这样,我们现在可以通过检查 /etc/resolv.conf 文件来确认这是否按预期工作,该文件应该指定“nameserver 127.0.0.1”,这意味着 Linux 系统将向自身发送 DNS 请求。
果然,如果我们检查,本地主机现在应该在端口 53 上侦听 DNS 查询。
[jack@onitroad ~]# netstat -antup | grep dnsmasq tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 31618/dnsmasq udp 0 0 127.0.0.1:53 0.0.0.0:* 31618/dnsmasq
接下来,如果我们查看 /var/run/NetworkManager/dnsmasq.conf 文件,我们应该会看到最初在 /etc/resolv.conf 中指定的名称服务器的 IP 地址。
[jack@onitroad ~]# cat /var/run/NetworkManager/dnsmasq.conf server=192.168.1.1
所以所有 DNS 请求首先通过运行在 localhost 上的 dnsmasq 实例,如果响应不在缓存中,那么请求将被转发到定义的名称服务器,然后放入缓存中。
默认情况下,最近的 150 个 DNS 查询缓存在内存中。
缓存的大小可以通过创建 /etc/NetworkManager/dnsmasq.d/cache 来修改,如下所示。
[jack@onitroad ~]# cat /etc/NetworkManager/dnsmasq.d/cache cache-size=5000
此配置允许一次将多达 5000 个条目存储在缓存中,要使更改生效,需要再次重新启动 NetworkManager 服务。
应根据记录上定义的 TTL 缓存条目。
在 /etc/NetworkManager/dnsmasq.d/ 目录中的文件中还可以定义许多其他值,要查看这些值,请运行以下命令打开手册页。
man 8 dnsmasq
在许多基于 Linux 的发行版中,似乎没有像 Windows 那样在客户端默认执行任何本地 DNS 查询缓存。
这意味着如果系统上的进程不断需要连接到某个域名,它将针对定义为每次检索 IP 的解析器执行 DNS 查找。
在这个特定的示例实例中,有一个进程平均每天对名称服务器执行 30,000,000 个 DNS 请求,我们将通过在执行过多 DNS 查询的服务器上配置本地 DNS 缓存来显着减少这种情况。
目前这个 Linux 服务器正在执行如此多的 DNS 查询,以至于名称服务器上的 DNS 查询日志在 10 分钟内达到了默认的 20,000 条消息 rsyslog 速率限制(请参阅此处更改 rsyslog 限制)不到一分钟,导致日志被丢弃并且没有记录。
我没有增加日志记录的速率限制并使用更多系统资源,而是检查了实际记录的查询,并且几乎所有查询都一遍又一遍地针对相同的域。
这意味着在此处实施本地 DNS 查询缓存应该是有效的。