在Ubuntu 18.04、16.04上设置绑定权威DNS服务器

  • 技术文档
  • 2022.03.23
  • 浏览:239

本教程将向您展示如何使用广泛使用的BIND 9软件在Ubuntu18.04/16.04上设置和运行自己的权威名称服务器。

注意:本教程展示了命令行方法。如果您想从web GUI编辑DNS记录,我建议使用Webmin设置权威DNS服务器,这是一个免费的开源服务器控制面板。

什么是权威DNS服务器?

如果您拥有一个域名,并且希望您自己的DNS服务器为您的域名处理名称解析,而不是使用您的域名注册商的DNS服务器,那么您需要设置一个权威的DNS服务器。

域名所有者使用权威DNS服务器来存储DNS记录。它为DNS解析程序(如8.8.8.8或1.1.1.1)提供权威答案,这些解析程序代表终端用户在PC、智能手机或平板电脑上查询DNS记录。

关于BIND

BIND(Berkeley Internet Name Domain)是一款开源、灵活、功能齐全的DNS软件,由于其稳定性和高质量,在Unix/Linux上得到了广泛应用。它最初由加州大学伯克利分校(UC Berkeley)开发,后来在1994年被转移到互联网系统联盟(Internet Systems Consortium,Inc.)进行开发。

BIND可以同时充当区域的权威DNS服务器和DNS解析程序。DNS解析程序也可以称为递归名称服务器,因为它对本地客户端执行递归查找。然而,同时扮演两个角色并不有利。在两台不同的机器上分离这两个角色是一种很好的做法。

在上一篇文章中,我解释了在Ubuntu 18.04/16.04上设置本地DNS解析器的步骤。本教程将向您展示如何在Ubuntu 18.04/16.04上将BIND9设置为仅限权威的DNS服务器,并禁用递归。

先决条件

要学习本教程,您应该已经购买了域名。我在namescape注册了我的域名,因为价格低廉,而且他们终身免费保护whois的隐私。

你还需要两台服务器。一台服务器用于主DNS服务器,另一台用于从DNS服务器。理想情况下,这两台服务器应该位于不同的物理位置。如果一个DNS服务器处于脱机状态,另一个DNS服务器仍然可以响应您的域名的DNS查询。

每台服务器只需要512MB内存,以下是我推荐的主机提供商。我都用过了。

  • Vultr:起价为每月2.5美元。需要信用卡。你可以通过我的推荐链接在Vultr创建一个账户,获得50美元的免费信用。
  • DigitalOcean:起价为每月5美元。不需要信用卡。你可以用贝宝。你可以通过我的推荐链接在DigitalOcean创建一个帐户,获得50美元的免费信用。

一旦你买了两台服务器,在上面安装Ubuntu,并按照下面的说明操作。

使用BIND9在Ubuntu 18.04/16.04上设置权威DNS服务器

您需要在两台服务器上运行本节中的命令。

通过SSH登录这两台服务器,并从默认存储库运行以下命令,在Ubuntu 18.04/16.04上安装BIND 9。BIND 9是当前版本,BIND 10是一个死项目。

sudo apt更新sudo apt安装bind9 bind9utils bind9 doc

检查版本号。

命名为-v

样本输出:

绑定9.11.3-1 buntu1。3-Ubuntu(扩展支持版)<;识别号:a375815>;

要检查版本号和生成选项,请运行

命名为-V

BIND version number and build option

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

systemctl状态绑定9

bind 9 ubuntu 18.04 server

如果它没有运行,那么从以下内容开始:

sudo systemctl start bind9

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

sudo systemctl enable bind9

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

sudo netstat-lnptu | grep命名

ubuntu 18.04 bind9 setup

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

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

sudo rndc状态

remote name daemon controller

主绑定配置文件/etc/BIND/named。conf从其他3个文件中获取设置。

  • /etc/bind/named。形态选项
  • /etc/bind/named。conf.local
  • /etc/bind/named。conf.default-zones

Ubuntu上的BIND9服务器提供了本地主机和本地网络客户端的递归服务。由于我们正在设置权威DNS服务器,因此需要禁用递归。编辑/etc/bind/named。conf.options文件。

sudo nano/etc/bind/named。形态选项

在选项{…}中添加以下行;条款

//出于安全原因,对客户端隐藏版本号。版本“当前不可用”;//在权威DNS服务器上禁用递归。递归否;//启用查询日志querylog yes;//不允许区域转移允许转移{none;};

bind9 authoritative dns server ubuntu 18.04 LTS

从技术上讲,您只需要添加递归no;禁用递归,但最好添加其他3条指令。保存并关闭文件。然后重启BIND。

sudo systemctl重启bind9

主DNS服务器配置

从两台服务器中选择一台作为主DNS服务器。我们将把它命名为ns1。实例通用域名格式。

主DNS服务器保存区域文件的主副本。在此服务器上更改DNS记录。一个域可以有一个或多个DNS区域。每个DNS区域都有一个区域文件,其中包含该区域中的每个DNS记录。为了简单起见,本文假设您希望使用单个DNS区域来管理您的域名的所有DNS记录。

/etc/bind/named。conf.default-zones文件定义根区域和本地主机区域。要为域名添加区域,请编辑/etc/bind/named。conf.local文件。

sudo nano/etc/bind/named。conf.local

将以下行添加到此文件。替换示例。使用你自己的域名。将12.34.56.78替换为从属DNS服务器的IP地址。

区域“example.com”{type master;file”/etc/bind/db.example.com”;允许查询{any;};允许转移{12.34.56.78;};};

在上述配置中,我们使用zone子句创建了一个新区域,并指定这是主区域。区域文件是/etc/bind/db。实例com,我们将在其中添加DNS记录。仅允许从DNS服务器进行区域传输。保存并关闭文件。

我们可以使用区域模板文件,而不是从头创建区域文件。复制数据库的内容。空到一个新文件。

sudo cp/etc/bind/db。空/etc/bind/db。实例通用域名格式

区域文件可以包含3种类型的条目:

  • 注释:以分号(;)开头
  • 指令:以美元符号($)开头
  • 资源记录:又名DNS记录

区域文件通常由以下类型的DNS记录组成。

  • SOA(授权开始)记录:定义区域的关键特征。这是区域文件中的第一个DNS记录,是必需的。
  • NS(名称服务器)记录:指定用于存储DNS记录和回答域名DNS查询的服务器。区域文件中必须至少有两条NS记录。
  • MX(邮件交换器)记录:指定哪些主机负责域名的电子邮件传递。
  • (地址)记录:将DNS名称转换为IPv4地址。
  • AAAA(Quad A)记录:将DNS名称转换为IPv6地址。
  • CNAME记录(规范名称):用于为DNS名称创建别名。
  • TXT记录:SPF、DKIM、DMARC等。

现在,让我们编辑区域文件。

sudo nano/etc/bind/db。实例通用域名格式

默认情况下,它如下所示:

BIND9 zone transfer ubuntu

你可以改成这个。

bind9 master zone file

哪里

  • $TTL指令定义区域的默认生存时间值,即DNS记录可以缓存在DNS解析程序上的时间。该指令是强制性的。时间以秒为单位。
  • $ORIGIN指令定义基本域。
  • 域名必须以点(.)结尾,这是根域。当域名以点结尾时,它是一个完全限定的域名(FQDN)。
  • @符号引用基本域。
  • 在DNS类中。它代表互联网。存在其他DNS类,但很少使用。

区域文件中的第一条记录是SOA(授权开始)记录。此记录包含以下信息:

  • 主DNS服务器。
  • 区域管理员的电子邮件地址。RFC 2142建议使用电子邮件地址[email ;protected]。在区域文件中,此电子邮件地址采用以下形式:hostmaster。实例com,因为@符号在区域文件中有特殊含义。
  • 区域序列号。序列号是从DNS服务器跟踪区域变化的一种方式。按照惯例,序列号采用日期格式:yyyymmddss,其中yyyy是四位数字的年份号,mm是月份,dd是日期,ss是日期的序列号。更改区域文件时,必须更新序列号。
  • 刷新值。当达到刷新值时,从DNS服务器将尝试从主DNS服务器读取SOA记录。如果序列号变高,则启动区域传输。
  • 重试值。定义从DNS服务器无法连接到主DNS服务器时的重试间隔(以秒为单位)。
  • 到期:如果从属DNS服务器在这段时间内未能与主DNS服务器联系,则从属DNS服务器将停止响应此区域的DNS查询。
  • 负缓存TTL:为不存在的DNS名称(NXDOMAIN)定义DNS响应的生存时间值。

TXT记录通常用双引号括起来。如果添加DKIM记录,还需要用括号括起该值。

保存并关闭文件。然后运行以下命令检查主配置文件中是否存在语法错误。无声输出表示未发现错误。

sudo命名为checkconf

然后检查区域文件的语法。

sudo命名为checkzone示例。com/etc/bind/db。实例通用域名格式

如果区域文件中存在语法错误,则需要修复它,否则将无法加载此区域。以下消息表示没有语法错误。

区域示例。com/IN:已加载序列号2019011503正常

然后重启BIND9。

sudo systemctl重启bind9

如果您使用的是简单防火墙(UFW),请打开TCP和UDP端口53。

sudo ufw allow 53/tcp sudo ufw allow 53/udp

如果您直接使用iptables防火墙,请运行以下命令。

sudo iptables-A INPUT-p tcp-dport 53-j ACCEPT sudo iptables-A INPUT-p udp-dprot 53-j ACCEPT

从DNS服务器配置

现在我们使用另一台服务器作为从DNS服务器,它将被命名为ns2。实例通用域名格式。

首先,编辑命名文件。conf.local文件。

sudo nano/etc/bind/named。conf.local

添加一个如下所示的区域。将12.34.56.78替换为主DNS服务器的IP地址。

区域“example.com”{type slave;文件“db.example.com”;允许查询{any;};硕士{12.34.56.78;};};

在上面的配置中,我们指定这是示例中的从属DNS服务器。com区域,它将只接受来自受信任IP地址的区域传输。

保存并关闭文件。然后运行以下命令检查主配置文件中是否存在语法错误。

sudo命名为checkconf

如果没有发现错误,请重新启动BIND9。

sudo systemctl重启bind9

从DNS服务器上的区域文件是从区域传输加载的,该传输用于同步从主DNS服务器到从DNS服务器的DNS记录更改。BIND9重新启动后,区域传输将立即启动。使用以下命令检查BIND9日志。

sudo journalctl-eu bind9

您可以看到如下消息,这表明区域传输成功。

命名为[31518]:转移“示例”。com/IN'from 12.34.56.78#53:传输完成:1条消息,16条记录,886字节,0.004秒(221500字节/秒)

区域文件将另存为/var/cache/bind/db。实例通用域名格式。

如果您使用的是简单防火墙(UFW),请打开TCP和UDP端口53。

sudo ufw allow 53/tcp sudo ufw allow 53/udp

如果您直接使用iptables防火墙,请运行以下命令。

sudo iptables-A INPUT-p tcp-dport 53-j ACCEPT sudo iptables-A INPUT-p udp-dport 53-j ACCEPT

更多关于区域转移的信息

当达到SOA记录中的刷新时间时,从属DNS服务器将再次联系主服务器,如果主服务器上的序列号大于从属服务器上的序列号,则将启动区域传输。有两种类型的区域转移:

  • 完整区域传输(AXFR):传输区域文件的完整副本。
  • 增量区域传输(IXFR):仅传输更改的DNS记录。

两种类型的区域传输都使用TCP端口53。默认情况下,从属DNS服务器上的绑定将请求增量区域传输,而主DNS服务器上的绑定仅在区域是动态的情况下才允许增量区域传输。

区域传输间隔是DNS记录更改传播速度的主要因素。当区域发生更改时,绑定主机将通知从属DNS服务器,而不是等待从属DNS服务器联系。这可以大大缩短将区域更改传播到Internet的时间。

反向区

反向区域包含将IP地址映射到DNS名称的PTR记录。它是DNS A记录的对应项。PTR记录通常是邮件服务器通过垃圾邮件过滤器所必需的。此记录不属于域。您需要在主机提供商的控制面板上创建PTR记录,或者询问您的ISP,所以我不打算在BIND中介绍创建反向区域。

更改NS记录并创建胶水记录

现在你需要去你的域名注册商的网站更改你的域名的NS记录,这样互联网就会知道你现在正在使用自己的DNS服务器。通常在NS记录中使用主机名,比如ns1。实例com和ns2。实例通用域名格式。

名称服务器1:ns1。实例com名称服务器2:ns2。实例通用域名格式

如果你有一个域名的例子。com,您使用一个子域作为权威DNS服务器(ns1.example.com和ns2.example.com),然后您还需要在您的域注册器上创建一个粘合记录,以便Internet可以知道您的DNS服务器的IP地址。胶水记录是ns1的A记录。实例com和ns2。实例通用域名格式。

ns1。实例主服务器ns2的com IP地址。实例从服务器的com IP地址

上述信息将通过可扩展配置协议(EPP)发送给运行TLD DNS服务器的注册运营商,以便TLD DNS服务器知道您的域名的权威DNS服务器的主机名和IP地址。根据您使用的域注册器,您的NS记录可能会立即传播,或者传播可能需要24小时。你可以去https://dnsmap.io检查您的新NS记录是否处于活动状态。

我将向你展示如何在namescapet上实现这一点。

如果你在NameCheap购买了域名,请登录你的NameCheap帐户。选择左侧边栏上的域列表菜单,然后单击最右侧的管理按钮。

namecheap personal name servers

选择高级DNS。

namecheap advanced dns

滚动到页面底部,您将找到个人DNS服务器部分。单击添加名称服务器按钮添加您自己的名称服务器:ns1。实例com和ns2。实例通用域名格式。您需要输入名称服务器的IP地址。

namecheap glue records

添加两个名称服务器后,单击搜索按钮检查它们是否已成功添加。如果是这样,胶水记录将显示在此页面底部。

现在单击“域”选项卡,并使用自定义DNS服务器。

namecheap custom DNS record

根据您使用的域注册器,您的NS记录可能会立即传播,或者传播可能需要24小时。你可以去https://dnsmap.io检查您的新NS记录是否处于活动状态。

在NS记录和glue记录被传播到Internet之后,DNS服务器将响应您的域名的DNS查询。您可以通过以下方式查看查询日志:

sudo journalctl-eu bind9

您还可以使用dig实用程序检查域名的NS记录。

举个例子。通用域名格式

如果NS记录和glue记录已传播到Internet,您应该在“答案”部分看到您的名称服务器。如果您看到SERVFAIL错误,可能是因为您没有在名称服务器上打开UDP端口53。

BIND NS record servfail

需要知道的事情

  • 术语主DNS服务器仅表示此服务器存储区域文件的主副本。在DNS解析方面,它没有更高的优先级。
  • 更改区域文件时,请始终更新SOA序列号。

在绑定区域文件中使用通配符

如果要将所有子域指向同一IP地址,可以使用通配符来实现。例如,下面一行将使您的所有子域指向1.2.3.4 IP地址。

*.你的域名。com在1.2.3.4中的应用

启用解析器

BIND可以同时充当区域的权威DNS服务器和DNS解析程序。在两台不同的主机上分离这两个角色是一种很好的做法,在本文中,我们在BIND中禁用了解析器。如果您真的想启用解析器,请按照以下说明操作。

编辑绑定配置文件。

sudo nano/etc/bind/named。形态选项

找到下面几行。

//在权威DNS服务器上禁用递归。递归否;

将它们更改为以下内容,这样只有受信任的IP地址才能向DNS解析程序发送递归查询,而您的服务器将不会是开放的解析程序。

//仅允许对受信任的客户端进行递归。递归是的;允许查询{localhost;12.34.56.78;};

将12.34.56.78替换为您自己的IP地址。保存并关闭文件。确保在/etc/bind/named中定义区域。conf.local文件具有以下选项,因此Internet可以查询您所在区域的DNS记录。

允许查询{any;};

然后重启BIND。

sudo systemctl重启bind9

去https://openresolver.com/测试绑定服务器是否为开放式解析程序。

收尾

就这样!我希望本教程能帮助您在Ubuntu 18.04和Ubuntu 16.04上使用BIND9设置权威DNS服务器。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?