DNS域名系统

DNS简介

DNS是域名系统的简称。DNS服务可以为计算机、服务以及接入互联网或局域网的任何资源提供分层的名称解析功能。DNS最主要的功能就是进行域名与IP地址之间的解析。在互联网中,IP地址可以唯一标记一台计算机,但是如此大量的IP地址难以记忆,这时我们可以使用简单易记的域名与IP地址建立映射。用户通过输入域名,计算机通过寻找DNS服务器,请求服务器帮助解析域名对应的IP地址。成功解析后,就可以通过IP地址与对方通信。
域名是分级的,一般分为:顶级域、二级域名、三级域名、主机名等。一个点代表的是根域,是所有域名的起点。域名的结构一般最后是点即根,其次是根下的顶级域、然后是二级域名等。具体可见图:

域名有两种查询方式,分为递归查询和迭代查询。举例说明:如果客户端在浏览器器内输入百度的网址,客户端首先后查找本机缓存,如果有直接读取,如果没有查找hosts文件,如果有则读取记录,没有则向本地DNS服务器发送查询请求,就是所谓递归查询。本地dns如果有答案,就会将答案直接返回客户端,如果本地dns服务器没有正确答案,它会向根服务器查询,但不是直接查询www.baidu.com的IP,根服务器只管理顶级域名,此时本地dns向根查询的结果是:根服务器会将它所管理的com域的IP提供给本地dns服务器,本地dns服务器得到com域服务器的IP后,会再向com域查询,com域也没有最终答案,com域服务器会将它所管理的bai域服务器对应的IP提供给本地dns服务器,最后本地dns服务器再向bai域服务器查询,询问该域下主机名为www的计算机对应的IP地址,由于www主机确实属于bai域的管理范围,所以bai域会将正确答案返回给本地dns服务器,最后本地dns服务器将得到的结果返回给客户端,同时本地dns还会将结果缓存起来,当下次再有相同请求时,本地dns服务器就可以直接从缓存中找到结果返回给客户端。本地dns服务器请求的这段过程就是迭代查询。

安装DNS软件

BIND是目前应用最广泛的DNS服务系统。该软件除了BIND主程序外,在Linux平台下还提供了chroot与utils软件包,bind-chroot软件包主要功能是使BIND软件可以运行在chroot模式下,这样BIND运行在相对路径的根路径,而不是Linux系统真正的根路径,即使有人对BIND软件进行破坏,影响的也仅仅是操作系统中的一个子目录,不会影响整个操作系统,提高安全性。通过yum安装bind-chroot后,对bind而言,/var/named/chroot/目录就是根路径,所有BIND软件的配置文件都在根下的某某路径下。bind-utils软件包提供了一些DNS查询工具,如:dig、host、nslookup等。

yum install -y bind

yum install -y bind-chroot

yum install -y bind-utils

配置文件解析

BIND配置文件主要分为主配置文件与区域数据文件。主配置文件主要功能就是定义域,以及告知计算机到哪里可以找到相应域的数据记录文件。而区域数据文件存储具体的域名以及IP地址之间的解析,DNS通过读取区域数据记录文件来解答客户端的查询请求。

主配置文件一般为/etc/named.conf文件,如果我们安装了bind-chroot软件包后,在后面的提到的路径默认指的都是虚拟路径,都是相对虚拟根路径而言的,虚拟根路径默认为/var/named/chroot/目录。如果主配置文件是/etc/named.conf,那么最终主配置文件在本机的绝对路径为/var/named/chroot/etc/named.conf。

下面介绍/etc/named.conf文件中的常用定义语句:

acl(Access Control List)语句允许我们定义一组主机,从而控制是允许还是拒绝他人访问服务器,BIND
预定义了一些主机访问控制列表,其中any可以匹配任何IP地址,localhost可以匹配本地系统上所有的IP地址,localnets匹配本地系统所连接的任意网络,none将不匹配任何ip地址。下面通过实例自定义两个访问控制列表,一个为黑名单,一个为白名单。

1
2
3
4
5
6
7
8
9
10
11
12
13
acl black {
172.16.0.0/16;
192.168.0.12;
192.168.0.18;
};
acl white {
10.0.0.0/8;
192.168.0.0/24;
};
options {
allow-query { white; };
blackhole { black; };
};

option语句用来定义全局配置选项,在全局配置中至少需要定义一个工作路径,默认工作路径为/var/named/。

选项 描述
directory 设置域名服务的工作目录,默认为/var/named
dump-file 运行rndc dumpdb备份缓存资料后保存的文件路径与名称
statistics-file 运行rndc stats后,统计信息的保存路径与名称
listen-on port 指定监听的IPv4网络接口
allow-query 指定哪些主机可以查询服务器的权威解析记录
allow-query-cache 指定哪些主机可以通过服务器查询非权威解析记录,如递归查询数据
blackhole 设置拒绝哪些主机的查询请求
recursion 是否允许递归查询
forwards 指定一个IP地址,所有对本服务器的查询将转发到该IP进行解析
max-cache-size 设置缓存文件的最大容量

zone语句用来定义域及相关选项,定义域可以维护域名解析。zone语句的重点是type和file。

选项 描述
type 设置域类型,类型可以是:hint:当本地找不到相应解析后,可以查询根域名服务器;master:定义权威域名服务器;slave:定义辅助域名服务器;forward:定义转发域名服务器
file 定义域数据文件,文件保存在directory所定义的目录下
notify 当域数据资料更新后是否主动通知其他域名服务器
masters 定义主域名服务器的IP地址,当type设置为slave时此选项生效
allow-update 允许哪些主机动态更新域数据信息
allow-transfer 哪些从服务器可以从主服务器下载数据文件

下面是一个简单的zone语句实例,example.com是定义的域,type类型本机为example.com域的主域名服务器,域的解析文件保存在example.com.zone文件中,该文件被保存在/var/named/目录下。当定义反向解析域时,需要将网络地址反过来输入,并以固定的.in-addr.arpa格式结尾。通过定义类型为hint的根域,这样当客户端查询不属于自己维护的域时,可以寻找根服务器进行迭代查询,最终返回正确结果。全球根域名服务器信息保存在named.ca文件中,该文件在/usr/share/doc/bind-9.8.2/sample/var/named/目录中。

1
2
3
4
5
6
7
8
9
10
11
12
zone "." IN {
type hint;
file "named.ca";
};
zone "example.com" IN {
type master;
file "example.com.zone";
};
zone "77.168.192.in-addr.arpa" IN {
type master;
file "192.168.77.zone";
};

在BIND主配置文件中,如果定义了zone语句,还需要创建域数据文件,默认域数据文件存储在/var/named目录下,文件名称由zone语句中的file选项设定。数据文件分为正向解析数据文件与反向解析数据文件,正向解析数据文件保存了域名到IP的映射记录,反向解析文件保存了IP到域名的映射记录。

记录类型 描述
SOA记录 域权威记录,说明本机服务器为该域的管理服务器
NS记录 域名服务器记录
A记录 正向解析记录,域名到IP地址的映射
PTR记录 反向解析记录,IP地址到域名的映射
CNAME记录 别名记录,为主机添加别名
MX记录 邮件记录,指定域内的邮件服务器,需要指定优先级

下面通过一个正向解析的域数据文件,说明各种记录的语法格式,配置文件中TTL值为DNS记录缓存时间,这个值是其他域名服务器将数据存放在缓存中的时间,1D代表一天。SOA记录后面的root.example.com.代表域的权威服务器,jacob.google.com是管理员的邮箱,由于@在数据文件中代表特殊含义,这里使用.代表@符号,实际邮箱是jacob@google.com,SOA记录可以跨行输入,跨越多行时使用括号引用。NS记录代表域名服务器记录,如果公司有多个域名服务器,可以添加多条NS记录,每个NS记录都要有对应的A记录。A记录为正向解析记录,格式为在域名后面输入相应IP地址,IN代表Internet,A代表正向解析记录。在使用MX记录指定邮件服务器时,给mail.example.com服务器设置的优先级为10,最后CNAME记录为别名,可以使用web.example.com来代表www.example.com。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$TTL 1D
@ IN SOA root.example.com. jacob.google.com. (
0
1D
1H
1W
3H)
IN NS root.example.com.
IN MX 10 mail.example.com.
root.example.com. IN A 192.168.77.101
www.example.com. IN A 192.168.77.101
IN A 192.168.77.100
mail            IN A 192.168.77.101
web             IN CNAME www

关于配置文件的简写,在BIND主配置文件中,zone语句后定义的域对于数据文件的简写来说很重要,如果区数据文件中不以”.”结尾的名称后会被自动加上该域名称,如zone语句定义了example.com,而数据文件中有一个mail没有以”.”结尾,那么系统会自动追加example.com到mail后,有时将A记录错误地写成www.example.com这种形式,由于没有以”.”结尾,实际系统识别的是www.example.com.example.com.。此外,数据文件中使用@符号同样代表zone所定义的域名称。还有,如果在数据文件中某条记录名称为空格或制表符,那么BIND会直接使用上一条记录的名称,当我们为同一域名设置多个A记录,则客户端请求该域名解析式,服务器会以轮训方式将结果返回给客户端,可以一定程度上实现负载均衡。

安装DNS主从及DNS视图

a.部署DNS主服务器

部署DNS主服务器,建立域为abc.com,这是正向解析域,网络采用的是私有网络地址:192.168.77.0/24。

服务器IP 服务器名称 功能描述
192.168.77.100 dns1.abc.com 主域名服务器
192.168.77.101 dns2.abc.com 从域名服务器
192.168.77.102 fileserver.abc.com 文件服务器
192.168.77.103 printserver.abc.com 打印服务器
192.168.77.104 www.abc.com 网站服务器
192.168.77.105 mail.abc.com 邮件服务器

1.安装软件

在部署DNS服务器时需要安装bind、bind-chroot以及bind-utils软件包。

yum -y install bind bind-chroot bind-utils

2.修改主配置文件

默认chroot之后的虚拟根目录/var/named/chroot/etc没有现成的配置文件,需要在/usr/share/doc/bind-9.8.2/sample/etc/目录下找到配置文件模板,复制该文件到/var/named/chroot/etc/目录下,并根据实际情况配置该文件。

cp /usr/share/doc/bind-9.8.2/sample/etc/named.conf /var/named/chroot/etc/

chown root.named /var/named/chroot/etc/named.conf

vi /var/named/chroot/etc/named.conf

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
options
{
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
listen-on port 53 { any; };
allow-query { any; };
allow-query-cache { any; };
recursion yes;
};
acl secondserver {
192.168.77.101;
};
zone "." IN {
type hint;
file "named.ca";
};
zone "abc.com" IN {
type master;
allow-transfer { secondserver; };
file "abc.com.zone";
};
zone "77.168.192.in-addr.arpa" IN {
type master;
allow-transfer { secondserver; };
file "77.168.192.zone";
};

3.创建区域数据文件

主配置文件定义了zone域,关于域内主机具体解析,还依赖于数据文件。常见域名解析有正向解析、反向解析、CNAME记录以及MX记录等。我们可以通过软件包提供的named.localhost文件作为模板创建区域解析文件。

cp /usr/share/doc/bind-9.8.2/sample/var/named/named.ca /var/named/chroot/var/named/

chown root.named /var/named/chroot/var/named/named.ca

cp /usr/share/doc/bind-9.8.2/sample/var/named/named.localhost /var/named/chroot/var/named/abc.com.zone

chown root.named /var/named/chroot/var/named/abc.com.zone

cp /usr/share/doc/bind-9.8.2/sample/var/named/named.localhost /var/named/chroot/var/named/77.168.192.zone

chown root.named /var/named/chroot/var/named/77.168.192.zone

vi /var/named/chroot/var/named/abc.com.zone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$TTL 1D
@ IN SOA dns1.abc.com. hb.abc.com. (
2 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns1.abc.com.
NS dns2.abc.com.
MX 10 mail.abc.com.
dns1 IN A 192.168.77.100
dns2 IN A 192.168.77.101
mail IN A 192.168.77.105
www IN A 192.168.77.104
printserver IN A 192.168.77.103
fileserver IN A 192.168.77.102

vi /var/named/chroot/var/named/77.168.192.zone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$TTL 1D
@ IN SOA dns1.abc.com. hb.abc.com. (
2 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns1.abc.com.
NS dns2.abc.com.
100 IN PTR dns1.abc.com.
101 IN PTR dns2.abc.com.
102 IN PTR fileserver.abc.com.
103 IN PTR printserver.abc.com.
104 IN PTR www.abc.com.
105 IN PTR mail.abc.com.

4.服务管理

iptables -I INPUT -p tcp –dport 53 -j ACCEPT

iptables -I INPUT -p tcp –dport 53 -j ACCEPT

service iptables save

service named start

chkconfig named on

5.客户端验证

客户端配置好dns服务器后,进行验证。

nslookup 192.168.77.103

nslookup www.abc.com

dig www.abc.com

dig abc.com MX

host www.abc.com

b.部署从域名服务器

部署从域名服务器的作用是防止出现单点故障或实现负载均衡。

1.安装软件

yum install -y bind bind-chroot bind-utils

2.修改配置文件

从服务器除根域外所有zone域类型均为slave,并使用masters语句指定与哪台主服务器进行数据同步。

cp /usr/share/doc/bind-9.8.2/sample/etc/named.conf /var/named/chroot/etc/named.conf

chown root.named /var/named/chroot/etc/named.conf

vi /var/named/chroot/etc/named.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
options {
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
listen-on port 53 { any; };
allow-query { any; };
allow-query-cache { any; };
recursion yes;
};
zone "." IN {
type hint;
file "named.ca";
};
zone "abc.com" IN {
type slave;
masters { 192.168.77.100; };
file "abc.com.zone";
};
zone "77.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.77.100; };
file "77.168.192.zone";
};

3.同步数据文件

在从服务器上,启动服务后,BIND会自动根据配置文件中的masters语句寻找主域名服务器,并将主服务器上的数据下载至从服务器本地。完成第一次数据同步后,从服务器会根据同步过来的数据文件中的SOA记录选项,决定下次同步数据的时间,主域名服务器的SOA记录括号中有五个选项。

第一个选项是20180502001序列号,从服务器根据这个序列号来决定是否进行同步操作,只有当主服务器中数据文件的序列号大于从服务器中数据文件的序列号,从服务器才会真正与主服务器进行数据同步,该序列号建议使用时间格式,如果20180502001,表示2018年5月2日第一次修改(序列号只要是数字即可,BIND不强制要求具体数字格式)。

第二个选项是1D,代表从服务器多久与主服务器进行序列号的对比(仅在主服务器序列号大于从服务器序列号时,才进行数据同步),D代表Day,这里为1天。

第三个选型时1H,代表如果从服务器请求连接主服务器时,由于网络延迟、主服务器故障等原因,暂时无法连接到主服务器,那么从服务器每隔一个小时再试一次。

第四个选项1W,代表如果从服务器尝试一周后还是未能连接到主服务器,则不再进行连接。

第五个选项3H,代表的是缓存的时间为3小时。

setenforce 0

chown 775 /var/named/chroot/var/named/

service named start

chkconfig named on

c.DNS视图应用

view语句用来创建视图,视图可以让不同网络或主机在查询同一个DNS记录时得到不同的解析结果,也可以为不同的网络或主机创建不同的域区域文件。通过view视图还可以实现负载均衡,例如,当北京的网民访问新浪时,域名可以将结果解析为北京的服务器,上海的网民访问新浪时,域名服务器会将结果解析为上海的服务器。这样所有的人访问新浪时,都可以连接到离自己最近的服务器。

在BIND9中,如果在没有主配置文件中使用view语句,则BIND会自动将所有的域定义为一个大的视图。通过在配置文件中使用view语句,并结合match-clients语句,实现不同用户查询相同记录时所得到的结果不同。

为同一个域创建多个视图,不同视图对应不同的解析文件。需要注意的是,有多少视图就需要创建多少个相应的数据解析文件。当客户端发送查询请求后,服务器根据视图内的match-clients语句来匹配客户端主机,匹配成功后,服务器读取特定视图内file指定的域数据文件,并将结果结果返回给客户端,如果没有匹配成功,则查询下一个视图,如果所有视图都未匹配,服务器将返回无相关数据记录的信息给客户端。这里我们不可能将全北京或全上海的IP地址都写进match-clients中,根据DNS查询原理我们知道,所有终端用户访问网络时都会连接到当地ISP提供的DNS服务器,这些服务商的DNS服务器会根据根服务器的提示迭代查询到我们的权威服务器。所以说,我们在match-clients后面仅需要填写全国主要的ISP所提供的DNS服务器IP地址即可。不同地区服务商的DNS,我们给与不同的解析结果,最终所有的终端用户会间接获得正确解析结果。

这里给出named.conf的配置:

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
55
56
options
{
directory "/var/named";
dump-file "data/cache_dump.db";
statistics-file "data/named_stats.txt";
memstatistics-file "data/named_mem_stats.txt";
listen-on port 53 { any; };
allow-query { any; };
allow-query-cache { any; };
recursion yes;
notify yes;
};
acl secondserver {
192.168.77.101;
};
view "developnet" {
match-clients { 192.168.77.103; };
zone "." IN {
type hint;
file "named.ca";
};
zone "abc.com" IN {
type master;
allow-transfer { 192.168.77.101; };
file "abc.com.zone";
};
zone "77.168.192.in-addr.arpa" IN {
type master;
allow-transfer { 192.168.77.101; };
file "77.168.192.zone";
};
};
view "producenet" {
match-clients { 192.168.77.104; };
zone "." IN {
type hint;
file "named.ca";
};
zone "abc.com" IN {
type master;
allow-transfer { 192.168.77.101; };
file "abc.com.zone.pro";
};
zone "77.168.192.in-addr.arpa" IN {
type master;
allow-transfer { 192.168.77.101; };
file "77.168.192.zone.pro";
};
};
view "any" {
match-clients { any; };
zone "." IN {
type hint;
file "named.ca";
};
};
分享:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

😉😐😡😈🙂😯🙁🙄😛😳😮:mrgreen:😆💡😀👿😥😎😕