DNS 解析用于查找域名并将其解析为 IP 地址。
我们可以在我们的网络中配置一个 DNS 缓存服务器,并让其他系统指向它进行 DNS 解析,这将提高效率,而不是让我们网络中的各种系统直接向 Internet 查询。
通过缓存服务器发送查询的系统越多,缓存就会越大,从而进一步提高命中率。
DNS 记录的本地缓存存储在更靠近发起请求的系统的位置,从而缩短解析时间。
这些记录将被缓存,直到它们的 TTL 到期,或者缓存被刷新。
如果任何其他系统对驻留在缓存中的查询执行 DNS 查找,它可以更快地返回,因为缓存服务器不必将查询转发到 Internet 上的某个其他 DNS 服务器。
有许多包能够充当 DNS 缓存,例如 Bind、Dnsmasq 和 Unbound。
在我们的示例中,我们将使用 Unbound。
安装Unbound
Unbound 包可以通过 yum 安装,如下所示。
yum install unbound -y
安装完成后,启用该服务使其在启动时启动,然后如图所示立即启动该服务。
[jack@onitroad ~]# systemctl enable unbound ln -s '/usr/lib/systemd/system/unbound.service' '/etc/systemd/system/multi-user.target.wants/unbound.service' [jack@onitroad ~]# systemctl start unbound
默认情况下,Unbound 只会监听 localhost 上的请求,也就是它本身。
下面在 netstat 命令的帮助下演示了这一点。
如我们所见,unbound 正在 localhost 上侦听 TCP 和 UDP 端口 53 上的 IPv4 和 IPv6.
[jack@onitroad ~]# netstat -antpu | grep unbound tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 21026/unbound tcp6 0 0 ::1:53 :::* LISTEN 21026/unbound udp 0 0 127.0.0.1:53 0.0.0.0:* 21026/unbound udp6 0 0 ::1:53 :::* 21026/unbound
这对我们来说不是很有用,因为远程主机将无法查询缓存服务器的 DNS 记录。
要更改此行为,请使用我们喜欢的文本编辑器编辑 /etc/unbound/unbound.conf 文件并添加以下条目,该条目将配置 Unbound 以侦听所有可用的网络接口。
该文件记录得很好,将能够提供更多信息。
interface: 0.0.0.0
默认情况下,Unbound 还将拒绝来自任何客户端的所有递归查询,除非我们明确允许 IP 地址或者 IP 地址范围,为此在 /etc/unbound/unbound.conf 文件中添加一个 ACL 条目,如图所示。
access-control: 192.168.0.0/24 allow
这将允许 192.168.0.0/24 网络中的远程主机对该服务器进行递归查询,请在此处指定 IP 地址范围。
接下来,我们需要创建一个转发区域,该区域将指定要将查询发送到的外部 DNS 服务器,在本例中,我们将向 Google 公共 DNS 解析器 8.8.8.8 发送查询。
再次在 /etc/unbound/unbound.conf 文件中创建转发区域,如图所示。
forward-zone: name: "." forward-addr: 8.8.8.8
通过指定“.”对于我们所说的转发所有查询的名称,可以将其更改为特定域名以仅将对该特定域的查询转发到地址集。
保存所做的所有这些更改,然后重新启动未绑定的服务以应用它们。
systemctl restart unbound
此时,我们可以选择再次运行 netstat 以确认 Unbound 正确侦听 0.0.0.0:53 而不是 localhost。
最后,为了允许来自远程主机的 DNS 查询,必须修改防火墙以允许 DNS 查询通过,这可以使用以下命令在 firewalld 中设置。
[jack@onitroad ~]# firewall-cmd --permanent --add-service=dns success [jack@onitroad ~]# firewall-cmd --reload success
Unbound 现在配置为接受来自 192.168.0.0/24 范围内主机的递归查询,它将递归查询发送到 8.8.8.8 并保留结果的本地缓存。
默认情况下,这些缓存记录将在 TTL 到期时被删除,但是我们可以通过简单地重新加载或者重新启动服务来手动清除缓存。
我们也可以使用 unbound-control 命令删除特定名称或者区域类型。
例如,要查看缓存的所有内容,我们可以使用“unbound-control dump_cache”,它将所有缓存的记录查询打印到标准输出。
这些结果可以导出到文件中,这样如果缓存被刷新,文件可以导入并且缓存将继续存在,这在下面演示。
[jack@onitroad ~]# unbound-control dump_cache > backup [jack@onitroad ~]# wc -l backup 48 backup [jack@onitroad ~]# systemctl restart unbound [jack@onitroad ~]# unbound-control dump_cache START_RRSET_CACHE END_RRSET_CACHE START_MSG_CACHE END_MSG_CACHE EOF [jack@onitroad ~]# unbound-control load_cache < backup ok
在上面的示例中,我们将缓存的内容转储到一个名为“backup”的文件中,该文件仅通过查找“google.com”就显示包含 48 行内容,因此为简洁起见,我没有包含完整的 48 行.然后重新启动 Unbound 服务并确认缓存为空,然后从成功的备份文件加载缓存。
再次运行 'unbound-control dump_cache' 后,它再次输出 48 行结果。