linux-运维进阶-19 bind提供域名解析服务

linux-运维进阶-19 bind提供域名解析服务

概念解析

DNS域名解析服务

  很早很早之前,人们通过ip地址来上网,后来,人们觉得,相较于由数字构成的IP地址,域名更容易被理解和记忆,所以我们通常更习惯通过域名的方式来访问网络中的资源。但是,网络中的计算机之间只能基于IP地址来相互识别对方的身份,而且要想在互联网中传输数据,也必须基于外网的IP地址来完成。

  为了降低用户访问网络资源的门槛,DNS(Domain Name System,域名系统)技术应运而生。这是一项用于管理和解析域名与IP地址对应关系的技术,简单来说,就是能够接受用户输入的域名或IP地址,然后自动查找与之匹配(或者说具有映射关系)的IP地址或域名,即将域名解析为IP地址(正向解析),或将IP地址解析为域名(反向解析)。这样一来,我们只需要在浏览器中输入域名就能打开想要访问的网站了。DNS域名解析技术的正向解析也是我们最常使用的一种工作模式。

  鉴于互联网中的域名和IP地址对应关系数据库太过庞大,DNS域名解析服务采用了类似目录树的层次结构来记录域名与IP地址之间的对应关系,从而形成了一个分布式的数据库系统,

DNS域名解析服务采用的层次目录结构

  如下图,DNS域名解析服务中,一级域名例如.com .net .org等,而二级域名有google taobao等,三级域名如www等。连起来就是www.google.com。

1eoh1s.png

  域名后缀一般分为国际域名和国内域名。原则上来讲,域名后缀都有严格的定义,但在实际使用时可以不必严格遵守。目前最常见的域名后缀有.com(商业组织)、.org(非营利组织)、.gov(政府部门)、.net(网络服务商)、.edu(教研机构)、.pub(公共大众)、.cn(中国国家顶级域名)等。

  当今世界的信息化程度越来越高,大数据、云计算、物联网、人工智能等新技术不断涌现,全球网民的数量据说也超过了35亿,而且每年还在以10%的速度迅速增长。这些因素导致互联网中的域名数量进一步激增,被访问的频率也进一步加大。假设全球网民每人每天只访问一个网站域名,而且只访问一次,也会产生35亿次的查询请求,如此庞大的请求数量肯定无法被某一台服务器全部处理掉。DNS技术作为互联网基础设施中重要的一环,为了为网民提供不间断、稳定且快速的域名查询服务,保证互联网的正常运转,提供了下面三种类型的服务器。

主服务器

  在特定区域内具有唯一性,负责维护该区域内的域名与IP地址之间的对应关系。

从服务器

  从主服务器中获得域名与IP地址的对应关系并进行维护,以防主服务器宕机等情况。

缓存服务器

  通过向其他域名解析服务器查询获得域名与IP地址的对应关系,并将经常查询的域名信息保存到服务器本地,以此来提高重复查询时的效率。

  简单来说,主服务器是用于管理域名和IP地址对应关系的真正服务器,从服务器帮助主服务器“打下手”,分散部署在各个国家、省市或地区,以便让用户就近查询域名,从而减轻主服务器的负载压力。缓存服务器不太常用,一般部署在企业内网的网关位置,用于加速用户的域名查询请求。

  DNS域名解析服务采用分布式的数据结构来存放海量的“区域数据”信息,在执行用户发起的域名查询请求时,具有递归查询和迭代查询两种方式。所谓递归查询,是指DNS服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果DNS服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。而迭代查询则是指,DNS服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台DNS服务器的地址,用户再向这台DNS服务器提交请求,这样依次反复,直到返回查询结果。

用户向就近的一台DNS服务器发起对某个域名的查询大致流程

1eoafH.png

  当用户向网络指定的DNS服务器发起一个域名请求时,通常情况下会有本地由此DNS服务器向上级的DNS服务器发送迭代查询请求;如果该DNS服务器没有要查询的信息,则会进一步向上级DNS服务器发送迭代查询请求,直到获得准确的查询结果为止。其中最高级、最权威的根DNS服务器总共有13台,分布在世界各地。

根域名服务器

  根域名服务器是域名解析体系的核心,握有域名的最终解释权,简单来说,如果要查询域名,均需要从根域名服务器开始查询。域名服务器是提供域名解析的服务器,在有基本的知识下,任何人都可以搭建域名服务器,甚至是根域名服务器,有名的软件有:BIND。

全球只有13台根服务器的准确说法

  域名服务器就像许多国际组织一样,是需要被承认的,当你的根域名服务器被全世界承认,你的服务器也可以成为这其中的一员。因为互联网起源于美国,域名体系也是诞生于美国,在互联网不断扩张和发展的过程中,逐渐形成了13台服务器为全球根服务器。这13台根服务器由ICANN管理,由12个机构具体运营。13台根服务器如下图所示:

1eo5Xq.png

13台根域名服务器从a至m编号,分属12个运营机构运营。

  但是,网上新闻中有些说法并不准确,举个反例:“全世界只有13台根域名服务器,名字分别为A至M,其中一个主根服务器在美国,其余12个均为辅根服务器,其中9个在美国,欧洲两个,分别位于英国和瑞典,亚洲一个位于日本”

  个人认为比较正确的说法应该是这样:“13台根域名服务器不是一个物理概念,它是一个逻辑概念,根域名服务器可以由分布在全球的多个服务器组成,形成一个集群,对外统一为1台逻辑的根域名服务器。在root-servers网站上,我们能查到所有的真实服务器分布“。

  截至2018年9月11日,全球一共分布了937台根域名服务器,可以看到,包含港澳台,中国一共有17台根域名服务器。

  在上述反例中,还强调了主辅之分,然鹅,事实上,这几百台除了运营者不同,哪有什么区别,真正的根一直在幕后。我个人比较支持下面的一种说法:

  全世界只有13台逻辑根域名服务器,名字分别为A至M,由12个运营者运营,其中8个在美国,欧洲两个位于英国和瑞典,亚洲1个位于日本,而真正的主根服务器并未公开。

DNS解析过程分析

域名DNS解析完整流程(以www.baidu.com为例):

第一步:本地客户机提出域名解析请求,查找本地HOST文件有无该域名记录;如果没有,将该请求发送给本地的域名服务器。

第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。

第三步:如果本地DNS缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,根域名服务器收到请求后,返回该域名对应的顶级域名服务器,比如这次请求返回.com的服务器地址。

第四步:本地域名服务器接到顶级域名服务器地址后,向该顶级域名服务器请求;然后,接受请求的顶级域名服务器查询自己的缓存;如果有该纪录项,则顶级域名域名服务器就直接把查询的结果返回;如果没有该记录,则顶级域名服务器返回该域名的二级域名务器地址,即返回.baidu.com对应的二级服务器地址。

第五步:本地域名服务器获得该地址后,发请求到该域名的二级域名服务器;二级域名服务器开始解析www.baidu.com,并将解析结果返回给本地域名服务器。

第六步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机,解析到此完成。

DNS解析模式

递归查询:在该模式下DNS服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS服务器本地没有存储查询DNS信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。

迭代查询:DNS所在服务器若没有可以响应的结果,会向客户机提供其他能够解析查询请求的DNS服务器地址,当客户机发送查询请求时,DNS服务器并不直接回复查询结果,而是告诉客户机另一台DNS服务器地址,客户机再向这台DNS服务器提交请求,依次循环直到返回查询的结果为止。

可以看到,上面的DNS解析六个步骤使用的是迭代查询模式。

常用DNS服务器地址

国内:114.114.114.114 备用:114.114.114.115
国外:8.8.8.8 备用:8.8.4.4

BIND

  BIND(Berkeley Internet Name Domain,伯克利网络域名)服务是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。DNS域名解析服务作为互联网基础设施服务,其责任之重可想而知,因此建议大家在生产环境中安装部署bind服务程序时加上chroot(俗称牢笼机制)扩展包,以便有效地限制bind服务程序仅能对自身的配置文件进行操作,以确保整个服务器的安全。

准备工作

CentOS7安装DNS服务软件包

1
[root@localhost ~]# yum install bind bind-chroot bind-utils -y

在bind服务程序中有下面这三个比较关键的文件。

  • 主配置文件(/etc/named.conf):只有58行,而且在去除注释信息和空行之后,实际有效的参数仅有30行左右,这些参数用来定义bind服务程序的运行。
  • 区域配置文件(/etc/named.rfc1912.zones):用来保存域名和IP地址对应关系的所在位置。类似于图书的目录,对应着每个域和相应IP地址所在的具体位置,当需要查看或修改时,可根据这个位置找到相关文件。
  • 数据配置文件目录(/var/named):该目录用来保存域名和IP地址真实对应关系的数据配置文件。

修改主配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# vim /etc/named.conf
将 listen-on port 53那行改为any,将listen-on-v6那行备注掉,将 allow-query 的由localhost改为any即可

options {
listen-on port 53 { any; };
# listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
保存退出

正向解析实验

修改区域配置文件

1
2
3
4
5
6
7
8
[root@localhost ~]# vim /etc/named.rfc1912.zones 
在最后面加上一段:
zone "feng.io" IN {
type master;
file "feng.io.zone";
allow-update { none; };
};
保存退出

配置解析数据文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost ~]# cd /var/named/
[root@localhost named]# cp -a named.localhost feng.io.zone
[root@localhost named]# vim feng.io.zone

$TTL 1D
@ IN SOA feng.io. root.feng.io. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.feng.io.
ns IN A 192.168.141.12
A 192.168.141.12
www IN A 192.168.141.12
IN MX 10 mail.feng.io
mail IN A 192.168.141.12

保存退出

启动named服务,防火墙放行服务

1
2
3
4
5
6
[root@localhost named]# systemctl restart named
[root@localhost named]# firewall-cmd --add-service=dns --permanent
success
[root@localhost named]# firewall-cmd --reload
success
[root@localhost named]#

windows客户端测试,可以用电脑物理机测试

反向解析实验

修改区域配置文件

1
2
3
4
5
6
7
8
9
10
[root@localhost named]# vim /etc/named.rfc1912.zones 

在尾部加入:
zone "141.168.192.in-addr.arpa" IN {
type master;
file "192.168.141.arpa";
allow-update { none; };
};

保存退出

配置解析数据文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost named]# cp feng.io.zone 192.168.141.arpa
[root@localhost named]# vim 192.168.141.arpa


$TTL 1D
@ IN SOA feng.io. root.feng.io. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS feng.io.
ns A 192.168.141.12
12 PTR ns.feng.io.
38 PTR www.feng.io.
12 PTR mail.feng.io.

保存退出,重启named服务
[root@localhost named]# systemctl restart named

注意:上述文件配置中,12 38 12 值得是192.168.141.12 192.168.141.38 192.168.141.12三个ip,意思是对这三个ip的反向解析的结果分别对应什么域名。下面测试就用的上述ip。

用linux客户端测试dns

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost ~]# vim /etc/resolv.conf 

# Generated by NetworkManager
search localdomain
nameserver 192.168.141.12

保存退出
[root@localhost ~]# yum install bind-utils -y

[root@localhost ~]# nslookup
> 192.168.141.12
Server: 192.168.141.12
Address: 192.168.141.12#53

12.141.168.192.in-addr.arpa name = mail.feng.io.
12.141.168.192.in-addr.arpa name = ns.feng.io.
> 192.168.141.38
Server: 192.168.141.12
Address: 192.168.141.12#53

38.141.168.192.in-addr.arpa name = www.feng.io.
>

可以用物理机测试反向解析

部署dns的主从服务器

做dns服务器的故障备份服务器,当主服务器故障,我们就可以用从服务器的地址继续进行解析

配置主服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
咱们上面配好的就是主服务器,但是这里为了与从服务器配合工作,咱们还需要添加一些配置:
[root@localhost ~]# vim /etc/named.rfc1912.zones
在文件尾部,将前面咱们添加的两个代码块修改为以下内容
zone "feng.io" IN {
type master;
file "feng.io.zone";
allow-update { 192.168.141.53; };
};
zone "141.168.192.in-addr.arpa" IN {
type master;
file "192.168.141.arpa";
allow-update { 192.168.141.53; };
};

其实也就是将原本的none改成了从服务器client2的ip而已
保存退出,重启named服务
[root@localhost named]# systemctl restart named

配置从服务器

现在我们新安装一台虚拟机client2作为咱们的从服务器。

从服务器的主配置文件和主服务器一样,只要修改区域文件就可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost ~]# yum install bind bind-chroot bind-utils -y

[root@localhost ~]# vi /etc/named.rfc1912.zones
在文件尾部加入下列内容
zone "feng.io" IN {
type slave;
masters{ 192.168.141.12; };
file "slaves/feng.io.zone";
};

zone "141.168.192.in-addr.arpa" IN {
type slave;
masters{ 192.168.141.12; };
file "slaves/192.168.141.arpa";
};

保存退出
[root@localhost ~]# firewall-cmd --add-service=dns --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]#

注意:上述参数中,slave(奴隶)指的是从服务,master(主人)指的是主服务

从服务器的主配置文件和主服务器一样

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[root@localhost ~]# vim /etc/named.conf
将 listen-on port 53那行改为any,将listen-on-v6那行备注掉,将 allow-query 的由localhost改为any即可

options {
listen-on port 53 { any; };
# listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };

保存退出
[root@localhost ~]# cd /var/named/
[root@localhost named]# cp -a named.localhost feng.io.zone
[root@localhost named]# vim feng.io.zone

$TTL 1D
@ IN SOA feng.io. root.feng.io. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.feng.io.
ns IN A 192.168.141.12
A 192.168.141.12
www IN A 192.168.141.12
IN MX 10 mail.feng.io
mail IN A 192.168.141.12

保存退出

[root@localhost named]# vim 192.168.141.arpa


$TTL 1D
@ IN SOA feng.io. root.feng.io. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS feng.io.
ns A 192.168.141.12
12 PTR ns.feng.io.
38 PTR www.feng.io.
12 PTR mail.feng.io.

保存退出,重启named服务
[root@localhost named]# systemctl restart named

检查同步结果

将客户机/etc/resolv.conf 的IP改为从服务器ip,用nslookup测试就可以了,此处仍然以client来测试

从服务器client2上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fc:9f:8d brd ff:ff:ff:ff:ff:ff
inet 192.168.141.53/24 brd 192.168.141.255 scope global noprefixroute dynamic ens33
valid_lft 1618sec preferred_lft 1618sec
inet6 fe80::1440:45a7:228d:4942/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]#

记住ip:192.168.141.53

测试用的客户机client上:

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@localhost ~]# vim /etc/resolv.conf 

# Generated by NetworkManager
search localdomain
nameserver 192.168.141.53
保存退出

测试:
[root@localhost ~]# nslookup
> mail.feng.io
Server: 192.168.141.53
Address: 192.168.141.53#53

Name: mail.feng.io
Address: 192.168.141.12
> 192.168.141.12
Server: 192.168.141.53
Address: 192.168.141.53#53

12.141.168.192.in-addr.arpa name = ns.feng.io.
12.141.168.192.in-addr.arpa name = mail.feng.io.
> 192.168.141.38
Server: 192.168.141.53
Address: 192.168.141.53#53

38.141.168.192.in-addr.arpa name = www.feng.io.
>

客户端通过从服务器的正反向解析都成功。

安全的加密传输同步主从服务器

主服务器配置

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
生成密钥文件
[root@localhost ~]#
[root@localhost ~]# cd /var/named/chroot/etc/
[root@localhost etc]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave
Kmaster-slave.+157+61793

复制上面弄出来的文件名Kmaster-slave.+157+61793,加上.private 就可以cat出来了:






修改配置文件并且设置文件安全

[root@localhost etc]# cat Kmaster-slave.+157+61793.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: 5U4NAMvTT0RfK2TvNu/jUw==
Bits: AAA=
Created: 20190203024817
Publish: 20190203024817
Activate: 20190203024817

复制上面cat出来的Key的内容5U4NAMvTT0RfK2TvNu/jUw==,一会儿填入下面这个文件secret的里面

[root@localhost etc]# vim transfer.key
key "master-slave"{
algorithm hmac-md5;
secret "5U4NAMvTT0RfK2TvNu/jUw==";
};
保存退出

[root@localhost etc]# chown root:named transfer.key
[root@localhost etc]# chmod 640 transfer.key
[root@localhost etc]# ln transfer.key /etc/transfer.key
[root@localhost etc]#






开启bind服务的密钥验证功能
[root@localhost etc]# vim /etc/named.conf
在文件第11行插入这一行:
include "/etc/transfer.key";

在文件第22行左右插入这一行:
allow-transfer { key master-slave; };
保存退出,重启named服务

[root@localhost etc]# setenforce 0
[root@localhost etc]# systemctl restart named

从服务器上观察:

1
2
3
4
5
6
做到这步,现在由于从服务器尚未做相关配置,所以现在从服务器无法同步信息了

[root@localhost slaves]# rm -rf /var/named/slaves/*
[root@localhost slaves]# systemctl restart named
[root@localhost slaves]# ls
[root@localhost slaves]#

配置从服务器

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
28
29
30
31
32
33
34
[root@localhost ~]# cd /var/named//chroot/etc/

我们把上面主服务器transfer.key的内容一模一样地复制到这里:
[root@localhost etc]# vi transfer.key

key "master-slave"{
algorithm hmac-md5;
secret "5U4NAMvTT0RfK2TvNu/jUw==";
};
保存退出

[root@localhost etc]# chown root:named transfer.key
[root@localhost etc]# chmod 640 transfer.key
[root@localhost etc]# ln transfer.key /etc/transfer.key
[root@localhost etc]#


修改主配置文件
[root@localhost etc]# vi /etc/named.conf
在文件尾部将原本的
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
改为下列内容:
server 192.168.141.12{
keys { master-slave; };
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
include "/etc/transfer.key";

保存退出,重启named服务
[root@localhost etc]# setenforce 0
[root@localhost etc]# systemctl restart named
[root@localhost etc]#

检查结果

检查同步,查看/var/named/slaves目录下有没有同步过来的区域数据文件

1
2
3
[root@localhost etc]# ls /var/named/slaves/
192.168.141.arpa feng.io.zone
[root@localhost etc]#

现在/var/named/slaves目录下又有文件了,说明从服务器和主服务器又可以同步信息了。

欢迎打赏,谢谢
------ 本文结束------
0%