使用BIND提供域名解析服务
DNS简介
主、从、缓存服务器
两种更新方式--递归和迭代
安装配置bind服务
软件包:bind-chroot(bind为软件包,chroot为牢笼机制的扩展包,限制bind仅能对自身的配置文件进行操作。)
服务程序名(linux上的软件名):named
主配置文件
:/etc/named.conf:这些参数用于定义bind服务程序的运行
区域配置文件
:/etc/named.rfc1912.zones:用来保存域名和IP地址对应关系的所在位置。类似于图书的目录,对应着每个域和相应IP地址所在的具体位置,当需要查看或修改时,可以根据这个位置找到相关文件。
数据配置文件
:/var/named:该目录用来保存域名和IP地址真实对应关系的数据配置文件。
主配置文件
——只需将其中的listen-on port 53{any;};改为any允许为任何IP提供DNS服务;
allow-query{any;};—允许任何IP对本Server发送DNS查询请求。
区域配置文件
:/etc/named.rfc1912.zones
需要在其中添加区域匹配文件—分为正向解析格式与反向解析格式。以及hint(根区域)、master(主区域)、slave(辅助区域)等定义。
正向解析格式:
zone “dyb.com” IN {
type master;
file “dyb.com.zone”;
allow-update {none;};
};
反向解析格式:
zone “31.168.192.in-addr.arpa” IN {
type master;
file ”192.168.31.arpa“;
allow-update {none;};
};
可以执行named-checkconf、named-checkzone 检查主配置文件与数据配置文件中的语法或参数的错误。
编辑数据配置文件
:/var/named目录下创建在区域配置文件中定义好的文件名称。(具体格式可参考该文件夹下的解析文件。)
1.cd /var/name
2.vim dyb.com.zone
正向解析格式:
$TTL 1D #生存周期为1天
@ IN SOA dyb.com. root.dyb.com. (
#授权信息开始|DNS区域的地址|#域名管理员的邮箱|0;serial #更新序列号
1D;refresh#更新时间
1H;retry#重试延时
1W;expire#失效时间
3H;)minimum#无效的解析记录的缓存时间
NS ns.dyb.com. #域名服务器记录
ns IN A 192.168.31.1 #地址记录(ns.dyb.com.)
IN MX 10 mail.dyb.com. #邮箱交换记录
mail IN A 192.168.31.1 #地址记录(mail.dyb.com.)
www IN A 192.168.31.1 #地址记录(www.dyb.com.)
bbs IN A 192.168.31.1 #地址记录(bbs.dyb.com.)
3.检验解析结果。
1.反向解析格式:
2.cd /var/named
3.vim 192.168.31.arpa
$TTL 1D
@ IN SOA dyb.com. root.dyb.com. (
0;serial
1D;refresh
1H;retry
1W;expire
3H);minimum
NS ns.dyb.com.
ns A 192.168.31.1
10 PTR ns.dyb.com.
10 PTR www.dyb.com.
20 PTR bbs.dyb.com.
4.使用nslooup检测结果。
特别说明
以下内容来源:https://www.cnblogs.com/xuwymm/p/15025610.html#1321-soa%E8%AE%B0%E5%BD%95
区域解析文件
(数据配置文件:/var/named)
-
自定义的区域数据库解析规范以及编写注意事项:
-
- 1.语法格式不要错
- 记录不能折行写
- 单行记录开头不允许以空格或TBA开头
- 文件权限属主root,属组named,权限640;
-
资源记录语法格式:
区域数据库解析文件是由资源记录RR组成的,不论哪种记录都包含五种元素,语法格式如下:
语法: name [TTL] IN rr_type value
name: 指示拥有资源记录的DNS域名,该名称与资源记录所在的控制台树点的名称相同。
TTl:
IN: 代表Internet
RR_TYPE: 资源记录类型-有六种。{SOA、NS、A(A\AAAA)、CNAME、MX、PTR}
value: 记录特定数据,描述资源的信息。
- @代表当前区域的域名,可以用来引用当前域名
- 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
- 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机;
-
资源记录类型:
-
-
SOA记录
-
SOA记录位于解析文件的开始(代表解析的开始),每个解析文件有且仅有一个SOA记录,用于描述这个区域的整体信息,格式如下:
$TTL 86400 <==定义整个记录的TTL时间为86400
|example.com. | IN | SOA | ns.example.com. | nsadmin.example.com.| (
| name | IN |TYPE| value 1 | value 2 |
2021071501 ;serial <==value 3
2H ;refresh <==value 4
10M ;retry <==value 5
1W ;expire <==value 6
1D ) ;negative answer ttl <==value 7
name 当前区域的名字,例如“example.com.” com后的点必须写,不然系统会自动将域名再补一次,变成"example.com.example.com."
type 资源类型为SOA类型
value1 主DNS的名称,例如ns.example.com.
value2 DNS服务器的管理员邮箱,注意:因为@在资源记录中有特殊含义,这里用点来代替,例如nsadmin.example.com.
value3 序列号(serial number) 十进制表示,不能超过10位,通常使用日期时间戳,例如2021071501;其作用是主从同步,当主DNS服务器的解析文件发生变化时,管理员需要手动更新此序列号的值,主服务器比对主从的序列号不一致,会立刻进行主从同步操作,否则会等待刷新时间到了才由从服务器同步主服务器数据。
value4 刷新时间,表示从服务器从主服务器请求同步解析的时间间隔,默认以秒为单位,支持1h、1d表示,例如:2H。
value5 重试时间,表示从服务器请求同步失败时,再次尝试同步的时间间隔,应该比同步间隔小 ,例如10m。
value6 过期时间,表示从服务器联系不到主服务器时,辅助DNS在多长时间内认为其缓存是有效的, 例如1W。
value7 否定答案的TTL值,表示不存在的记录缓存时长, 将不正确的域名缓存起来,直接返回结果给用户,不需要查询。
-
- NS记录
NS记录的格式如下:
name-当前区域的域名 | TTL | IN | TYPE-类型为NS | value-当前区域的某DNS服务器的域名 |
---|---|---|---|---|
example.com. | 86400 | IN | NS | ns1.example.com. |
example.com. | 86400 | IN | NS | ns2.example.com |
注意:
-
一个区域可以有多个NS记录,表示主从关系;
-
相邻的两个资源记录的name相同时,后续的可省略;
-
对NS记录而言,任何一个ns记录后面的服务器名字,都应该在后续有一个A记录,用于告知客户端DNS的地址。
ns1.example.com. 86400 IN A 192.168.169.5 ns2.example.com. 86400 IN A 192.168.169.6
-
- A与AAAA记录
A记录可实现域名与IPV4的转换,AAAA则为IPV6,两着格式是相同。
www.example.com. IN A 1.1.1.1
bbs.example.com. IN A 1.1.1.2
以上的元素意义如下:
元素 | 意义 |
---|---|
name | FQDN,即域名 |
type | 类型为A或AAAA |
value | 某IPv4地址或IPV6地址; |
-
- CNAME记录
CNAME为别名记录,格式如下:
www.example.com. 86400 IN CNAME www.example1.com.
以上的元素意义如下:
元素 | 意义 |
---|---|
name | FQDN,即域名 |
type | CNAME |
value | 真正名字的FQDN |
注意:
-
涉及到名字,也需要在A记录中增加对应的解析记录,例如:
www.example1.com. 86400 IN A 101.200.188.230
-
- PTR记录
PTR为逆向解析记录,由IP到域名解析,示例:
#表示把1.2.3.4的IP地址解析为www.example.com.域名
4.3.2.1.in-addr.arpa. 86400 IN PTR www.example.com.
#注意:网络地址及后缀可省略;主机地址依然需要反着写
4 86400 IN PTR www.example.com.
以上的元素意义如下:
元素 | 意义 |
---|---|
name | IP,有特定格式,把IP地址反过来写(例如1.2.3.4,要写作4.3.2.1);然后加特定后缀:in-addr.arpa.;所以完整写法为:4.3.2.1.in-addr.arpa. |
type | PTR |
value | FQDN |
-
- MX记录
MX为区域的邮件记录,一个区域内MX记录可以有多个,示例:
example.com. 86400 IN MX 10 mail.example.com.
86400 IN MX 20 mail2.example.com. <==name相同,下面的记录可以忽略此元素
#涉及到名字,需要在A记录中增加对应解析项:
mail 86400 IN A 3.3.3.3 <==mail为简写,其后没有加[ . ],会自动补上域名
mail2 86400 IN A 3.3.3.4
以上的元素意义如下:
元素 | 意义 |
---|---|
name | 当前区域的名字 |
type | MX |
value | 当前区域的某邮件服务器(smtp服务器)的主机名,由2部分组成:1.服务器的优先级,由数字(0-99)表示,表示此;数字越小优先级越高;2.服务器名; |
部署从服务器
部署从服务器还是非常简单的。只需要修改从Server区域配置文件以及将主服务器的相关功能(也是在区域配置文件中配置)打开即可。
1.在主服务器的区域配置文件允许从服务器的更新请求,及修改allow-update{IP;};并重启DNS即可。
zone “example.com” IN {
type master;
file “example.com.zone”;
allow-update{192.168.31.254;};
};
2.在从服务器中填写主服务器的IP地址与要抓取的区域信息,然后重启服务即可。注意 此时的服务类型应该是 slave(从),而 不再 是 master(主)masters 参数后面应该为主服务器 的 IP 地址,而且 file 参数后面定义的是同步数据配置文件后要保存到的位置,稍后可以在该 目录内看到同步的文件。
vim /etc/named.rfc1919.zones
zone “example.com” IN {
type slave;
masters {192.168.31.1;};
file “slaves/example.com.zone”;
};
3.检验解析结果。
部署安全加密传输
bind 服务程序为了提供安全的解析服务,已经对 TSIG(RFC 2845)加密机制提供了支持。TSIG 主要是利用了密码编码的方式来保护区域信息的传输(Zone Transfer),即 TSIG 加密机制保 证了 DNS 服务器之间传输域名区域信息的安全性。接下来的实验依然使用了表 13-2 中的两台服务器。
书接上回。前面在从服务器上配妥 bind 服务程序并重启后,即可看到从主服务器中获取到的数据配置文件。
总的来说,部署DNS的加密大体上可以分为六步:
1.在主服务器中生成密钥—》2.在主服务器中创建密钥认证文件—》3.开启并加载bind服务的密钥验证功能—》4.配置从服务器,时期支持密钥验证—》5.开启并加载从服务器的密钥验证功能。—》6.验证:DNS从服务器同步域名区域数据。
1.在主服务器中生成密钥。
dnssec-keygen命令用于生成安全的DNS服务密钥,常用参数如下:
dnssec-keygen
参数 | 作用 |
---|---|
-a | 指定加密算法 |
-b | 指定密钥长度 |
-n | 密钥的类型(HOST表示与主机相关) |
使用下述命令生成一个主机名称为 master-slave 的 128 位 HMAC-MD5 算法的密钥文件。 在执行该命令后默认会在当前目录中生成公钥和私钥文件,我们需要把私钥文件中 Key 参数 后面的值记录下来,一会儿要将其写入传输配置文件中。
[root@linuxprobe ~]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave
Kmaster-slave.+157+46845
[root@linuxprobe ~]# ls -al Kmaster-slave.+157+46845.*
-rw——-. 1 root root 56 Jun 7 16:06 Kmaster-slave.+157+46845.key
-rw——-. 1 root root 165 Jun 7 16:06 Kmaster-slave.+157+46845.private
[root@linuxprobe ~]# cat Kmaster-slave.+157+46845.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: 1XEEL3tG5DNLOw+1WHfE3Q
==
Bits: AAA=
Created: 20170607080621
Publish: 20170607080621
Activate: 20170607080621
2.在主服务器中创建密钥验证文件。进入bind服务程序用于保存配置文件的目录,把刚刚生成的密钥名称、加密算法、和私钥加密字符串按照下面的格式写入到transfer.key传输配置文件中。并且将文件的属组改为named,权限640.,然后把干文件做一个硬链接到/etc目录中。
[root@linuxprobe ~]# cd /var/named/chroot/etc/
[root@linuxprobe etc]# vim transfer.key
key “master-slave” {
algorithm hmac-md5;
secret “1XEEL3tG5DNLOw+1WHfE3Q==”;
};
[root@linuxprobe ~]# chown root:named transfer.key
[root@linuxprobe ~]# chmod 640 transfer.key
[root@linuxprobe ~]# ln transfer.key /etc/transfer.key
3.开启并加载BIND服务的密钥验证功能。首先在主服务器的主配置文件中加载密钥验证文件,然后进行设置,使得只允许带有master-slave密钥认证的DNS服务器同步数据配置文件:
[root@linuxprobe ~]# vim /etc/named.conf
1 //
2 // named.conf
3 //
4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
5 // server as a caching only nameserver (as a localhost DNS resolver only).
6 //
7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
8 //
9 ==include “/etc/transfer.key”; ===
10 options {
11 listen-on port 53 { any; };
12 listen-on-v6 port 53 { ::1; };
13 directory “/var/named”;
14 dump-file “/var/named/data/cache_dump.db”;
15 statistics-file “/var/named/data/named_stats.txt”;
16 memstatistics-file “/var/named/data/named_mem_stats.txt”;
17 allow-query { any; };
18 ==allow-transfer { key master-slave; }; ===
………………省略部分输出信息………………
[root@linuxprobe ~]# systemctl restart named
至此,DNS 主服务器的 TSIG 密钥加密传输功能就已经配置完成。此时清空 DNS 从服务 器同步目录中所有的数据配置文件,然后再次重启 bind 服务程序,这时就已经不能像刚才那 样自动获取到数据配置文件了。
4.配置从服务器,使其支持密钥验证。配置DNS从服务器和主服务器的方法大致相同,都需要在BIND服务程序带飞配置文件目录中创建密钥认证文件,并设置相应的权限,然后把该文件做一个硬链接到/etc目录中。
[root@linuxprobe ~]# cd /var/named/chroot/etc
[root@linuxprobe etc]# vim transfer.key
key “master-slave” {
algorithm hmac-md5;
secret “1XEEL3tG5DNLOw+1WHfE3Q==”;
};
[root@linuxprobe etc]# chown root:named transfer.key
[root@linuxprobe etc]# chmod 640 transfer.key
[root@linuxprobe etc]# ln transfer.key /etc/transfer.key
5.开启并加载从服务器的密钥验证功能。这一步的操作也同样是在主配置文件中加载密钥认证文件,然后按照指定格式写上主服务器的IP地址和密钥名称。注意,密钥名称等参数位置不要太考前,大约在43行比较合适,否则bind服务程序会因为没有加载完预设的参数而报错:
[root@linuxprobe etc]# vim /etc/named.conf
1 //
2 // named.conf
3 //
4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
5 // server as a caching only nameserver (as a localhost DNS resolver only).
6 //
7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
8 //
9 include “/etc/transfer.key”;
10 options {
11 listen-on port 53 { 127.0.0.1; };
12 listen-on-v6 port 53 { ::1; };
13 directory “/var/named”;
14 dump-file “/var/named/data/cache_dump.db”;
15 statistics-file “/var/named/data/named_stats.txt”;
16 memstatistics-file “/var/named/data/named_mem_stats.txt”;
17 allow-query { localhost; };
18
19 /*
20 – If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
21 – If you are building a RECURSIVE (caching) DNS server, you need to enable
22 recursion.
23 – If your recursive DNS server has a public IP address, you MUST enable access
24 control to limit queries to your legitimate users. Failing to do so will
25 cause your server to become part of large scale DNS amplification
26 attacks. Implementing BCP38 within your network would greatly
27 reduce such attack surface
28 */
29 recursion yes;
30
31 dnssec-enable yes;
32 dnssec-validation yes;
33 dnssec-lookaside auto;
34
35 /* Path to ISC DLV key */
36 bindkeys-file “/etc/named.iscdlv.key”;
37
38 managed-keys-directory “/var/named/dynamic”;
39
40 pid-file “/run/named/named.pid”;
41 session-keyfile “/run/named/session.key”;
42 };
43 server 192.168.10.10
44 {
45 keys { master-slave; };
46 };
47 logging {
48 channel default_debug {
49 file “data/named.run”;
50 severity dynamic;
51 };
52 };
53
54 zone “.” IN {
55 type hint;
56 file “named.ca”;
57 };
58
59 include “/etc/named.rfc1912.zones”;
60 include “/etc/named.root.key”;
61
6.验证:DNS从服务器同步域名区域数据。现在,两台服务器的 bind 服务程序都已经配 置妥当,并匹配到了相同的密钥认证文件。接下来在从服务器上重启 bind 服务程序,可以发现又能顺利地同步到数据配置文件了。
[root@linuxprobe ~]# systemctl restart named
[root@linuxprobe ~]# ls /var/named/slaves/
192.168.10.arpa linuxprobe.com.zone
部署缓存服务器
DNS 缓存服务器(Caching DNS Server)是一种不负责域名数据维护的 DNS 服务器。简单来说,缓存服务器就是把用户经常使用到的域名与 IP 地址的解析记录保存在主机本地,从而提 升下次解析的效率。DNS 缓存服务器一般用于经常访问某些固定站点而且对这些网站的访问速 度有较高要求的企业内网中,但实际的应用并不广泛。而且,缓存服务器是否可以成功解析还 与指定的上级 DNS 服务器的允许策略有关,因此当前仅需了解即可。
第1步:配置系统的双网卡参数。前面讲到,缓存服务器一般用于企业内网,旨在降低 内网用户查询 DNS 的时间消耗。因此,为了更加贴近真实的网络环境,实现外网查询功能,我们需要在缓存服务器中再添加一块网卡,并按照表 13-4 所示的信息来配置出两台 Linux 虚 拟机系统。而且,还需要在虚拟机软件中将新添加的网卡设置为“桥接模式”,然后设置成与 物理设备相同的网络参数(此处需要大家按照物理设备真实的网络参数来配置,图 13-6 所示 为以 DHCP 方式获取 IP 地址与网关等信息,重启网络服务后的效果如图 13-7 所示)。
第2步:在 bind 服务程序的主配置文件中添加缓存转发参数。在大约第 17 行处添加一 行参数“forwarders { 上级 DNS 服务器地址; };”,上级 DNS 服务器地址指的是获取数据配置 文件的服务器。考虑到查询速度、稳定性、安全性等因素,刘遄老师在这里使用的是北京市 公共 DNS 服务器的地址 210.73.64.1。如果大家也使用该地址,请先测试是否可以 ping 通, 以免导致 DNS 域名解析失败。
[root@linuxprobe ~]# vim /etc/named.conf
1 //
2 // named.conf
3 //
4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
5 // server as a caching only nameserver (as a localhost DNS resolver only).
6 //
7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
8 //
9 options {
10 listen-on port 53 { any; };
11 listen-on-v6 port 53 { ::1; };
12 directory “/var/named”;
13 dump-file “/var/named/data/cache_dump.db”;
14 statistics-file “/var/named/data/named_stats.txt”;
15 memstatistics-file “/var/named/data/named_mem_stats.txt”;
16 allow-query { any; };
17 forwarders { 210.73.64.1; };
………………省略部分输出信息………………
[root@linuxprobe ~]# systemctl restart named
第3步:重启 DNS 服务,验证成果。把客户端主机的 DNS 服务器地址参数修改为 DNS 缓存服务器的 IP 地址 192.168.10.10,如图 13-8 所示。这样即可让客户端使用本地 DNS 缓存 服务器提供的域名查询解析服务。
在将客户端主机的网络参数设置妥当后重启网络服务,即可使用 nslookup 命令来验 证实验结果(如果解析失败,请读者留意是否是上级 DNS 服务器选择的问题)。其中,Server 参数为域名解析记录提供的服务器地址,因此可见是由本地 DNS 缓存服务器提供的解析内容。
分离解析技术
主体思想:分区域,不同区域的用户访问不同区域的服务器。
大体上分四步:1.修改主配置文件,使any可以访问DNS服务,把51~54的根域信息删除—–》2.编辑区域配置文件——–》3.建立数据配置文件。——》4.重启服务并验证结果。
1.修改bind服务程序的主配置文件,把第11行的监听端口与17行的允许查询主机修改为any。由于配置的DNS分离解析功能与DNS根服务器配置参数有冲突,所以需要把第51~54行的跟与信息删除。
[root@linuxprobe ~]# vim /etc/named.conf
………………省略部分输出信息………………
44 logging {
45 channel default_debug {
46 file “data/named.run”;
47 severity dynamic;
48 };
49 };
50
51 zone “.” IN {
52 type hint;
53 file “named.ca”;
54 };
55
56 include “/etc/named.rfc1912.zones”;
57 include “/etc/named.root.key”;
58
………………省略部分输出信息………………
2.编辑区域配置文件。把区域配置文件中原有的数据清空,然后按照以下格式写入参数。首先使用acl参数分别定义两个变量名称(chian与american),当下面需要匹配IP地址时只需写入变量名称即可,这样不仅容易阅读识别,也利于修改维护。这里的难点是理解view参数的作用。它的作用是通过判断用户的IP地址是中国的还是美国的,然后去分别加在不同的数据配置文件(example.com.china或example.com.ameriacn)。这样,当把相应的IP地址分别写入数据配置文件后,即可实现DNS的分离解析功能,这样一来,当中国的用户访问example.com域名时,便会按照example.com.china数据配置文件内的IP地址找到对应的服务器。
[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
1 acl “china” {122.71.115.0/24;};
2 acl “american” {106.185.25.0/24;};
3 view “china” {
match-clients {“china”;};
zone “example.com” {
type master;
file “example.com.china”;
};
};
4 view “amercian” {
match-clients {“american”;};
zone “example.com” {
type master;
file “example.com.american”;
};
};
3.建立数据配置文件。分别通过模板文件创建出两份不同名称的区域数据文件,其名称应与上面区域配置文件中的参数相对应。
[root@linuxprobe ~]# cd /var/named
[root@linuxprobe named]# cp -a named.localhost example.com.china
[root@linuxprobe named]# cp -a named.localhost example.com.american
[root@linuxprobe named]# vim example.com.china
@ IN SOA example.com. root.example.com.(
0;serial
1D;refresh
1H;retry
1W;expire
3H);minimum
)
NS ns.exlample.com.
ns IN A 122.71.115.10
www IN A 112.71.115.15
[root@linuxprobe named]# vim example.com.amercian
$TTL 1D
@ IN SOA example.com. root.example.com. (
0;serial
1D;refresh
1H;retry
1W;expire
3H);minimum
NS ns.example.com.
ns IN A 106.185.25.10
www IN A 106.185.21.15
4.重启named,验证结果。将客户端主机(Windows 系统或 Linux
系统均可)的 IP 地址分别设置为 122.71.115.1 与 106.185.25.1,将 DNS 地址分别设置为服务 器主机的两个 IP 地址。这样,当尝试使用 nslookup 命令解析域名时就能清晰地看到解析结果,分别如图 13-10 与图 13-11 所示。