DNS

DNS && BIND

Posted by Mathew on 2016-08-20

DNS是学习运维接触最早的一个Web服务,也是遇到的第一个较难理解的一个服务,学习之后,简单记录下来,方便以后查阅。

DNS是什么

DNS(Domain Name System)名称解析服务,53/udp,53/tcp,是互联网较为重要的服务之一。简单来说就是记录IP地址和域名的对应关系,从而可以让用户准确的通过域名访问到指定的资源。

一次完整的域名解析

Client --> hosts文件 --> DNS Service
Local Cache --> DNS Server(recursion) --> Server Cache --> interation(迭代)–>

DNS解析答案类型

肯定答案:正确解析了请求热内容

否定回答:请求的条目不存在等原因无法返回结果

权威答案:通过迭代的方式从所查询域名的所在域的DNS服务器返回的结果

非权威答案:请求的DNS服务器缓存的答案

DNS资源记录类型

资源记录:Resource Record,RR
记录类型: A,AAAA,PTR,SOA,NS,CNAME,MX

1
2
3
4
5
6
7
- SOA: Start Of Authority,起始授权记录:一个区域解析库有且仅能有一个SOA记录,而必须为解析库的第一条记录
- A:internet Address,作用,FQDN --> IP
- AAAA:FQDN --IPv6
- PTR:PointTeR,IP --> FQDN
- NS:Name Server,专用于标明当前区域的DNS服务器
- CNAME:Canonical Name,别名记录
- MX:Mail eXchanger,邮件交换器

DNS资源记录定义方法

语法:name [TTL] IN rr_type value

SOA:
name:当前区域的名字,例如“maricle.com.cn.”
value:有多部分组成
(1) 当前区域的DNS服务器的FQDN,也可以使用当前区域的名字
(2) 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般用.替换,例如linuxedu.maricle.com.cn
(3) (主从服务协调属性的定义以及否定的答案的统一的TTL)

例如:
1
2
3
4
5
6
7
	maricle.com.cn	86400	     IN   SOA  ns.magedu.com. nsadmin.maricle.com.cn.  (
2016081901 ;序列号
2H ;刷新时间
10M ;重试时间
1W ;过期时间
1D ;否定答案的TTL
)

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

例如:
1
2
maricle.com.cn.  IN		NS    ns1.maricle.com.cn.
maricle.com.cn. IN NS ns2.maricle.com.cn.
	注意:
		(1) 相邻的两个资源记录的name相同时,后续的可省略
		(2) 对NS记录而言,任何一个ns记录后面的服务器名字,都应该在后续有一个A记录

A:
name:某主机的FQDN,例如www.maricle.com.cn
value:主机名对应主机的IP地址

例如:
1
2
3
4
5
6
7
8
9
maricle.com.cn.    		IN 		A 		1.1.1.1
maricle.com.cn. IN A 1.1.1.2

mx1.maricle.com.cn. IN A 1.1.1.3
mx2.maricle.com.cn. IN A 1.1.1.3

注意:
maricle.com.cn. IN A 1.1.1.4
maricle.com.cn. IN A 1.1.1.4
避免用户写错名称时给错误答案,可通过泛域名解析进行解析至某特定地址

AAAA:
name:FQDN
value:IPv6

PTR:
name:ip,有特定格式,把IP地址反过来写,1.2.3.4,要写作4.3.2.1;而有特定后缀:in-addr.arpa.,所以完整的写法为:4.3.2.1.in-addra.arpa.
value: FQDN

例如:
1
2
3
4.3.2.1.in-addr.arpa.		IN		PTR			www.maricle.com.cn
简写成:
4 IN PTR www.maricle.com.cn.

CNAME:
name:别名的FQDN
value:正工名字的FQDN

例如:
1
web.maricle.com.cn.		IN		CNAME		www.maricle.com.cn.

注意:

1
2
3
4
(1) TTL可从全局继承
(2) @可用于引用当前区域的名字
(3) 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
(4) 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机而已

DNS结构

BIND安装和基础配置

DNS是协议,协议是一种规范,需要我们用软件来实现这种协议。 BIND(Berkeley Internet Name Domain)就是DNS的软件实现。

  1. 安装bind
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
[root@daniel ~]# yum install bind bind-libs bind-utils bind-chroot -y 
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
* base: mirrors.hust.edu.cn
* epel: mirrors.aliyun.com
* extras: mirrors.hust.edu.cn
* updates: mirrors.hust.edu.cn
base | 3.7 kB 00:00
extras | 3.4 kB 00:00
updates | 3.4 kB 00:00
Resolving Dependencies
--> Running transaction check
---> Package bind.x86_64 32:9.8.2-0.47.rc1.el6 will be installed
---> Package bind-chroot.x86_64 32:9.8.2-0.47.rc1.el6 will be installed
---> Package bind-libs.x86_64 32:9.8.2-0.47.rc1.el6 will be installed
---> Package bind-utils.x86_64 32:9.8.2-0.47.rc1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================================================
Package Arch Version Repository Size
================================================================================================================================
Installing:
bind x86_64 32:9.8.2-0.47.rc1.el6 base 4.0 M
bind-chroot x86_64 32:9.8.2-0.47.rc1.el6 base 75 k
bind-libs x86_64 32:9.8.2-0.47.rc1.el6 base 889 k
bind-utils x86_64 32:9.8.2-0.47.rc1.el6 base 187 k

Transaction Summary
================================================================================================================================
Install 4 Package(s)

Total download size: 5.1 M
Installed size: 10 M
Downloading Packages:
(1/4): bind-9.8.2-0.47.rc1.el6.x86_64.rpm | 4.0 MB 00:17
(2/4): bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm | 75 kB 00:00
(3/4): bind-libs-9.8.2-0.47.rc1.el6.x86_64.rpm | 889 kB 00:03
(4/4): bind-utils-9.8.2-0.47.rc1.el6.x86_64.rpm | 187 kB 00:00
--------------------------------------------------------------------------------------------------------------------------------
Total 242 kB/s | 5.1 MB 00:21
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : 32:bind-libs-9.8.2-0.47.rc1.el6.x86_64 1/4
Installing : 32:bind-9.8.2-0.47.rc1.el6.x86_64 2/4
Installing : 32:bind-chroot-9.8.2-0.47.rc1.el6.x86_64 3/4
Installing : 32:bind-utils-9.8.2-0.47.rc1.el6.x86_64 4/4
Verifying : 32:bind-libs-9.8.2-0.47.rc1.el6.x86_64 1/4
Verifying : 32:bind-9.8.2-0.47.rc1.el6.x86_64 2/4
Verifying : 32:bind-utils-9.8.2-0.47.rc1.el6.x86_64 3/4
Verifying : 32:bind-chroot-9.8.2-0.47.rc1.el6.x86_64 4/4

Installed:
bind.x86_64 32:9.8.2-0.47.rc1.el6 bind-chroot.x86_64 32:9.8.2-0.47.rc1.el6 bind-libs.x86_64 32:9.8.2-0.47.rc1.el6
bind-utils.x86_64 32:9.8.2-0.47.rc1.el6

Complete!
[root@daniel ~]#

查看安装生成的配置文件

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
[root@daniel ~]# rpm -ql bind 
/etc/NetworkManager/dispatcher.d/13-named
/etc/logrotate.d/named
/etc/named
/etc/named.conf # bind主配置文件
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/portreserve/named
/etc/rc.d/init.d/named # bind服务脚本文件
/etc/rndc.conf # rndc配置文件
/etc/rndc.key
/etc/sysconfig/named # bind服务脚本的配置文件
/usr/lib64/bind
/usr/sbin/arpaname
/usr/sbin/ddns-confgen
/usr/sbin/dnssec-dsfromkey
/usr/sbin/dnssec-keyfromlabel
/usr/sbin/dnssec-keygen
/usr/sbin/dnssec-revoke
/usr/sbin/dnssec-settime
/usr/sbin/dnssec-signzone
/usr/sbin/genrandom
/usr/sbin/isc-hmac-fixup
/usr/sbin/lwresd
/usr/sbin/named
/usr/sbin/named-checkconf # 检测 /etc/named.conf 文件语法
/usr/sbin/named-checkzone # 检测zone和对应zone文件的语法
/usr/sbin/named-compilezone
/usr/sbin/named-journalprint
/usr/sbin/nsec3hash
/usr/sbin/rndc # 远程dns管理工具
/usr/sbin/rndc-confgen # 生成rndc密钥
# 文档部分省略
/var/log/named.log # 日志文件
/var/named
/var/named/data
/var/named/dynamic
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost # 本地主解析库
/var/named/named.loopback
/var/named/slaves # 从文件夹
/var/run/named
[root@daniel ~]#

正向区域解析

在主配置文件中定义一个zone

1
2
3
4
5
[root@daniel ~]# vim /etc/named.conf
zone "maricle.com.cn" IN { # 定义区域为 maricle.com.cn
type master; # 定义区域类型为 master
file "maricle.com.cn.zone"; # 解析库文件名称为 maricle.com.cn.zone
};

创建区域解析库文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@daniel ~]# vim /var/named/maricle.com.cn.zone
$TTL 86400 # 定义全局默认超时时间
$ORIGIN maricle.com.cn. # 定义后缀
@ IN SOA ns1.maricle.com.cn. admin.maricle.com.cn (
2016082001 # 序列号
1H # 刷新时间
5M # 重试时间
7D # 超时时间
1D ) # 否定答案缓存TTL值
IN NS ns1
IN NS ns2
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 192.168.98.138
ns2 IN A 192.168.98.139
mx1 IN A 192.168.98.140
mx2 IN A 192.168.98.141
www IN A 192.168.98.110 # 注意这些地址,下文中DNS生效时候就会解析到这些地址
www IN A 192.168.98.111
ftp IN CNAME www
~

启动、语法检查并测试

1
2
3
4
5
6
7
[root@daniel ~]# named-checkconf      # 检查主配置文件有无语法错误
[root@daniel ~]# named-checkzone "maricle.com.cn" /var/named/maricle.com.cn.zone # 检查maricle.com.cn.zone有误语法错误
zone maricle.com.cn/IN: loaded serial 2016082001
OK
[root@daniel ~]# service named start
Starting named: [ OK ]
[root@daniel ~]#

正向解析测试

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
[root@daniel ~]# dig -t A www.maricle.com.cn @192.168.98.138   #表示通过本主机进行解析  

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> -t A www.maricle.com.cn @192.168.98.138
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 90
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;www.maricle.com.cn. IN A

;; ANSWER SECTION:
www.maricle.com.cn. 86400 IN A 192.168.98.110 # DNS生效了
www.maricle.com.cn. 86400 IN A 192.168.98.111

;; AUTHORITY SECTION:
maricle.com.cn. 86400 IN NS ns2.maricle.com.cn.
maricle.com.cn. 86400 IN NS ns1.maricle.com.cn.

;; ADDITIONAL SECTION:
ns1.maricle.com.cn. 86400 IN A 192.168.98.138
ns2.maricle.com.cn. 86400 IN A 192.168.98.139

;; Query time: 0 msec
;; SERVER: 192.168.98.138#53(192.168.98.138)
;; WHEN: Sat Aug 20 21:25:12 2016
;; MSG SIZE rcvd: 136

[root@daniel ~]#

或者使用host命令

1
2
3
4
5
6
7
8
9
[root@daniel ~]# host -t A www.maricle.com.cn 192.168.98.138 
Using domain server:
Name: 192.168.98.138
Address: 192.168.98.138#53
Aliases:

www.maricle.com.cn has address 192.168.98.111
www.maricle.com.cn has address 192.168.98.110
[root@daniel ~]#

反向区域解析

定义区域

1
2
3
4
5
[root@daniel ~]# vim /etc/named.rfc1912.zones 
zone "98.168.192.in-addr.arpa" IN {
type master;
file "192.168.98.zone";
};

定义解析库文件(注意要和正向区域的解析库文件一一对应)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@daniel ~]# cat /var/named/192.168.98.zone 
$TTL 86400
$ORIGIN 98.168.192.in-addr.arpa.
@ IN SOA ns1.maricle.com.cn. admin.maricle.com.cn. (
2015042201
1H
5M
7D
1D)
IN NS ns1.maricle.com.cn.
IN NS ns2.maricle.com.cn.
138 IN PTR ns1.maricle.com.cn.
139 IN PTR ns2.maricle.com.cn.
110 IN PTR www.maricle.com.cn.
140 IN PTR mx1.maricle.com.cn.
111 IN PTR www.maricle.com.cn.
141 IN PTR mx2.maricle.com.cn.
[root@daniel ~]#

反向解析测试

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
[root@daniel named]# host -t A 192.168.98.138 192.168.98.138 
Using domain server:
Name: 192.168.98.138
Address: 192.168.98.138#53
Aliases:

138.98.168.192.in-addr.arpa domain name pointer ns1.maricle.com.cn. # ns1记录
[root@daniel named]# host -t A 192.168.98.139 192.168.98.138
Using domain server:
Name: 192.168.98.138
Address: 192.168.98.138#53
Aliases:

139.98.168.192.in-addr.arpa domain name pointer ns2.maricle.com.cn. # ns2记录
[root@daniel named]# host -t A 192.168.98.140 192.168.98.138
Using domain server:
Name: 192.168.98.138
Address: 192.168.98.138#53
Aliases:

140.98.168.192.in-addr.arpa domain name pointer mx1.maricle.com.cn. # mx1记录
[root@daniel named]# host -t A 192.168.98.141 192.168.98.138
Using domain server:
Name: 192.168.98.138
Address: 192.168.98.138#53
Aliases:

141.98.168.192.in-addr.arpa domain name pointer mx2.maricle.com.cn. # mx2记录
[root@daniel named]# host -t A 192.168.98.111 192.168.98.138
Using domain server:
Name: 192.168.98.138
Address: 192.168.98.138#53
Aliases:

111.98.168.192.in-addr.arpa domain name pointer www.maricle.com.cn. # www记录
[root@daniel named]#

模拟区域全量传送

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
[root@daniel named]# dig -t axfr maricle.com.cn @192.168.98.138   # 正向区域全量传送

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> -t axfr maricle.com.cn @192.168.98.138
;; global options: +cmd
maricle.com.cn. 86400 IN SOA ns1.maricle.com.cn. admin.maricle.com.cn. 2015042201 3600 300 604800 86400
maricle.com.cn. 86400 IN NS ns1.maricle.com.cn.
maricle.com.cn. 86400 IN NS ns2.maricle.com.cn.
maricle.com.cn. 86400 IN MX 10 mx1.maricle.com.cn.
maricle.com.cn. 86400 IN MX 20 mx2.maricle.com.cn.
ftp.maricle.com.cn. 86400 IN CNAME www.maricle.com.cn.
mx1.maricle.com.cn. 86400 IN A 192.168.98.140
mx2.maricle.com.cn. 86400 IN A 192.168.98.141
ns1.maricle.com.cn. 86400 IN A 192.168.98.138
ns2.maricle.com.cn. 86400 IN A 192.168.98.139
www.maricle.com.cn. 86400 IN A 192.168.98.110
www.maricle.com.cn. 86400 IN A 192.168.98.111
maricle.com.cn. 86400 IN SOA ns1.maricle.com.cn. admin.maricle.com.cn. 2015042201 3600 300 604800 86400
;; Query time: 1 msec
;; SERVER: 192.168.98.138#53(192.168.98.138)
;; WHEN: Sat Aug 20 23:08:22 2016
;; XFR size: 13 records (messages 1, bytes 304)

[root@daniel named]# dig -t axfr 98.168.192.in-addr.arpa @192.168.98.138 # 反向区域全量传送

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> -t axfr 98.168.192.in-addr.arpa @192.168.98.138
;; global options: +cmd
98.168.192.in-addr.arpa. 86400 IN SOA ns1.maricle.com.cn. admin.maricle.com.cn. 2015042201 3600 300 604800 86400
98.168.192.in-addr.arpa. 86400 IN NS ns1.maricle.com.cn.
98.168.192.in-addr.arpa. 86400 IN NS ns2.maricle.com.cn.
110.98.168.192.in-addr.arpa. 86400 IN PTR www.maricle.com.cn.
111.98.168.192.in-addr.arpa. 86400 IN PTR www.maricle.com.cn.
138.98.168.192.in-addr.arpa. 86400 IN PTR ns1.maricle.com.cn.
139.98.168.192.in-addr.arpa. 86400 IN PTR ns2.maricle.com.cn.
140.98.168.192.in-addr.arpa. 86400 IN PTR mx1.maricle.com.cn.
141.98.168.192.in-addr.arpa. 86400 IN PTR mx2.maricle.com.cn.
98.168.192.in-addr.arpa. 86400 IN SOA ns1.maricle.com.cn. admin.maricle.com.cn. 2015042201 3600 300 604800 86400
;; Query time: 0 msec
;; SERVER: 192.168.98.138#53(192.168.98.138)
;; WHEN: Sat Aug 20 23:08:23 2016
;; XFR size: 10 records (messages 1, bytes 289)

注:本文简单描述了DNS的工作原理与DNS的BIND实现,正向解析反向解析,原理较少,偏操作。 DNS相关的还有主从DNS的实现,后续会放出。

感谢各位大牛不吝赐教。