BIND DNS服务高可用(一) 主服务器部署

1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

环境介绍

操作系统IP地址主机名BIND版本角色
rhel8172.25.250.10serveraBIND 9主DNS服务器
rhel8172.25.250.11serverbBIND 9辅助DNS服务器

BIND 9 DNS服务介绍

BIND 9 是一个强大且广泛使用的 DNS 服务软件,适用于多种应用场景,并且拥有活跃的社区支持和持续的更新

为权威名称服务器设计架构

通过 BIND,可以将权威服务器配置为区域的主要或次要服务器

次要服务器通过请求区域传送定期从主服务器下载最新版本的区域信息。它们多久执行一次区域传送以及如何判断其数据是否过期都由区域的 SOA 资源记录控制。

为了确保可靠性,应至少具有两个公共 DNS 服务器,并且它们应位于不同的站点,以避免由于网络故障而造成的停机。

并非所有权威服务器都必须是公共服务器。例如,你可能决定仅使用您的主服务器来管理区域文件,并将区域信息发布到权威次要服务器。主服务器可以是私有服务器,但次要服务器将是面向公共的,为外部客户端提供权威应答。这可帮助您保护您的主服务器免受攻击。

下图显示了外部主机如何使用其缓存名称服务器和权威名称服务器对 example.com 中的记录执行 DNS 查找,假设尚未缓存任何记录:

在本示例中,主名称服务器实际上不是公共的,而是可以从主服务器执行区域传送的次要名称服务器,以便它们拥有关于 example.com 区域的最新数据。

安装配置bind

安装bind

通过安装 bind 软件包来安装 BIND。名称服务器本身作为 named 服务运行。bind 软件包也会以 HTML 和 PDF 格式在 /usr/share/doc/bind/ 目录中安装综合 BIND 文档。

1
[root@servera ~]# yum install bind -y

启动bind服务

1
[root@servera ~]# systemctl enable named.service --now

开通防火墙

1
2
[root@servera ~]# firewall-cmd --add-service=dns --permanent
[root@servera ~]# firewall-cmd --reload

配置 主BIND服务器

named 使用的主配置文件是 /etc/named.conf。此文件控制 BIND 的基本操作。它应由 root 用户、named 组所有,具有八进制权限 0640,并且具有 named_conf_t SELinux 类型。此文件一般以封号结尾

配置文件还指定由权威服务器管理的每个区域的区域文件的位置,这些文件通常保存在 /var/named 中。

配置 DNS 服务器需要以下步骤:

  • 定义地址匹配列表,以便于维护。

  • 配置named 侦听的 IP 地址。

  • 配置客户端的访问控制。

  • 指定 zone 指令。

  • 在 /etc/named.conf 配置文件的外部,写入区域文件。

定义地址匹配列表

以使用 acl 指令来定义地址匹配列表,这个acl位于options的上方

条目可以是由尾部点 (192.168.0.) 或 CIDR 表示法(192.168.0/24 或 2001:db8::/32)表示的完整 IP 地址或网络,或者是之前定义的地址匹配列表的名称。

我定义了一个名为 trusted 的 ACL,其中只包含多个 IP 地址 172.25.0/16

又定义了一个名为 classroom 的 ACL,它包含了一个网络段 192.168.0.0/24以及trusted里的所有IP

1
2
acl trusted         { 172.25.0/16; };
acl classroom { 192.168.0.0/24; trusted; };

named 中内置有四个预定义的 ACL:

ACL描述
none无匹配主机。
any匹配全部主机。
localhost匹配 DNS 服务器的全部 IP 地址。
localnets匹配 DNS 服务器所在本地子网的全部主机。

配置服务器接口

listen-on 和 listen-on-v6,用于指示 named 侦听的接口和端口,可以用封号表达多个,甚至直接使用你的acl名称也可以

1
2
3
4
acl trusted         { 172.25.0/16; };
acl classroom { 192.168.0.0/24; trusted; };
options {
listen-on port 53 { 127.0.0.1; 172.25.250.10; trusted; };

限制访问

/etc/named.conf 中的三个附加 options 指令对于控制访问非常重要:

  • allow-query 控制所有查询。

  • allow-recursion 控制递归查询。

  • allow-transfer 控制区域传送。

默认情况下, allow-query 设置为 localhost,根据需求更改,例如any

1
allow-query     { localhost; };

权威服务器不应允许递归查询。如果您必须允许受信任的客户端执行递归,您可以打开递归,并为这些特定的主机或网络设置 allow-recursion

权威 DNS 服务器是为其管理的特定域名提供确切答案的服务器。它们不需要执行递归查询,因为它们本身就是所查询域的权威数据源

递归 DNS 服务器通常用于客户端查询,它们会代表客户端向其他 DNS 服务器查询以获取查询结果,并可能将结果缓存起来以加快响应速度。

1
2
recursion yes;
allow-recursion { trusted; };

声明权威区域

/etc/named.conf 中最下面的内容定义了区域文件,不过建议在include的文件中修改

1
2
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
1
[root@servera ~]# vim /etc/named.rfc1912.zones

file 指令指定相对路径名称。这些文件的位置由 options 块中的 directory 设置决定(默认为 /var/named/)。始终将 named.conf 配置为将次要区域文件保存在 slaves/ 子目录中,其 SELinux 类型为 named_cache_t。SELinux 会阻止 named 在其他位置创建文件。

这里提前添加了辅助服务器需要的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
zone "lixiaohui.cn" IN {
type master;
file "lixiaohui.cn.zone";
allow-update { none; };
allow-transfer { 172.25.250.11; };
notify yes;
also-notify { 172.25.250.11; };
};
zone "250.25.172.in-addr.arpa" IN {
type master;
file "lixiaohui.cn.ptr";
allow-update { none; };
allow-transfer { 172.25.250.11; };
notify yes;
also-notify { 172.25.250.11; };
};

编辑区域文件

区域文件的位置由 options 块中的 directory 指令和 /etc/named.conf 中的区域配置中的 file 指令控制。

如果您将次要区域文件保存在 /var/named/slaves 中,那么当次要服务器启动时,它会将该区域的缓存版本与主服务器上的当前版本进行比较,如果是最新状态,则使用它。如果区域不是最新的,或者文件不存在,则 named 会执行区域传送,并将结果缓存到该文件中。

区域文件应由 root 用户、named 组所有,具有八进制权限 0640,并且具有 named_conf_t SELinux 类型。

1
2
3
4
5
[root@servera ~]# cd /var/named/
[root@servera named]# ls
data dynamic named.ca named.empty named.localhost named.loopback slaves
[root@servera named]# cp named.localhost lixiaohui.cn.zone
[root@servera named]# cp named.loopback lixiaohui.cn.ptr
1
2
3
4
5
6
[root@servera named]# chmod 640 /var/named/*.zone
[root@servera named]# chmod 640 /var/named/*.ptr
[root@servera named]# chcon -t named_zone_t /var/named/*.zone
[root@servera named]# chcon -t named_zone_t /var/named/*.ptr
[root@servera named]# chown root:named /var/named/*.zone
[root@servera named]# chown root:named /var/named/*.ptr

区域文件格式

BIND 区域文件是一种文本文件,每行包含一个指令或资源记录。如果资源记录的数据中包含圆括号,它可以跨越多行。在同一物理行上分号 (;) 右侧的所有内容都将被注释掉。

区域文件可能以 $TTL 指令开头,该指令可为没有列出 TTL 的任何资源记录设置默认 TTL。这使您可以一次调整多个资源记录的 TTL,而无需编辑整个文件。如果 TTL 是一个数字,它将以秒为计量单位。

1
$TTL 3600

默认是秒,这个数字后可以跟一个字母,以指定更长的时间段:

  • M 表示分钟(1M 为 60

  • H 表示小时(1H 为 3600

  • D 表示天(1D 为 86400

  • W 表示周 (1W 为 604800

每个区域文件都包含一个 SOA (授权起始)资源记录,如下所示

1
2
3
4
5
6
7
$TTL 1D
lixiaohui.cn IN SOA ns.lixiaohui.cn. 939958092.qq.com. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
  • 第一行规定了TTL默认为1天

  • 第二行最开始写了本区域的域名,也可以缩写为一个@,随后的IN SOA是表明这是互联网的SOA记录

  • 第二行中的ns.lixiaohui.cn.部分是本区域的NS主机,注意以英文的句号结尾

  • 第二行中的939958092.qq.com. 是本区域维护人的邮箱地址,我写了我的QQ邮箱,但是要把@变为英文的点,因为@在文件中有特别的意思

  • serial代表文件版本的序列号。每次文件发生更改时,该序列号都必须增加。每次在主服务器上更新区域文件时,您必须增加序列号,并重新加载 named

  • refresh次要服务器应多久查询一次主服务器,以查看是否需要进行区域刷新。

  • retry 如果主服务器停机导致刷新失败,次要服务器应多久尝试一次重新连接。

  • expire 在放弃之前,次要服务器应尝试重新连接到不响应的主服务器的时长。如果发生超时,次要服务器将假设该区域不再存在,并停止对其查询的应答。

  • minimum 其他名称服务器应缓存该区域负(“无此类记录”)响应的时长。例如,如果 minimum 设置为 3H,这表示对于该区域不存在的记录,DNS 服务器将缓存这个 NXDOMAIN 的结果长达 3 小时。在这 3 小时内,即使再次查询相同的不存在的记录,DNS 服务器也会直接返回缓存中 NXDOMAIN 的结果,而不需要再次发起查询请求

将记录添加到区域文件

正常来说,区域文件必须具有:

  • 一条 SOA 记录。

  • 每个公共名称服务器的 NS 记录。

  • 区域的其他 A、AAAA、CNAME、MX、SRV 和 TXT 记录。

正向区域文件

1
[root@servera ~]# vim /var/named/lixiaohui.cn.zone

一般来说,不需要在记录前面指定TTL,因为第一行写了1D

1
2
3
4
5
6
7
8
9
10
11
12
13
$TTL 1D
lixiaohui.cn. IN SOA ns.lixiaohui.cn. 939958092.qq.com. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
1D IN NS ns.lixiaohui.cn.
ns 1D IN A 172.25.250.10
lxh 30 IN A 172.25.250.100
30 IN AAAA 2001:db8:2020::5300
@ 20 IN MX 10 mail.lixiaohui.cn.
mail 30 IN A 172.25.250.10

查询测试

发现TTL为30,的确是生效了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@servera named]# dig -t a lxh.lixiaohui.cn @172.25.250.10

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> -t a lxh.lixiaohui.cn @172.25.250.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63979
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 4756cdaceb0d67483c8a646766c763c2179ad76011e94218 (good)
;; QUESTION SECTION:
;lxh.lixiaohui.cn. IN A

;; ANSWER SECTION:
lxh.lixiaohui.cn. 30 IN A 192.168.8.100

;; AUTHORITY SECTION:
lixiaohui.cn. 86400 IN NS ns.lixiaohui.cn.

;; ADDITIONAL SECTION:
ns.lixiaohui.cn. 86400 IN A 172.25.250.10

;; Query time: 0 msec
;; SERVER: 172.25.250.10#53(172.25.250.10)
;; WHEN: Fri Aug 23 00:13:54 CST 2024
;; MSG SIZE rcvd: 122

反向区域文件

1
[root@servera ~]# vim /var/named/lixiaohui.cn.ptr
1
2
3
4
5
6
7
8
9
10
$TTL 1D
@ IN SOA ns.lixiaohui.cn. 939958092.qq.com. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns.lixiaohui.cn.
10 IN PTR ns.lixiaohui.cn.
100 IN PTR lxh.lixiaohui.cn.

查询测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@servera named]# dig -x 172.25.250.10 @172.25.250.10

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> -x 172.25.250.10 @172.25.250.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13818
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 5cfd05c2de214996511d482266c7633236d99e1de8817760 (good)
;; QUESTION SECTION:
;10.250.25.172.in-addr.arpa. IN PTR

;; ANSWER SECTION:
10.250.25.172.in-addr.arpa. 86400 IN PTR ns.lixiaohui.cn.

;; AUTHORITY SECTION:
250.25.172.in-addr.arpa. 86400 IN NS ns.lixiaohui.cn.

;; ADDITIONAL SECTION:
ns.lixiaohui.cn. 86400 IN A 172.25.250.10

;; Query time: 0 msec
;; SERVER: 172.25.250.10#53(172.25.250.10)
;; WHEN: Fri Aug 23 00:11:30 CST 2024
;; MSG SIZE rcvd: 142

子域委托

可以将整个子域作为含有其父域的区域的一部分进行设置和管理,例如添加 support.online.lixiaohui.cn 和 test.online.lixiaohui.cn 的记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$TTL 1D
lixiaohui.cn. IN SOA ns.lixiaohui.cn. 939958092.qq.com. (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
1D IN NS ns.lixiaohui.cn.
ns 1D IN A 172.25.250.10
lxh 30 IN A 192.168.8.100
30 IN AAAA 2001:db8:2020::5300
@ 20 IN MX 10 mail.lixiaohui.cn.
mail 30 IN A 172.25.250.10
support.online 1H IN A 172.25.250.10

查询发现DNS解析成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@servera named]# dig -t a support.online.lixiaohui.cn @localhost

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> -t a support.online.lixiaohui.cn @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61584
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: d5d561bd5d71672046a5414966c765e14864ded5735acf36 (good)
;; QUESTION SECTION:
;support.online.lixiaohui.cn. IN A

;; ANSWER SECTION:
support.online.lixiaohui.cn. 3600 IN A 172.25.250.10

;; AUTHORITY SECTION:
lixiaohui.cn. 86400 IN NS ns.lixiaohui.cn.

;; ADDITIONAL SECTION:
ns.lixiaohui.cn. 86400 IN A 172.25.250.10

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Fri Aug 23 00:22:57 CST 2024
;; MSG SIZE rcvd: 133

验证配置文件

在重新加载或重新启动 named 之前,您应验证 /etc/named.conf 和区域文件的语法。

  • named-checkconf 验证 /etc/named.conf

  • named-checkzone zone zone-file 验证 zone-file 中 zone 的区域文件。

1
2
3
4
5
[root@servera named]# named-checkconf /etc/named.conf
[root@servera named]# named-checkconf /etc/named.rfc1912.zones
[root@servera named]# named-checkzone lixiaohui.cn /var/named/lixiaohui.cn.zone
zone lixiaohui.cn/IN: loaded serial 1
OK

如果服务起不来或者想看到详细内容,可以用下面的方法查看详情

1
[root@servera named]# journalctl -xeu named