在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查找的速度,因为

  1. 本地DNS解析器仅侦听您的DNS请求,而不会回答其他人的DNS请求,因此您更有可能直接从解析器的缓存中获取DNS答案。
  2. 消除了计算机和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

ubuntu 20.04 bind9设置

通常,DNS查询发送到UDP端口53。TCP端口53用于大于512字节的响应。

BIND守护程序称为 命名。 (守护程序是在后台运行的软件。) named 二进制文件由 bind9 包,还有另一个重要的二进制文件: rndc,远程名称守护程序控制器,由 bind9utils 包。 的 rndc 二进制文件用于重新加载/停止和控制BIND守护程序的其他方面。 通过TCP端口953进行通信。

例如,我们可以检查BIND名称服务器的状态。

sudo rndc status

rndc远程名称守护程序控制器ubuntu 20.04

本地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.netm.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;

启用bind9-ubuntu 20.04中的递归服务

保存并关闭文件。 然后测试配置文件语法。

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

local-dns-resolver-ubuntu-20.04

提示:如果上述命令没有立即退出,您可以通过按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

绑定DNS解析器

保存并关闭文件。 然后重新启动系统解析的服务。

sudo systemctl restart systemd-resolved

现在运行以下命令来检查默认的DNS解析器。

systemd-resolve --status

bind9-递归解析器-ubuntu-20.04

现在执行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

在Ubuntu上配置Per-Link DNS服务器

您可以指定多个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

resolvconf设置默认的DNS解析器Ubuntu 20.04

如您所见,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解析器。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂

Sidebar