一、Bind9自建私有权威DNS

1.1Bind9简介

企业内部经常需要搭建内部的DNS服务器,现在使用最为广泛的DNS服务器软件是BIND(Berkeley Internet Name Domain),最早有伯克利大学的一名学生编写,现在最新的版本是9,有ISC(Internet Systems Consortium)编写和维护。BIND支持先今绝大多数的操作系统(Linux,UNIX,Mac,Windows),BIND服务的名称称之为named。DNS默认使用UDP、TCP协议,使用端口为53(domain),953(mdc,远程控制使用)。

1.2名词解析

DNS: 域名解析服务(DomainNameSystem),是用于解析域名与IP地址对应关系的服务。
LDNS: Local DNS 也称为递归 DNS、缓存 DNS,核心功能是缓存、递归查询。收到域名查询请求后,Local DNS 首先查看本地缓存中是否有记录。如果没有则逐级查询根域、顶级域、二级域等,直到获取到结果然后返回给用户。一般来说,运营商(例如联通、移动、电信)分配的 DNS 就是 Local DNS,主要功能是帮助运营商的网络用户去相应的权威 DNS 服务查询域名解析结果,其查询结果直接影响某一运营商的所有网络用户。
权威 DNS: 权威 DNS 是域名注册商处的 DNS 服务器,用于管理特定域名(比如增加、删除、修改等)。权威 DNS 服务器一般由域名解析服务商建设,供购买自己域名服务的用户使用,方便管理域名记录。由于权威 DNS 服务器需要接受 Local DNS 服务器的查询,其结果直接影响某一域名解析服务商的所有用户,间接影响所有网民。中小型公司一般会选择一家知名的权威 DNS 服务商提供的托管服务,比如阿里云云解析 DNS。
正向解析: 根据主机名(域名)查找对应的IP地址。
反向解析: 根据IP地址查找对应的主机名(域名)。

1.3DNS解析过程

image.png
image.png
1.当被询问到有关本地管理区所授权的域名时﹐DNS服务器会直接做出回答﹔
2.如果所查询的域名属于其它区域的话﹐会检查缓存﹐看看有没有相关数据;
3.如果没有发现﹐则会转向根节点服务器查询﹔
4.然后根节点服务器会将该区域授权服务器(可能会超过一台)的地址告知本地服务器﹔
5.本地服务器然后向其中的一授权台服务器查询﹐并将这些服务器名单存到缓存中(省却再向 根查询的步骤)﹔
6.远方服务器回应查询﹔
将结果存储在缓存中,并同时将结果响应给客户,从步骤1到步骤7是一个完整的递归解析过程;
7.如果缓存的记录存放时间尚未过期之前再接到相同的查询﹐则以存放在缓存中的数据来做响应。

1.4安装

1.4.1 在线安装

1.Ubuntu
使用apt安装
apt install -y bind9 bind9-host dnsutils bind9-doc

1.4.2源码编译安装

1.5配置解析

1.5.1配置角色

一些最常见的配置是缓存名称服务器,主服务器和辅助服务器。
1.当配置为缓存名称服务器时,BIND9将找到名称查询的答案,并在再次查询域时记住答案。
2.作为主要服务器,BIND9从其主机上的文件中读取区域的数据,并且对该区域具有权威性。
3.作为辅助服务器,BIND9从另一个对该区域具有权威性的名称服务器获取区域数据。

1.5.2配置文件概览

DNS配置文件存储在 /etc/bind 目录中。主要配置文件是 /etc/bind/named.conf ,在软件包提供的布局中仅包括这些文件。
1.named.conf: 设置一般的named参数,指向该服务器使用的域数据库的信息源
2.db.root: 根服务器指向文件, 由Internet NIC创建和维护, 无需修改, 但是需要定期更新
3.db.local: localhost正向区文件,用于将名字localhost转换为本地回送IP地址 (127.0.0.1)
4.db.127: localhost反向区文件,用于将本地回送IP地址(127.0.0.1)转换为名字localhost
5./etc/bind/named.conf.options:DNS 全局选项配置文件
6./etc/bind/named.conf.local:自定义区域配置文件
7./etc/bind/named.conf.default-zones:默认区域,例如localhost,其反向和根提示
8.根名称服务器曾经在文件中描述过 /etc/bind/db.root 。 现在由软件包 /usr/share/dns/root.hints 附带的文件提供了此功能 dns-root-data,并且在 named.conf.default-zones 上面的配置文件中对此进行了引用。

可以将同一服务器配置为缓存名称服务器,主要和辅助名称服务器:这都取决于它所服务的区域。服务器可以是一个区域的授权开始(SOA),同时为另一区域提供辅助服务。同时为本地LAN上的主机提供缓存服务。

1.5.3缓存名称服务器

默认配置充当缓存服务器,连接外网的DNS,本地没有去查找外网的DNS服务器。只需取消注释并编辑 /etc/bind/named.conf.options 即可设置ISP的DNS服务器的IP地址:

  1. forwarders {
  2. 8.8.8.8;
  3. 114.114.114.114;
  4. };

注意:用实际 DNS 服务器的IP地址替换 8.8.8.8和 114.114.114.114。
要启用新配置,请重新启动DNS服务器。systemctl restart bind9.service

1.5.4主服务器

将BIND9配置为域的主服务器 duancox.com。只需 duancox.com 用您的FQDN(完全合格的域名)替换即可。

1.5.4.1转发区域文件

将DNS区域添加到BIND9,将BIND9变成主服务器,
首先编辑 /etc/bind/named.conf.local:

  1. zone "duancox.com" {
  2. type master;
  3. file "/etc/bind/db.duancox.com";
  4. };

注意:如果bind将像使用DDNS一样接收文件的自动更新,请在此处以及下面的复制命令中使用 /var/lib/bind/db.duancox.com 而不是 /etc/bind/db.duancox.com。

现在,使用现有的区域文件作为模板来创建 /etc/bind/db.duancox.com 文件:
cp /etc/bind/db.local /etc/bind/db.duancox.com
编辑新的区域文件,/etc/bind/db.duancox.com 然后更改 localhost.为服务器的FQDN,.在末尾保留其他文件。更改 127.0.0.1 为名称服务器的IP地址和 root.localhost 有效的电子邮件地址,但用.代替通常的@符号,并再次.在末尾保留。更改注释以指示此文件所针对的域。
为基本域创建A记录example.com。此外,创建一个A记录的ns.duancox.com,在这个例子中,域名服务器:

  1. ;
  2. ; BIND data file for local loopback interface
  3. ;
  4. $TTL 604800
  5. @ IN SOA duancox.com. root.duancox.com. (
  6. 2 ; Serial
  7. 604800 ; Refresh
  8. 86400 ; Retry
  9. 2419200 ; Expire
  10. 604800 ) ; Negative Cache TTL
  11. ;
  12. @ IN NS ns.duancox.com.
  13. @ IN A 192.168.68.150
  14. @ IN AAAA ::1
  15. ns IN A 192.168.68.150

每次更改区域文件时,都必须增加序列号(Serial)。如果在重新启动BIND9之前进行了多次更改,只需增加一次串行。
现在,您可以将DNS记录添加到区域文件的底部。
对区域文件进行了更改之后,需要重新启动BIND9以使更改生效 systemctl restart bind9.service

1.5.4.2反向区域文件

现在已经设置了区域并将名称解析为IP地址,现在需要添加反向区域以允许DNS将地址解析为名称。
编辑 /etc/bind/named.conf.local 并添加以下内容:

  1. zone "68.168.192.in-addr.arpa" {
  2. type master;
  3. file "/etc/bind/db.192";
  4. };

注意:
将 68.168.192 替换为所用网络的前三个八位位组。 另外,适当命名区域文件 /etc/bind/db.192。 它应与网络的第一个八位位组匹配。
现在创建 /etc/bind/db.192 文件:
sudo cp /etc/bind/db.127 /etc/bind/db.192
接下来编辑 /etc/bind/db.192,更改与/etc/bind/db.duancox.com相同的选项:

  1. ;
  2. ; BIND reverse data file for local loopback interface
  3. ;
  4. $TTL 604800
  5. @ IN SOA ns.duancox.com. root.duancox.com. (
  6. 1 ; Serial
  7. 604800 ; Refresh
  8. 86400 ; Retry
  9. 2419200 ; Expire
  10. 604800 ) ; Negative Cache TTL
  11. ;
  12. @ IN NS ns.
  13. 150 IN PTR ns.duancox.com.

每次更改时,“反向”区域中的序列号也需要增加。
在/etc/bind/db.duancox.com中配置的每个A记录(即针对另一个地址),您需要在/etc/bind/db.192中创建一个PTR记录。
创建反向区域文件后,重新启动BIND9 systemctl restart bind9.service

1.5.4.3辅助服务器

配置了主服务器,强烈建议使用辅助服务器,以在主服务器不可用时维持域的可用性。
首先,在主服务器上,需要允许区域传输。将 allow-transfer 选项添加到示例正向和反向区域定义中 /etc/bind/named.conf.local:

  1. zone "example.com" {
  2. type master;
  3. file "/etc/bind/db.example.com";
  4. allow-transfer { 192.168.68.151;
  5. };
  6. };
  7. zone "1.168.192.in-addr.arpa" {
  8. type master;
  9. file "/etc/bind/db.192";
  10. allow-transfer { 192.168.68.151;
  11. };
  12. };

注意:替换192.168.68.151为辅助名称服务器的IP地址。
在主服务器上重新启动BIND9:
systemctl restart bind9.service

接下来,在辅助服务器上,以与主服务器相同的方式安装bind9软件包。
然后编辑,/etc/bind/named.conf.local 并为正向和反向区域添加以下声明:

  1. zone "example.com" {
  2. type slave;
  3. file "db.duancox.com";
  4. masters { 192.168.68.150;
  5. };
  6. };
  7. zone "1.168.192.in-addr.arpa" {
  8. type slave;
  9. file "db.192";
  10. masters { 192.168.68.150;
  11. };
  12. };

注意:替换192.168.68.150为您的主要名称服务器的IP地址。
在辅助服务器上重新启动BIND9:systemctl restart bind9.service
在其中,/var/log/syslog 您应该看到类似以下内容的内容(为了适应本文档的格式,对某些行进行了拆分):

注意:仅当主服务器上的序列号大于辅助服务器上的序列号时,才会传输区域。如果要让您的主DNS通知其他辅助DNS服务器区域更改,则可以将其添加also-notify { ipaddress; };到/etc/bind/named.conf.local以下示例中:

  1. zone "duancox.com" {
  2. type master;
  3. file "/etc/bind/db.duancox.com";
  4. allow-transfer { 192.168.68.151;
  5. };
  6. also-notify { 192.168.68.151;
  7. };
  8. };
  9. zone "1.168.192.in-addr.arpa" {
  10. type master;
  11. file "/etc/bind/db.192";
  12. allow-transfer { 192.168.68.151;
  13. };
  14. also-notify { 192.168.68.151;
  15. };
  16. };

注意
非权威区域文件的默认目录为/var/cache/bind/。该目录还在AppArmor中配置为允许命名守护程序向其写入.

1.6测试

1.6.1resolv.conf

测试BIND9的第一步是将名称服务器的IP地址添加到主机解析器。应该配置主要名称服务器以及另一个主机,以仔细检查。最后,nameserver一行/etc/resolv.conf应指向,127.0.0.53并且您应该search为您的域指定一个参数。像这样:

  1. nameserver 127.0.0.53
  2. search example.com

要检查您的本地解析器正在使用哪个DNS服务器,请运行:
systemd-resolve —status
注意
如果主要服务器不可用,您还应该将辅助名称服务器的IP地址添加到客户端配置中。

1.6.2dig

如果安装了dnsutils软件包,则可以使用DNS查找实用程序dig测试设置:
安装完BIND9之后,请对环回接口使用dig来确保它正在侦听端口53。从终端提示符下:
dig -x 127.0.0.1
您应该在命令输出中看到类似于以下内容的行:
;; Query time: 1 msec ;; SERVER: 192.168.1.10#53(192.168.1.10)
如果您已将BIND9配置为缓存名称服务器,则“挖掘”外部域以检查查询时间:
dig ubuntu.com
注意查询时间接近命令输出的末尾:
;; Query time: 49 msec
经过第二次挖掘后,应该有所改进:
;; Query time: 1 msec

1.6.3ping

现在演示应用程序如何使用DNS解析主机名,使用ping实用程序发送ICMP回显请求:
ping example.com
这测试名称服务器是否可以将名称解析为ns.example.com IP 地址。 命令输出应类似于:
PING ns.example.com (192.168.1.10) 56(84) bytes of data. 64 bytes from 192.168.1.10: icmp_seq=1 ttl=64 time=0.800 ms 64 bytes from 192.168.1.10: icmp_seq=2 ttl=64 time=0.813 ms

1.6.7named-checkzone

测试区域文件的一种好方法是使用 named-checkzone 与bind9软件包一起安装的实用程序。使用此实用程序,可以在重新启动BIND9并使更改生效之前确保配置正确。
要测试我们的示例正向区域文件,请从命令提示符处输入以下内容:
named-checkzone example.com /etc/bind/db.example.com
如果一切配置正确,您应该会看到类似以下的输出:
zone example.com/IN: loaded serial 6 OK
同样,要测试反向区域文件,请输入以下内容:
named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192
输出应类似于:
zone 1.168.192.in-addr.arpa/IN: loaded serial 3 OK

日志

BIND9有多种可用的日志记录配置选项,但是两个主要的选项是channel和category,它们分别配置日志的去向和要记录的信息。
如果未配置任何日志记录选项,则默认配置为:
logging { category default { default_syslog; default_debug; }; category unmatched { null; }; };
让我们将BIND9配置为将与DNS查询相关的调试消息发送到单独的文件。
我们需要配置一个通道以指定要将消息发送到的文件,以及一个category。在此示例中,类别将记录所有查询。编辑/etc/bind/named.conf.local并添加以下内容:
logging { channel query.log { file “/var/log/named/query.log”; severity debug 3; }; category queries { query.log; }; };
注意
该调试选项可以从1设置为3。如果没有指定级别,1级是默认的。
由于命名守护程序以绑定用户身份运行,因此/var/log/named必须创建目录并更改所有权:
sudo mkdir /var/log/named sudo chown bind:bind /var/log/named
现在重新启动BIND9,以使更改生效:
sudo systemctl restart bind9.service
您应该看到文件中/var/log/named/query.log填充了查询信息。这是BIND9日志记录选项的简单示例。
注意
您的区域文件的序列号可能会有所不同。

进入bind文件夹
cd /etc/bind