在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
默认情况下,绑定在安装后自动启动。您可以通过以下方式检查其状态:
systemctl状态绑定9
如果它没有运行,那么从以下内容开始:
sudo systemctl start bind9
并在启动时启用自动启动:
sudo systemctl enable bind9
BIND服务器将以BIND用户的身份运行,该用户是在安装过程中创建的,并在TCP和UDP端口53上侦听,如运行以下命令所示:
sudo netstat-lnptu | grep命名
绑定守护进程被称为named。(守护进程是在后台运行的软件。)命名的二进制文件由bind9包安装,还有另一个重要的二进制文件:rndc,远程名称守护程序控制器,由bind9utils包安装。rndc二进制文件用于重新加载/停止和控制绑定守护进程的其他方面。通信通过TCP端口953完成。
例如,我们可以检查绑定名称服务器的状态。
sudo rndc状态
主绑定配置文件/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;};
从技术上讲,您只需要添加递归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。实例通用域名格式
默认情况下,它如下所示:
你可以改成这个。
哪里
- $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帐户。选择左侧边栏上的域列表菜单,然后单击最右侧的管理按钮。
选择高级DNS。
滚动到页面底部,您将找到个人DNS服务器部分。单击添加名称服务器按钮添加您自己的名称服务器:ns1。实例com和ns2。实例通用域名格式。您需要输入名称服务器的IP地址。
添加两个名称服务器后,单击搜索按钮检查它们是否已成功添加。如果是这样,胶水记录将显示在此页面底部。
现在单击“域”选项卡,并使用自定义DNS服务器。
根据您使用的域注册器,您的NS记录可能会立即传播,或者传播可能需要24小时。你可以去https://dnsmap.io检查您的新NS记录是否处于活动状态。
在NS记录和glue记录被传播到Internet之后,DNS服务器将响应您的域名的DNS查询。您可以通过以下方式查看查询日志:
sudo journalctl-eu bind9
您还可以使用dig实用程序检查域名的NS记录。
举个例子。通用域名格式
如果NS记录和glue记录已传播到Internet,您应该在“答案”部分看到您的名称服务器。如果您看到SERVFAIL错误,可能是因为您没有在名称服务器上打开UDP端口53。
需要知道的事情
- 术语主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服务器。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?