CentOS 7系统搭建DNS服务(正向解析、反向解析、主从同步)

本文最后更新于:2 年前

DNS简介:

互联网中的地址是数字的IP地址,而我们平时用来访问网站的域名主要就是为了便于记忆。域名解析的作用就是把域名指向网站的IP地址,让人们通过注册的域名可以方便地访问到网站的一种服务。域名解析就是域名到IP地址的转换过程。而域名的解析工作就是由DNS服务器完成。

DNS系统的作用:

正向解析:根据主机名称(域名)查找对应的IP地址。
反向解析:根据IP地址查找对应的主机域名。

DNS系统类型:

缓存域名服务器:也称为高速缓存服务器,通过向其他域名服务器查询获得域名、IP地址记录,然后将域名查询结果缓存到本地,提高重复查询时的速度。
主域名服务器:特定DNS区域的官方服务器,具有唯一性。负责维护该区域内所有域名、IP地址的映射记录。
从域名服务器:也称为辅助域名服务器,其维护的域名、IP地址记录来源于主域名服务器。

域名解释:

我们平时所输入的域名,例如咱们博客的地址:blog.51cto.com,其实是不完整的,它在末尾省略了根域 “ . ”。就是一个“点”,完整的域名应该是“blog.51cto.com.”。下面我们以这个地址来解释一下各个部分代表什么。
“ . ”:表示根域。根域服务器,全球只有13台。
“.com”:表示顶级域。顶级域有很多,根据不同用途也有不同的顶级域。我们平时见得较多的“.com”是用于商业机构的,“.net”多用于网络服务提供商,“.edu”用于教育机构,“.cn”是按照区域划分的顶级域,代表的是咱们国家大陆。
“.51cto”:表示二级域名。这个一般都是由使用机构自己定义的,原则就是简单易记。当然在二级域名前面还可以根据个人需求增加三级域名。
“blog”:表示主机名。像咱们平常见得最多的“www”也是主机名。

安装与配置

安装DNS组件

1
2
3
4
5
6
7
8
yum install -y bind
# 提供的dns server程序、以及几个常用的测试程序

yum install -y bind-libs
# 被bind和bind-utils包中的程序共同用到的库文件;

yum install -y bind-utils
# bind客户端程序集,例如dig, host, nslookup等;

安装完毕,用“rpm -qc bind”命令,查看一下程序的配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
/etc/logrotate.d/named
/etc/named.conf - 主配置文件(控制系统全局)
/etc/named.iscdlv.key
/etc/named.rfc1912.zones - 区域配置文件(控制具体单个区域)
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost - 区域数据配置文件(区域信息)
/var/named/named.loopback

关闭防火墙,selinux等

1
2
3
systemctl stop  firewalld.service
systemctl disable firewalld.service #开启自动关闭
setenforce 0 # 可以vim /etc/selinux/config将selinux改为disabled,设置为开机就关闭

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /etc/named.conf
options {
listen-on port 53 { 127.0.0.1; 10.10.10.3; };# 监听本机IP的53端口
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";
allow-query { any; }; # localhost;代表只解析本机, any;代表解析所有
allow-transfer { 10.10.10.0/24; }; # 配置里默认没有这一项配置,只允许的slave主机做数据传送

recursion yes;
dnssec-enable no; # 安全设置关闭
dnssec-validation no; # 安全设置关闭

配置检查

1
named-checkconf 				#语法检查,默认检查/etc/named.conf文件,如果不是这个路径,在后面写路径

重启named服务器

1
systemctl restart named.service

dig测试DNS解析流程

1
2
3
4
5
6
7
8
dig -t A +trace www.baidu.com
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7 <<>> -t A +trace www.baidu.com
;; global options: +cmd
. 457478 IN NS a.root-servers.net. # 首先找到跟域
com. 172800 IN NS a.gtld-servers.net. # 再找.com
baidu.com. 172800 IN NS dns.baidu.com. # 最后找到dns
ww.baidu.com. 1200 IN CNAME www.a.shifen.com. # 找到最后的域名
;; Received 239 bytes from 220.181.37.10#53(ns3.baidu.com) in 13 ms # 解析的ip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
dig命令介绍:
dig [-t RR_TYPE] name [@SERVER] [query options]

用于测试dns系统,因此其不会查询hosts文件;

查询选项:
+[no]trace:跟踪解析过程;
+[no]recurse:进行递归解析;
注意:反向解析测试
dig -x IP
模拟完全区域传送:
dig -t axfr DOMAIN [@server]
dig +trace -t A www.baidu.com
dig -x 61.135.169.121

配置正向解析

1
2
3
4
5
6
vim /etc/named.rfc1912.zones 
# 配置文件最后面添加
zone "wlm.com" IN {
type master; # {master|slave|hint|forward};
file "wlm.com.zone";
};

建立区域数据文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /var/named/wlm.com.zone   #这里定义的文件要跟上一步在配置里写的文件一致
$TTL 3600 # 设置客户端缓存时间
$ORIGIN boss.com. # 定义当前区域的名字,下面的@就是替代这个值
@ IN SOA ns1.boss.com dnsadmin.boss.com. ( # Start Of Authority,起始授权记录;一个区域解析库有且只能有一个SOA记录,而且必须放在第一条;ns1.boss.com,该域的主域名服务器; dnsadmin.boss.com, 管理员邮箱;
2022070701 ;serial # 序列号:serial
1H ;refresh # 刷新时间间隔:refresh
10M ;retry # 重试时间间隔:retry,
3D ;expire # 过期时长:expire
1D ;negative answer ttl # negative answer ttl:否定答案的缓存时长
)
IN NS DNS # 域名服务记录;一个区域解析库可以有多个NS记录;其中一个为主的
ns1 IN A 10.0.100.17 #地址记录
www IN A 10.0.100.17
zx IN CNAME www
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
系统的介绍:
主-辅DNS服务器:
主DNS服务器:维护所负责解析的域数据库的那台服务器;读写操作均可进行;
从DNS服务器:从主DNS服务器那里或其它的从DNS服务器那里“复制”一份解析库;但只能进行读操作;
“复制”操作的实施方式:
序列号:serial, 也即是数据库的版本号;主服务器数据库内容发生变化时,其版本号递增;
刷新时间间隔:refresh, 从服务器每多久到主服务器检查序列号更新状况;
重试时间间隔:retry, 从服务器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔;
过期时长:expire,从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务;
negative answer ttl:否定答案的缓存时长
主服务器”通知“从服务器随时更新数据;

区域传送:
全量传送:axfr, 传送整个数据库;
增量传送:ixfr, 仅传送变量的数据;

区域(zone)和域(domain):
magedu.com域:
FQDN --> IP
正向解析库;区域
IP --> FQDN
反向解析库;区域

区域数据库文件:
资源记录:Resource Record, 简称rr;
记录有类型:AAAAAPTRSOANSCNAMEMX

SOA:Start Of Authority,起始授权记录; 一个区域解析库有且只能有一个SOA记录,而且必须放在第一条;
NS:Name Service,域名服务记录;一个区域解析库可以有多个NS记录;其中一个为主的;
A: Address, 地址记录,FQDN --> IPv4;
AAAA:地址记录, FQDN --> IPv6;
CNAME:Canonical Name,别名记录;
PTR:Pointer,IP --> FQDN
MX:Mail eXchanger,邮件交换器;
优先级:0-99,数字越小优先级越高;

资源记录的定义格式:
语法: name [TTL] IN RR_TYPE value
客户端可以缓存的时间 资源记录
SOA
name: 当前区域的名字;例如”magedu.com.”,或者“2.3.4.in-addr.arpa.”;
value:有多部分组成
(1) 当前区域的区域名称(也可以使用主DNS服务器名称);
(2) 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般使用点号来替代;
(3) (主从服务协调属性的定义以及否定答案的TTL)

例如:
magedu.com. 86400 IN SOA magedu.com. admin.magedu.com. (
2017010801 ; serial
2H ; refresh
10M ; retry
1W ; expire
1D ; negative answer ttl
)

NS
name: 当前区域的区域名称
value:当前区域的某DNS服务器的名字,例如ns.magedu.com.;
注意:一个区域可以有多个ns记录;

例如:
magedu.com. 86400 IN NS ns1.magedu.com.
magedu.com. 86400 IN NS ns2.magedu.com.

MX
name: 当前区域的区域名称
value:当前区域某邮件交换器的主机名;
注意:MX记录可以有多个;但每个记录的value之前应该有一个数字表示其优先级;

例如:
magedu.com. IN MX 10 mx1.magedu.com.
magedu.com. IN MX 20 mx2.magedu.com.

A
name:某FQDN,例如www.magedu.com.
value:某IPv4地址;

例如:
www.magedu.com. IN A 1.1.1.1
www.magedu.com. IN A 1.1.1.2
bbs.magedu.com. IN A 1.1.1.1

AAAA
name:FQDN
value: IPv6

PTR
name:IP地址,有特定格式,IP反过来写,而且加特定后缀;例如1.2.3.4的记录应该写为4.3.2.1.in-addr.arpa.;
value:FQND

例如:
4.3.2.1.in-addr.arpa. IN PTR www.magedu.com.

CNAME
name:FQDN格式的别名;
value:FQDN格式的正式名字;

例如:
web.magedu.com. IN CNAME www.magedu.com.

注意:
(1) TTL可以从全局继承;
(2) @表示当前区域的名称;
(3) 相邻的两条记录其name相同时,后面的可省略;
(4) 对于正向区域来说,各MXNS等类型的记录的value为FQDN,此FQDN应该有一个A记录;

检查配置文件语法错误:

1
2
3
4
# 检查配置
named-checkconf /var/named/boss.com.zone
# 检查解析
named-checkzone boss.com /var/named/boss.com.zone

让服务器重载配置文件和区域数据文件

1
2
3
# rndc  reload 或  systemctl  reload  named.service
[root@ns1 ~]# rndc reload
server reload successful

验证

1
2
3
4
5
6
7
8
9
10
[root@ns1 ~]# ping ns1.wlm.com
PING ns1.wlm.com (10.10.10.3) 56(84) bytes of data.
64 bytes from 10.10.10.3: icmp_seq=1 ttl=64 time=0.036 ms

[root@ns1 ~]# nslookup
> ns1.wlm.com
Server:10.10.10.3
Address:10.10.10.3#53
Name:ns1.wlm.com
Address: 10.10.10.3

配置一个反向解析区域

定义区域

在主配置文件中或主配置文件辅助配置文件中实现;

1
2
3
4
5
[root@ns1 ~]# vim /etc/named.rfc1912.zones
zone "10.10.10.in-addr.arpa" IN {
type master; # {master|slave|hint|forward};
file "10.10.10.zone";
};

定义区域解析库文件(主要记录为PTR)

在/var/named目录下建立区域数据文件;示例:区域名称为100.16.172.in-addr.arpa;(反过来写IP)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /var/named/10.10.10.zone 
$TTL 3600
$ORIGIN 10.10.10.in-addr.arpa.
@ IN SOA ns1.wlm.com. nsadmin.wlm.com. (
2014100801
1H
10M
3D
12H )
IN NS ns1.wlm.com.
3 IN PTR ns1.wlm.com.
100 IN PTR mx1.wlm.com.
200 IN PTR mx2.wlm.com.
4 IN PTR www.wlm.com.

验证反向解析是否正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@ns1 named]# dig -x 10.10.10.3
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7 <<>> -x 10.10.10.3
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25014
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;3.10.10.10.in-addr.arpa. IN PTR
;; ANSWER SECTION:
3.10.10.10.in-addr.arpa. 3600 IN PTR ns1.wlm.com.
;; AUTHORITY SECTION:
10.10.10.in-addr.arpa. 3600 IN NS ns1.wlm.com.
;; ADDITIONAL SECTION:
ns1.wlm.com. 3600 IN A 10.10.10.3
;; Query time: 26 msec
;; SERVER: 10.10.10.3#53(10.10.10.3)
;; WHEN: 11 16 13:55:13 CST 2016
;; MSG SIZE rcvd: 107

辅域名服务器配置

在准备工作已经说过了,这里在添加上/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
options {
listen-on port 53 { 127.0.0.1; 10.10.10.10; };
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";
allow-query { any; };
allow-transfer { none; };
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;
dnssec-enable no;
dnssec-validation no;

配置一个从区域:

在master DNS上添加NS记录和A记录

在Master上,确保区域数据文件中为每个从服务配置NS记录,并且在正向区域文件需要每个从服务器的NS记录的主机名配置一个A记录,且此A后面的地址为真正的从服务器的IP地址;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$TTL 3600
$ORIGIN wlm.com.
@ IN SOA ns1.wlm.com. dnsadmin.wlm.com. (
2014100101 #如果slave要重载配置,这需要变更序列号
1H
10M
3D
1D )
IN NS ns1
IN NS ns2 #NS记录
IN MX 10 mx1
IN MX 20 mx2
ns2 IN A 10.10.10.10 #A记录
ns1 IN A 10.10.10.3
mx1 IN A 10.10.10.100
mx2 IN A 10.10.10.200
www IN A 10.10.10.4
web IN CNAME www

语法检查并重载配置

1
2
3
4
5
[root@ns1 named]# named-checkzone wlm.com /var/named/wlm.com.zone 
zone wlm.com/IN: loaded serial 2014100101
OK
[root@ns1 named]# rndc reload
server reload successful

在slave DNS上定义区域

1
2
3
4
5
6
[root@ns2 ~]# vim /etc/named.rfc1912.zones 
zone "wlm.com" IN {
type slave; #slave标记为从服务器
file "slaves/wlm.com.zone"; #代办区域文件在/var/named/slaves目录下,特定的
masters { 10.10.10.3; }; #填写主域名服务器IP
};

重载配置

当主域名服务器里添加了新记录,只需要主域名服务器重载配置,从域名服务器自动同步。

1
2
rndc reload
systemctl reload named.service

(1)在/var/named/slaves目录下自动同步wlm.com.zone文件

1
2
3
4
[root@ns2 slaves]# pwd
/var/named/slaves
[root@ns2 slaves]# ls
wlm.com.zone

(2)可以解析域名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@ns2 slaves]# dig -t A www.wlm.com
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7 <<>> -t A www.wlm.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27069
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.wlm.com. IN A
;; ANSWER SECTION:
www.wlm.com. 3600 IN A 10.10.10.4
;; AUTHORITY SECTION:
wlm.com. 3600 IN NS ns1.wlm.com.
wlm.com. 3600 IN NS ns2.wlm.com.
;; ADDITIONAL SECTION:
ns1.wlm.com. 3600 IN A 10.10.10.3
ns2.wlm.com. 3600 IN A 10.10.10.10
;; Query time: 1 msec
;; SERVER: 10.10.10.10#53(10.10.10.10)
;; WHEN: 11 16 14:20:52 CST 2016
;; MSG SIZE rcvd: 124

至此,辅域名服务器配置完毕

缓存域名服务器配置

在上面的准备工作做完了,默认就配置好了缓存域名服务器。
但是我们这里还有在做两点,为大家更好的理解域名服务器的配置。
定义转发:
注意:被转发的服务器必须允许为当前服务做递归;

区域转发:仅转发对某特定区域的解析请求;

配置格式:

1
2
3
4
5
6
7
zone  "ZONE_NAME"  IN {
type forward;
forward {first|only};
forwarders { SERVER_IP; };
};
first:首先转发;转发器不响应时,自行去迭代查询;
only:只转发;

具体配置:

1
2
3
4
5
6
[root@wlm ~]# vim /etc/named.rfc1912.zones #在最后面添加
zone "wlm.com" IN {
type forward;
forward first;
forwarders { 10.10.10.3; };
};
验证:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@wlm ~]# dig -t A www.wlm.com
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7 <<>> -t A www.wlm.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5158
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.wlm.com. IN A
;; ANSWER SECTION:
www.wlm.com. 3600 IN A 10.10.10.4
;; AUTHORITY SECTION:
wlm.com. 3600 IN NS ns2.wlm.com.
wlm.com. 3600 IN NS ns1.wlm.com.
;; ADDITIONAL SECTION:
ns1.wlm.com. 3600 IN A 10.10.10.3
ns2.wlm.com. 3600 IN A 10.10.10.10
;; Query time: 53 msec
;; SERVER: 10.10.10.11#53(10.10.10.11)
;; WHEN: 11 16 15:20:59 CST 2016
;; MSG SIZE rcvd: 124
全局转发:针对凡本地没有通过zone定义的区域查询请求,通通转给某转发器;

配置格式:

1
2
3
4
5
6
options {
... ...
forward {only|first};
forwarders { SERVER_IP; };
.. ...
};

具体配置:

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
vim /etc/named.conf
options {
listen-on port 53 { 127.0.0.1; 10.10.10.11; }; # 监听本机的IP端口
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";
allow-query { localhost; }; # 允许为其他主机解析
allow-transfer { none; }; # 从服务器不需要传送
forward first; # 本机不能解析的转发给10.10.10.3做解析
forwarders { 10.10.10.3; }; # 被转发的服务器IP
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;
dnssec-enable no; #关闭
dnssec-validation no; #关闭

语法检查然后重启bind

1
[root@wlm ~]# systemctl restart named.service
验证:
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@wlm ~]# ping www.baidu.com
PING www.a.shifen.com (220.181.112.244) 56(84) bytes of data.
64 bytes from 220.181.112.244: icmp_seq=1 ttl=128 time=6.67 ms
p64 bytes from 220.181.112.244: icmp_seq=2 ttl=128 time=6.60 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1005ms
rtt min/avg/max/mdev = 6.608/6.640/6.672/0.032 ms
[root@wlm ~]# ping www.wlm.com
PING www.wlm.com (10.10.10.4) 56(84) bytes of data.
^C
--- www.wlm.com ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

配置IP,将DNS指向DNS服务器

1
2
3
4
5
cat > /etc/resolv.conf << EOF
options timeout:1 attempts:1
nameserver 172.17.0.11
nameserver 114.114.114.114
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vim /etc/sysconfig/network-scripts/ifcfg-eno1
TYPE=Ethernet
BOOTPROTO=none
IPADDR=10.10.10.3
NETMASK=255.255.255.0
GATEWAY=10.10.10.2
DNS1=10.10.10.3
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
DEVICE=eno16777736
ONBOOT=yes