如何使用BIND9在Ubuntu 18.04、16.04上设置本地DNS解析器

本教程将向您展示如何使用广泛使用的BIND9 DNS软件在Ubuntu 18.04、16.04上设置本地DNS解析器。 DNS解析器有许多名称,其中一些名称在下面列出。 他们都指同一件事。

  • 完整解析器(与存根解析器相反)
  • DNS递归
  • 递归DNS服务器
  • 递归解析器

另请注意,DNS服务器也可以称为名称服务器。 DNS解析器的示例是8.8.8.8(Google公共DNS服务器)和1.1.1.1(Cloudflare公共DNS服务器)。 您的PC上的操作系统也具有解析器,尽管由于其功能有限而被称为存根解析器。 存根解析器是最终用户计算机上的小型DNS客户端,它从Firefox等应用程序接收DNS请求并将请求转发到递归解析器。 几乎每个解析器都可以缓存DNS响应以提高性能,因此它们也称为缓存DNS服务器。

为什么要运行自己的本地DNS解析器

通常,您的计算机或路由器使用ISP的DNS解析器查询DNS名称。 运行您自己的本地DNS解析器可以加快DNS查找的速度,因为

  1. 本地DNS解析器仅侦听您的DNS请求,而不会回答其他人的DNS请求,因此您更有可能直接从解析器的缓存中获取DNS答案。
  2. 消除了计算机和DNS解析器之间的网络延迟(几乎为零),因此DNS查询可以更快地发送到根DNS服务器。

如果运行邮件服务器并使用DNS黑名单(DNSBL)阻止垃圾邮件,则建议您运行本地DNS解析器以加快DNS查找速度。 如果您在VPS(虚拟专用服务器)上运行自己的VPN服务器,那么在同一VPS上安装DNS解析器也是一个好习惯。

如果您不希望Internet浏览历史记录存储在第三方服务器上,则可能还需要运行自己的DNS解析器。

如果您拥有一个网站并希望自己的DNS服务器处理域名的名称解析而不是使用域注册商的DNS服务器,那么您将需要设置与DNS解析器不同的权威DNS服务器。 BIND可以同时充当权威DNS服务器和DNS解析器,但是 最好是将两个角色分开放在不同的盒子上。 本教程说明了如何设置本地DNS解析器,并且由于它将在本地主机/本地网络上使用,因此不需要加密(TLS上的DNS或HTTPS上的DNS)。 在以后的文章中将讨论设置DoT解析器或DoH服务器。

使用BIND9在Ubuntu 18.04、16.04上设置本地DNS解析器

BIND(伯克利Internet名称域)是一种开源DNS服务器软件,由于其稳定性和高质量而广泛用于Unix / Linux。 它最初由加州大学伯克利分校(UC Berkeley)开发,并于1994年后期移至Internet Systems Consortium,Inc(ISC)。

运行以下命令,从默认存储库在Ubuntu 18.04、16.04上安装BIND 9。 BIND 9是当前版本,BIND 10是无效项目。

sudo apt update
sudo apt install bind9 bind9utils bind9-doc bind9-host

检查版本。

named -v

样本输出:

BIND 9.11.3-1ubuntu1.3-Ubuntu (Extended Support Version) <id:a375815>

要检查版本号和构建选项,请运行

named -V

默认情况下,BIND在安装后自动启动。您可以通过以下方式检查其状态:

systemctl status bind9

如果它没有运行,请使用以下命令启动它:

sudo systemctl start bind9

并在启动时启用自动启动:

sudo systemctl enable bind9

BIND服务器将以 bind 用户,它是在安装过程中创建的,并且侦听TCP和UDP端口53,如运行以下命令所示:

sudo netstat -lnptu | grep named

ubuntu 18.04 bind9设置

通常,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.root根提示 DNS解析器用于查询根DNS服务器的文件。 共有13组根DNS服务器, a.root-servers.netm.root-servers.net
  • db.127:本地主机IPv4反向映射区域文件。
  • 本地数据库:本地主机转发IPv4和IPv6映射区域文件。
  • db.empty:一个空的区域文件

开箱即用,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中启用递归服务

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

sudo named-checkconf

如果测试成功(由静默输出指示),则重新启动BIND9。

sudo systemctl restart bind9

如果在BIND服务器上运行防火墙,则需要打开端口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 bind9

这将显示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 18.04服务器上设置默认DNS解析器

Systemd-resolved在Ubuntu 18.04上提供了存根解析器。 如本文开头所述,存根解析器是最终用户计算机上的小型DNS客户端,它从Firefox等应用程序接收DNS请求并将请求转发到递归解析器。

可以使用此命令查看默认的递归解析器。

systemd-resolve --status

本地DNS解析器Ubuntu

如您所见,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 18.04

现在执行DNS查询,无需指定 127.0.0.1

dig A facebook.com

您将在BIND日志中看到DNS查询,这意味着BIND现在是默认的递归解析器。 如果您在BIND日志中没有看到任何查询,则可能需要配置每个链接的DNS服务器。

在Ubuntu 18.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服务器

保存并关闭文件。 然后应用更改。

sudo netplan apply

注意: 如果看到以下错误消息,则netplan无法处理配置文件。

Invalid YAML at /etc/netplan/01-netcfg.yaml  inconsistent indentation

您应该修复不一致的缩进并运行 sudo netplan apply 再次命令。

在Ubuntu 16.04服务器上设置默认DNS解析器

Ubuntu 16.04使用 resolvconf 程序来管理DNS解析器 /etc/resolv.conf 文件。 安装 resolvconf 包。

sudo apt install resolvconf

要将BIND设置为Ubuntu 16.04服务器上的默认解析器,您需要编辑 /etc/resolvconf/resolv.conf.d/head 文件并添加“nameserver 127.0.0.1”添加到此文件,可以通过运行以下命令来完成:

echo "nameserver 127.0.0.1" | sudo tee -a /etc/resolvconf/resolv.conf.d/head

无论如何,此文件中定义的解析器将始终是第一个DNS解析器。 现在重启 resolvconf 服务。

sudo systemctl restart resolvconf

您现在可以检查的内容 /etc/resolv.conf

cat /etc/resolv.conf

ubuntu 16.04设置默认DNS解析器

如您所见,127.0.0.1是默认的DNS解析器。

请注意,某些托管服务提供商(例如Linode)可能会使用网络助手来自动生成 /etc/resolv.conf 文件。 要更改默认的DNS解析器,您需要在主机控制面板中禁用该网络帮助器。

更新资料:后来我注意到,Ubuntu 16.04上的BIND软件包附带一个Systemd服务单元 bind9-resolvconf.service,这将帮助我们在Ubuntu服务器上设置默认的DNS解析器,因此您不必像上面那样手动进行设置。 默认情况下,此服务是禁用的,我们需要启动它并在启动时启用自动启动。

sudo systemctl start bind9-resolvconf

sudo systemctl enable bind9-resolvconf

确保 resolvconf 软件包已安装。 在Ubuntu 16.04服务器上,只需将两行命令和BIND设置为默认的DNS解析器。

在客户端计算机上设置默认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/bind9

在选项中添加“ -4”。

OPTIONS="-u bind -4"

保存并关闭文件。 然后重新启动BIND,您就完成了。

sudo systemctl restart bind9

结论

我希望本教程可以帮助您在具有BIND9的Ubuntu 18.04、16.04上设置本地DNS解析器。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂

Sidebar