本文介绍采用BIND9在Ubuntu 18.04、Ubuntu 16.04系统上设置Authoritative DNS Server的方法。
背景 如果你拥有域名并希望自己的DNS服务器处理域名的名称解析而不是使用域名注册商的DNS服务器,则需要设置Authoritative DNS Server,域名所有者使用Authoritative DNS Server来存储DNS记录。 同时你需要两台服务器,一台服务器用于主DNS服务器,另一台服务器用于从DNS服务器。理想情况下,两台服务器应位于不同的物理位置,如果一个DNS服务器处于脱机状态,则另一个DNS服务器仍然可以响应你对域名的DNS查询。 注意: 术语主DNS服务器仅表示此服务器存储区域文件的主副本,在DNS解析方面,它没有更高的优先级。更改区域文件时始终更新SOA序列号。
安装BIND9及配置的说明 注:安装BIND 9的命令:sudo apt install bind9 bind9utils bind9-doc 请先阅读使用BIND9在Ubuntu 18.04上设置本地DNS解析器:https://ywnz.com/linuxyffq/3986.html一文,本文所讲的操作跟文章里一样,一直操作到本地DNS解析程序的配置——编辑/etc/bind/namd.conf.options文件,接下来的步骤按照本文介绍的做: sudo nano /etc/bind/named.conf.options 将以下行添加到named.conf.options文件中: // hide version number from clients for security reasons. version "not currently available"; // disable recursion on authoritative DNS server. recursion no; // enable the query log querylog yes; // disallow zone transfer allow-transfer { none; }; 从技术上讲,你只需要添加recursion no,到disable recursion,但添加其他3个指令是一个好方式,保存并关闭文件,然后重启BIND: sudo systemctl restart bind9
主DNS服务器配置 选择两个服务器中的一个作为主DNS服务器,我们将其命名为ns1.example.com。 主DNS服务器保存区域文件的主副本,DNS记录的更改在此服务器上进行,域可以有一个或多个DNS区域,每个DNS区域都有一个区域文件,其中包含该区域中的每个DNS记录,为简单起见,本文假设你要使用单个DNS区域来管理域名的所有DNS记录。 /etc/bind/named.conf.default-zones文件定义根区域和localhost区域,要为你的域名添加区域,请编辑/etc/bind/named.conf.local文件: sudo nano /etc/bind/named.conf.local 将以下行添加到named.conf.local文件中,将example.com替换为自己的域名,将12.34.56.78替换为从DNS服务器的IP地址: zone "example.com" { type master; file "/etc/bind/db.example.com"; allow-transfer { 12.34.56.78; }; }; 在上面的配置中,我们使用zone子句创建了一个新区域,并指定这是主区域,区域文件是/etc/bind/db.example.com,我们将在其中添加DNS记录,区域传输仅允许从DNS服务器。 我们可以使用区域模板文件,而不是从头开始创建区域文件,将db.empty的内容复制到新文件: sudo cp /etc/bind/db.empty /etc/bind/db.example.com 区域文件可以包含3种类型的条目: 评论:以分号开头(;)。 指令:以美元符号开头($)。 资源记录:又称DNS记录。 区域文件通常由以下类型的DNS记录组成。 SOA(权限开始)记录:定义区域的关键特征,它是区域文件中的第一个DNS记录,是必需的。 NS(名称服务器)记录:指定哪些服务器用于存储DNS记录并回答域名的DNS查询,区域文件中必须至少有两条NS记录。 MX(邮件交换器)记录:指定哪些主机负责域名的电子邮件传递。 A(地址)记录:将DNS名称转换为IPv4地址。 AAAA(Quad A)记录:将DNS名称转换为IPv6地址。 CNAME记录(规范名称):它用于为DNS名称创建别名。 TXT记录:SPF,DKIM,DMARC等。 现在让我们编辑区域文件: sudo nano /etc/bind/db.example.com 默认情况下,它看起来像这样:
可以将其更改:
Where: $TTL指令定义区域的默认生存时间值,即DNS记录可以缓存在DNS解析器上的时间,该指令是强制性的,时间以秒为单位指定。 $ORIGIN指令定义基本域。 域名必须以点(.)结尾,这是根域,当域名以点结尾时,它是完全限定的域名(FQDN)。 @符号引用基域。 IN是DNS类,它代表互联网,存在其他DNS类但很少使用。 区域文件中的第一条记录是SOA(开始授权)记录,该记录包含以下信息: 主DNS服务器。 区域管理员的电子邮件地址,RFC 2142建议使用电子邮件地址hostmaster@example.com,在区域文件中,此电子邮件地址采用以下格式:hostmaster.example.com,因为@符号在区域文件中具有特殊含义。 区域序列号,序列号是从DNS服务器跟踪区域更改的一种方法,按照惯例,序列号采用日期格式:yyyymmddss,其中yyyy是四位数年份数,mm是月份,dd是日期,ss是当天的序列号,更改区域文件时,必须更新序列号。 刷新价值,当达到刷新值时,从DNS服务器将尝试从主DNS服务器读取SOA记录,如果序列号变高,则启动区域传输。 重试值,如果从DNS服务器无法连接到主DNS服务器,则以秒为单位定义重试间隔。 到期:如果从属DNS服务器在这段时间内未能与主DNS服务器联系,则从属服务器将停止响应此区域的DNS查询。 负缓存TTL:为不存在的DNS名称(NXDOMAIN)定义DNS响应的生存时间值。 TXT记录通常用双引号括起来,如果添加DKIM记录,还需要用括号括起该值。 保存并关闭文件,然后运行以下命令以检查主配置文件中是否存在syntax错误,默认输出表示未发现错误: sudo named-checkconf 然后检查区域文件的syntax: sudo named-checkzone example.com /etc/bind/db.example.com 如果未找到错误,则重新启动BIND9: sudo systemctl restart 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.example.com。 首先,编辑named.conf.local文件: sudo nano /etc/bind/named.conf.local 添加如下所示的区域,将12.34.56.78替换为主DNS服务器的IP地址: zone "example.com" { type slave; file "db.example.com"; masters { 12.34.56.78; }; }; 在上面的配置中,我们指定这是example.com区域的从DNS服务器,它只接受来自可信IP地址的区域传输。 保存并关闭文件,然后运行以下命令以检查主配置文件中是否存在syntax错误: sudo named-checkconf 如果未找到错误,请重新启动BIND9: sudo systemctl restart bind9 从DNS服务器上的区域文件是从区域传输加载的,区域传输用于将DNS记录更改从主DNS服务器同步到从DNS服务器,BIND9重启后,区域传输将立即启动,使用以下命令检查BIND9日志: sudo journalctl -eu bind9 可以看到如下所示的消息,表示区域传输成功: named[31518]: transfer of 'example.com/IN' from 12.34.56.78#53: Transfer completed: 1 messages, 16 records, 886 bytes, 0.004 secs (221500 bytes/sec) 区域文件将另存为/var/cache/bind/db.example.com。 如果使用的是简单防火墙(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
关于区域传输 当达到SOA记录中的刷新时间时,从DNS服务器将再次联系主服务器,如果主服务器上的序列号大于从服务器上的序列号,则将启动区域传输,区域传输有两种类型: 完整区域传输(AXFR):传输区域文件的完整副本。 增量区域传输(IXFR):仅传输更改的DNS记录。 两种类型的区域传输都使用TCP端口53,默认情况下,从DNS服务器上的BIND将请求增量区域传输,主DNS服务器上的BIND将仅允许区域动态时的增量区域传输。 区域传输间隔是DNS记录更改传播速度的主要因素,而不是等待从DNS服务器进行联系,BIND主服务器将在对区域进行更改时通知从属服务器,这可以大大减少将区域更改传播到Internet的时间。
反向区域 反向区域包含将IP地址映射到DNS名称的PTR记录,它是DNS A记录的对应物,邮件服务器通常需要PTR记录来传递垃圾邮件过滤器,此记录不属于域,你需要在托管服务提供商的控制面板上创建PTR记录,或者询问您的ISP,因此我不打算在BIND中创建反向区域。
创建Glue记录 如果拥有域名example.com并且使用子域作为权威DNS服务器(ns1.example.com和ns2.example.com),则需要在域名注册商处创建Glue记录,Glue记录是ns1.example.com和ns2.example.com的A记录,创建Glue记录后,更改域名注册商控制面板上的名称服务器。 以上信息将发送给通过可扩展供应协议(EPP)运行TLD DNS服务器的注册管理执行机构,以便TLD DNS服务器知道你域名的authoritative DNS servers的名称和IP地址。 将Glue记录和NS记录传播到Internet后,你的DNS服务器将响应你的域名的DNS查询,可以使用以下命令检查查询日志: sudo journalctl -eu bind9
相关主题 |