在Ubuntu 20.04上使用BIND9设置本地DNS解析器
本教程将向您展示如何使用广泛使用的BIND9 DNS软件在Ubuntu 20.04上设置本地DNS解析器。 DNS解析器有许多名称,其中一些名称在下面列出。 他们都指同一件事。
- 完整解析器(与存根解析器相反)
- DNS递归
- 递归DNS服务器
- 递归解析器
另请注意,DNS服务器也可以称为名称服务器。 DNS解析器的示例是8.8.8.8(Google公共DNS服务器)和1.1.1.1(Cloudflare公共DNS服务器)。 您的计算机上的操作系统也具有解析器,尽管由于其功能有限而被称为存根解析器。 存根解析器是最终用户计算机上的小型DNS客户端,它从Firefox等应用程序接收DNS请求并将请求转发到递归解析器。 几乎每个解析器都可以缓存DNS响应以提高性能,因此它们也称为缓存DNS服务器。
为什么要运行自己的本地DNS解析器
通常,您的计算机或路由器使用ISP的DNS解析器查询DNS名称。 运行您自己的本地DNS解析器可以加快DNS查找的速度,因为
- 本地DNS解析器仅侦听您的DNS请求,而不会回答其他人的DNS请求,因此您更有可能直接从解析器的缓存中获取DNS答案。
- 消除了计算机和DNS解析器之间的网络延迟(几乎为零),因此DNS查询可以更快地发送到根DNS服务器。
如果您运行邮件服务器并使用DNS黑名单(DNSBL)阻止垃圾邮件,则应运行自己的DNS解析器,因为某些URIBL等DNS黑名单会拒绝来自公共DNS解析器的请求。 如果您在VPS(虚拟专用服务器)上运行自己的VPN服务器,那么在同一VPS上安装DNS解析器也是一个好习惯。
如果您不希望Internet浏览历史记录存储在第三方服务器上,则可能还需要运行自己的DNS解析器。
如果您拥有一个网站并希望自己的DNS服务器处理域名的名称解析而不是使用域注册商的DNS服务器,那么您将需要设置与DNS解析器不同的权威DNS服务器。 BIND可以同时充当权威DNS服务器和DNS解析器,但是 最好是将两个角色分开放在不同的盒子上。 本教程说明了如何设置本地DNS解析器,并且由于它将在本地主机/本地网络上使用,因此不需要加密(TLS上的DNS或HTTPS上的DNS)。 在以后的文章中将讨论设置DoT解析器或DoH解析器。
在Ubuntu 20.04上使用BIND9设置本地DNS解析器
BIND(伯克利Internet名称域)是一种开源DNS服务器软件,由于其稳定性和高质量而广泛用于Unix / Linux。 它最初由加州大学伯克利分校(UC Berkeley)开发,并于1994年后期移至Internet Systems Consortium,Inc(ISC)。
运行以下命令,从默认存储库在Ubuntu 20.04上安装BIND 9。 BIND 9是当前版本,BIND 10是无效项目。
sudo apt update sudo apt install bind9 bind9utils bind9-doc bind9-host
检查版本。
named -v
样本输出:
BIND 9.16.1-Ubuntu (Stable Release) <id:d497c32>
要检查版本号和构建选项,请运行
named -V
默认情况下,BIND在安装后自动启动。您可以通过以下方式检查其状态:
systemctl status named
如果它没有运行,请使用以下命令启动它:
sudo systemctl start named
并在启动时启用自动启动:
sudo systemctl enable named
BIND服务器将以 bind
用户,它是在安装过程中创建的,并且侦听TCP和UDP端口53,如运行以下命令所示:
sudo netstat -lnptu | grep named
通常,DNS查询发送到UDP端口53。TCP端口53用于大于512字节的响应。
BIND守护程序称为 命名。 (守护程序是在后台运行的软件。) named
二进制文件由 bind9
包,还有另一个重要的二进制文件: rndc
,远程名称守护程序控制器,由 bind9utils
包。 的 rndc
二进制文件用于重新加载/停止和控制BIND守护程序的其他方面。 通过TCP端口953进行通信。
例如,我们可以检查BIND名称服务器的状态。
sudo rndc status
本地DNS解析器的配置
/etc/bind/
是包含BIND配置的目录。
- 命名.conf:主要配置文件,其中包括其他三个文件的配置。
- db.127:本地主机IPv4反向映射区域文件。
- 本地数据库:本地主机转发IPv4和IPv6映射区域文件。
- db.empty:一个空的区域文件
Ubuntu 20.04上的bind9软件包不附带 db.root
文件,现在使用根目录提示文件位于 /usr/share/dns/root.hints
。 的 根提示 DNS解析器使用该文件查询根DNS服务器。 共有13组根DNS服务器, a.root-servers.net
至 m.root-servers.net
。
开箱即用,Ubuntu上的BIND9服务器仅为localhost和本地网络客户端提供递归服务。 外部查询将被拒绝。 因此,您不必编辑配置文件。 为了使您熟悉BIND 9的配置,我将向您展示如何启用递归服务。
主要的BIND配置文件 /etc/bind/named.conf
从其他3个文件中获取设置。
- /etc/bind/named.conf.options
- /etc/bind/named.conf.local
- /etc/bind/named.conf.default-zones
要启用递归服务,请编辑第一个文件。
sudo nano /etc/bind/named.conf.options
在里面 options
子句,添加以下行。 替换IP地址 allow-recursion
带有您自己的本地网络地址的声明。
// hide version number from clients for security reasons. version "not currently available"; // optional - BIND default behavior is recursion recursion yes; // provide recursion service to trusted clients only allow-recursion { 127.0.0.1; 192.168.0.0/24; 10.10.10.0/24; }; // enable the query log querylog yes;
保存并关闭文件。 然后测试配置文件语法。
sudo named-checkconf
如果测试成功(由静默输出指示),则重新启动BIND9。
sudo systemctl restart named
如果在BIND服务器上运行UFW防火墙,则需要打开端口53,以允许LAN客户端发送DNS查询。
sudo ufw allow in from 192.168.0.0/24 to any port 53
这将打开TCP和UDP端口53到专用网络192.168.0.0/24。 然后,从同一局域网中的另一台计算机上,我们可以运行以下命令来查询google.com的A记录。 将192.168.0.102替换为BIND解析器的IP地址。
dig A google.com @192.168.0.102
现在,在BIND解析器上,使用以下命令检查查询日志。
sudo journalctl -eu named
这将显示bind9服务单元的最新日志消息。 我在日志中找到以下行,这表明已从192.168.0.103的端口57806接收到google.com的A记录的DNS查询。
named[1162]: client @0x7f4d2406f0f0 192.168.0.103#57806 (google.com): query: google.com IN A +E(0)K (192.168.0.102)
在Ubuntu 20.04服务器上设置默认DNS解析器
Systemd-resolved在Ubuntu 20.04上提供了存根解析器。 如本文开头所述,存根解析器是最终用户计算机上的小型DNS客户端,它从Firefox等应用程序接收DNS请求并将请求转发到递归解析器。
可以使用此命令查看默认的递归解析器。
systemd-resolve --status
提示:如果上述命令没有立即退出,您可以通过按Q键使其退出。
如您所见,BIND不是默认值。 如果您在BIND服务器上运行以下命令,
dig A facebook.com
在BIND日志中找不到此DNS查询。 相反,您需要明确告知dig使用BIND。
dig A facebook.com @127.0.0.1
要将BIND设置为默认解析器,请打开systemd解析的配置文件。
sudo nano /etc/systemd/resolved.conf
在里面 [Resolve]
部分,添加以下行。 这将为您的服务器设置一个全局DNS服务器。
DNS=127.0.0.1
保存并关闭文件。 然后重新启动系统解析的服务。
sudo systemctl restart systemd-resolved
现在运行以下命令来检查默认的DNS解析器。
systemd-resolve --status
现在执行DNS查询,无需指定 127.0.0.1
。
dig A facebook.com
您将在BIND日志中看到DNS查询,这意味着BIND现在是默认的递归解析器。 如果您在BIND日志中没有看到任何查询,则可能需要配置每个链接的DNS服务器。
在Ubuntu 20.04上配置Per-Link DNS服务器
您还可以配置每个链接的DNS服务器,它将覆盖全局DNS服务器。 有两种方法可以配置每个链接的DNS服务器:
- 通过systemd-resolved
- 通过netplan
系统解析
列出以下文件 /etc/systemd/network/
目录。
ls /etc/systemd/network/
样本输出:
05-eth0.network 99-default.link
如您所见,我有两个链接配置文件。 的 05-eth0.network
该文件用于我的主网络接口,因此我对此文件进行了编辑。
sudo nano /etc/systemd/network/05-eth0.network
您的文件名可能不同。 如果此目录下没有文件,则您的每链接DNS配置不受以下控制 systemd-resolved
。
注释掉默认的DNS和域条目,并添加自己的DNS条目。
DNS=127.0.0.1
保存并关闭文件。 然后重启 systemd-resolved
服务。
sudo systemctl restart systemd-resolved
网络计划
一些Ubuntu服务器可能正在使用netplan配置每个链接网络。 在这种情况下,您需要在 .yaml
文件下 /etc/netplan/
目录。 列出此目录中的文件。
ls /etc/netplan/
样本输出:
01-netcfg.yaml
所以我编辑了这个文件。
sudo nano /etc/netplan/01-netcfg.yaml
设置DNS服务器地址 nameservers
部分。
nameservers: search: [ invalid ] addresses: - 127.0.0.1
您可以指定多个DNS解析器,如下所示,这样可以减少DNS故障的机会。
nameservers: search: [ invalid ] addresses: - 127.0.0.1 - 8.8.8.8 - 1.1.1.1
保存并关闭文件。 然后应用更改。
sudo netplan apply
注意: 如果看到以下错误消息,则netplan无法处理配置文件。
Invalid YAML at /etc/netplan/01-netcfg.yaml inconsistent indentation
您应该修复不一致的缩进并运行 sudo netplan apply
再次命令。
故障排除
检查内容 /etc/resolv.conf
。
cat /etc/resolv.conf
如您所见,127.0.0.1(BIND)是默认的DNS解析器。 如果看到不同的值,则表示BIND仍不是默认的DNS解析器。 您可以使用resolveconf实用程序将BIND设置为默认解析器。
安装 resolvconf
包
sudo apt install resolvconf
然后开始 named-resolvconf
服务。
sudo systemctl start named-resolvconf.service
在启动时启用自动启动。
sudo systemctl enable named-resolvconf.service
现在检查 /etc/resolv.conf
再次归档。 BIND现在应该是Ubuntu服务器上的默认DNS解析器。
cat /etc/resolv.conf
请注意,某些托管服务提供商(例如Linode)可能会使用网络助手来自动生成 /etc/resolv.conf
文件。 要更改默认的DNS解析器,您需要在主机控制面板中禁用该网络帮助器。
如果此方法仍然不起作用,则可能是由于 /etc/resolv.conf
Ubuntu服务器上的文件不是指向的符号链接 /run/resolvconf/resolv.conf
。 您需要删除 /etc/resolv.conf
文件并创建符号链接。
sudo rm /etc/resolv.conf sudo ln -s /run/resolvconf/resolv.conf /etc/resolv.conf
在客户端计算机上设置默认DNS解析器
在Ubuntu桌面上,您可以按照上述说明设置默认的DNS解析器,但请记住将127.0.0.1替换为BIND服务器的IP地址。 在MacOS和Windows上设置默认DNS解析器的步骤可以在Internet上找到。
如何在BIND中禁用IPv6
如果您不在网络中使用IPv6,则最好在BIND中关闭IPv6,否则,如下所示,在BIND日志中将有很多关于IPv6的错误。
network unreachable resolving 'mirrors.fedoraproject.org/A/IN': 2001:4178:2:1269:dead:beef:cafe:fed5#53 network unreachable resolving 'mirrors.fedoraproject.org/AAAA/IN': 2001:4178:2:1269:dead:beef:cafe:fed5#53 network unreachable resolving 'mirrors.fedoraproject.org/A/IN': 2610:28:3090:3001:dead:beef:cafe:fed5#53 network unreachable resolving 'mirrors.fedoraproject.org/AAAA/IN': 2610:28:3090:3001:dead:beef:cafe:fed5#53
要在Ubuntu上的BIND中禁用IPv6,只需打开/ etc / default / bind9文件
sudo nano /etc/default/named
在选项中添加“ -4”。
OPTIONS="-u bind -4"
保存并关闭文件。 然后重新启动BIND,您就完成了。
sudo systemctl restart named
命名为自动重启
如果由于某种原因您的命名进程被杀死,则需要运行以下命令来重新启动它。
sudo systemctl restart named
无需手动输入此命令,我们可以通过编辑 named.service
系统服务单元。 要覆盖默认的systemd服务配置,我们创建一个单独的目录。
sudo mkdir -p /etc/systemd/system/named.service.d/
然后在此目录下创建一个文件。
sudo nano /etc/systemd/system/named.service.d/restart.conf
在文件中添加以下行,这将使Named在检测到故障后5秒钟自动重新启动。
[Service] Restart=always RestartSec=5s
保存并关闭文件。 然后重新加载systemd。
sudo systemctl daemon-reload
要检查是否可行,请杀死Named with:
sudo pkill named
然后检查命名状态。 您会发现Named自动重新启动。
systemctl status named
结论
我希望本教程可以帮助您在具有BIND9的Ubuntu 20.04上设置本地DNS解析器。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂