本博客主要讲:

DNS原理、DNS缓存服务器、主从服务器、DNS转发、子域授权、ACL与View、日志系统与压力测试工具

实现DNS服务的软件如:Bind、powerdns。本博客主要讲Bind

一、DNS原理

网络通讯大部分是基于TCP/IP协议,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“125.39.240.113”之类的IP地址,而不能认识域名。我们无法记住那么多数字组成的IP地址,所以我们在访问网站时,在浏览器地址栏中输入的几乎都是域名,就能看到我们所需要的内容,这是因为有一个“DNS服务器”自动把我们的域名转换成了相应的IP地址,然后查询出IP地址所对应的网页。

DNS是什么东东?

DNS( DomainName System)是“域名系统”的英文缩写,它是由解析器以及域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。DNS使用TCP与UDP端口号都是53,主要使用“UDP”协议,服务器之间备份使用“TCP”协议。它的基本工作原理用图来表示如:

RHEL6 DNS服务详解_第1张图片

DNS域名称

域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。DNS数据库中的名称形成一个分层树状结构称为域命名空间。域名包含单个标签分隔点,如:www.google.com 完全限定的域名(FQDN)唯一地标识在 DNS分层树中的主机的位置,通过指定的路径中点分隔从根引用的主机的名称列表。DNS 域名称层次结构如:

RHEL6 DNS服务详解_第2张图片

DNS域:

互联网域名系统由名称注册机构负责维护分配由组织和国家/地区的顶级域在 Internet 上进行管理。这些域名按照国际标准进行分配。一些常见的DNS域名称如:

com:商业公司 edu:教育机构 net:网络公司 gov:政府机构 mil:军事政府机构 cn:中国

DNS域名称空间的组织方式

根域:DNS域名使用时,由尾部点"."来指定名称位于根域或更高

顶级域:用来表示某个国家或地区使用的名称类型 如: .cn

二级域:个人或组织在internet上使用的注册名称 如:google.com

子域:已注册的二级域名衍生的域名,也就是网站名 如:www.google.com

主机名:通常表示DNS域名的最左侧标签来标识网络上特定的计算机 如: ns1 ns1.www.google.com

Dns服务的工作过程

当 DNS 客户机需要查询程序中使用的名称时,它会查询本地DNS服务器来解析该名称。客户机发送的每条查询消息都包括3条信息,以指定服务器应答的问题

  1. 指定的 DNS 域名,表示为完全合格的域名 (FQDN) 

  2. 指定的查询类型,它可根据类型指定资源记录

  3. DNS域名指定的类别

对于DNS 服务器,它始终应指定为 Internet 类别。例如,指定的名称可以是计算机的完全合格的域名,如im.qq.com,并且指定的查询类型用于通过该名称搜索地址资源记录

DNS 查询以各种不同的方式进行解析。客户机有时也可通过使用从以前查询获得的缓存信息就地应答查询。DNS 服务器可使用其自身的资源记录信息缓存来应答查询,也可代表请求客户机来查询或联系其他 DNS 服务器,以完全解析该名称,并随后将应答返回至客户机。这个过程称为递归查询

另外,客户机自己也可尝试联系其他的DNS 服务器来解析名称。如果客户机这么做,它会使用基于服务器应答的独立和附加的查询,该过程称作迭代查询,即DNS服务器之间的交互查询就是迭代查询

DNS查询的过程如下图:
RHEL6 DNS服务详解_第3张图片

  1. 在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析

  2. 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析

  3. 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性

  4. 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性

  5. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机

  6. 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机

注:从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询


注:红色字体为命令

二、DNS缓存服务器

1、规划好配置信息

NS服务器是:172.16.14.1

两台www服务器分别是:172.16.14.1172.16.14.2

mail服务器是:172.16.14.3

有一台FTP主机在www服务器上,即FTPwww的别名(CNAME)

2、准备工作:

首先我们需要先获取到软件包,rpm包可以到光盘映像里索取,也可以配置Yum;本博客采用yum安装。而源码包可以从官方网站下载https://www.isc.org/downloads/,本博客主要以rpm安装方式进行讲解,我们使用(CentOS6.4)光盘映像中的bind软件来搭建DNS服务器,首先需要安装好bind-9.8.2-0.17.rc1.el6.x86_64bind-libs.x86_64bind-utils.x86_64这三个软件包。

3、配置文件详解

/etc/named.conf为Bind服务进程的主配置文件

区域的定义,切记每个选项后面都要加分号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
options { #定义全局选项
directory "/var/named"#定义区域数据文件存放目录
}; 
zone  "."IN { #定义根区域
typehint; #定义区域类型为根
file"named.ca"#定义数据文件
}; 
zone  "localhost"IN { #定义本地解析区域
typemaster|slave; #定义区域类型为主或辅
file"named.localhost"#定义数据文件
};
zone  "0.0.127.in-addr.arpa"IN { #定义反向解析区域
typemaster|slave; #定义区域类型为主或辅
file"named.loopback"#定义数据文件
};

/etc/named.rfc1912.zones:区域配置文件

/var/named/:目录中存放的为区域数据文件

/etc/rc.d/init.d/named :服务控制脚本,可以使用service来控制启动和关闭.我们也可以使用rndc命令来控制bind服务的启动和关闭. 如: rndc start|stop|reload|status 启动、停止、重新加载、查看状态

4. Dns资源记录类型

1
2
3
4
5
6
7
8
SOA:起始授权记录
$TTL 600
@ IN SOA [FQDN]text.cn. admin.com.[管理员邮箱] (
2013081001; serial #版本号(最长为10位数字)
1D; refresh #定义检查周期时间
1H; retry #定义重试时间
1W; expire #定义过期时间
3H ); minimum #定义否定答案时长

时间单位:M(分钟)H(小时)D()W()、默认单位是秒

NS:区域名称-->主机名 如: test.cn. IN NS ns.test.cn.

MX:(邮件) 区域名称-->FQDN 如: test.cn. IN MX 10 mail.test.cn. #数字(0-99)越小级别越高

mail.text.cn IN A 172.16.14.3

A:FQDN-->IPv4 AAAA:FQDN-->IPv6

PTR:Ip-->FQDN 指针记录 CNAME:FQDN-->FQDN 别名记录

5. 配置缓存服务器

提示:后面的实验我们都需要关闭本地的防火墙与SELinux

关闭防火墙: service iptables stop 关闭SELinux: setenforce 0

先打开主配置文件 vim /etc/named.conf

1
2
3
4
5
6
7
options {
// listen-on port 53 { 127.0.0.1; }; #把本行注释默认只监听127.0.0.1的53端口
// listen-on-v6 port 53 { ::1; }; #把本行注释,我们不使用IPv6
directory "/var/named"#定义区域数据文件存放目录
// allow-query { localhost; }; #把本行注释,默认只允许本地查询
recursion yes#是否允许递归
};

打开区域配置文件,可以只保留这两个区域 vim /etc/named.rfc1912.zones

1
2
3
4
5
6
7
8
9
10
zone  "localhost"IN { #定义本地解析区域
typemaster; #定义区域类型为主
file"named.localhost"#定义数据文件
allow-update { none; }; #是否允许更新
};
zone  "0.0.127.in-addr.arpa"IN { #定义反向解析区域
typemaster; #定义区域类型为主
file"named.loopback"#定义数据文件
allow-update { none; }; #是否允许更新
};

保存并退出,检查语法是否错误 named-checkconf

启动DNS服务器,Dns进程为named:

1
2
[root@localhost ~]# service named start
Starting named: [ OK ]

修改本地DNS地址为本机:echo "nameserver 172.16.14.1" >> /etc/resolv.conf

下面我们用dig命令来测试一下解析根:dig -t NS . @172.16.14.1 -t:指定资源记录类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost ~]# dig -t NS . @172.16.14.2
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> -t NS . @172.16.14.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54857
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 14
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 518282 IN NS j.root-servers.net.
. 518282 IN NS a.root-servers.net.
. 518282 IN NS k.root-servers.net.
. 518282 IN NS b.root-servers.net.
. 518282 IN NS h.root-servers.net.
. 518282 IN NS c.root-servers.net.
. 518282 IN NS e.root-servers.net.
. 518282 IN NS d.root-servers.net.
. 518282 IN NS l.root-servers.net.
. 518282 IN NS f.root-servers.net.
. 518282 IN NS i.root-servers.net.
. 518282 IN NS g.root-servers.net.
. 518282 IN NS m.root-servers.net.
;; ADDITIONAL SECTION:

6、把Dns服务加入到开机启动项 


三、配置主从DNS服务器

1、服务器规划:

假设我们已经在网上注册了一个域名为test.cn

NS服务器是:master:172.16.14.1 slave:172.16.14.2

两台www服务器分别是:172.16.14.3172.16.14.4

mail服务器是:172.16.14.5

有一台FTP主机在www服务器上,即FTPwww的别名(CNAME)

2、所使用的软件与DNS缓存服务器一样

首先我们先在master与slave服务上安装bind,在安装前确认一下本机上有没有安装bind.如果有比我们使用的版本低的卸载后重新安装或直接升级安装.

RHEL6 DNS服务详解_第4张图片

安装bind软件包

yum -y install bind

bind的主配置文件:/etc/name.conf;配置文件中主要讲解dns服务的区域定义与工作属性;而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
cp-p /etc/named.conf /etc/named.conf.bak
#创建"test.cn"正向与反向区域
options { #定义全局选项
listen-on port 53 { any; }; #监听地址与端口,把地址改为any或注释
directory "/var/named"#定义区域数据文件存放目录
allow-query { any; }; #本行注释或改为any,默认只允许本地查询
recursion yes#是否允许递归
}; 
zone  "."IN { #定义根区域
typehint; #定义区域类型为根
file"named.ca"#定义数据文件
}; 
zone  "localhost"IN { #定义本地解析区域
typemaster; #定义区域类型为主
file"named.localhost"#定义数据文件
};
zone  "0.0.127.in-addr.arpa"IN { #定义反向解析区域
typemaster; #定义区域类型为主
file"named.loopback"#定义数据文件
};
zone  "test.cn"IN { #定义test.cn解析区域
typemaster; #定义区域类型为主
file"test.cn.zone"#定义数据文件
};
zone  "14.16.172.in-addr.arpa"IN { #定义test.cn反向解析区域
typemaster; #定义区域类型为主
file"172.16.14.zone"#定义数据文件
};

创建正向区域解析文件:

vim /var/named/test.cn.zone

RHEL6 DNS服务详解_第5张图片

创建反向区域解析文件

vim /var/named/172.16.14.zone

RHEL6 DNS服务详解_第6张图片

检查区域配置文件权限:

修改区域配置文件权限为640,并修改其属组

检查语法是否有错误:

检测配置文件:named-checkconfig

检测区域配置文件: 

1
2
named-checkzone  "test.cn"/var/named/test.cn.zone
named-checkzone  "14.16.172.in-addr.arpa"/var/named/172.16.14.zone

启动成功,我们用dig命令测试一下A记录与NS记录:dig -t A www.test.cn

RHEL6 DNS服务详解_第7张图片

测试NS记录:dig -t NS test.cn

RHEL6 DNS服务详解_第8张图片

3、从服务器配置

从服务器的准备工作与主服务器是相同的,这里就不再介绍。

配置yum源,安装bind工具包,备份/etc/named.conf文件,手动配置一个主文件/etc/named.conf,/var/named/slaves这个目录默认属主属组是named。这们就直接把要同步过来的文件放到这个目录下

编辑从服务器配置文件: vim /etc/named.conf

RHEL6 DNS服务详解_第9张图片

修改一下主服务器(172.16.14.1)的主配置文件,允许从服务器区域传送:

RHEL6 DNS服务详解_第10张图片

修改主服务器的正向与反向区域配置文件,添加从服务器记录信息并重新加载配置文件:

RHEL6 DNS服务详解_第11张图片

RHEL6 DNS服务详解_第12张图片

重启named: service named restart

验证从服务器是否同步文件:

查看主服务器日志信息,显示172.16.14.2客户端成功传送:

RHEL6 DNS服务详解_第13张图片我们在主DNS服务器添加一条正向解析记录并重新加载配置文件:

RHEL6 DNS服务详解_第14张图片

重启named: service named restart

查看主服务器日志信息:

查看从服务器/var/named/slaves/目录下的正向区域文件是否同步:

RHEL6 DNS服务详解_第15张图片


四、子域授权

1、子域的准备工作与从服务器是相同的,这里就不再介绍。172.16.14.8做子域授权主机。

配置yum源,安装bind工具包,备份/etc/named.conf文件,手动配置一个主文件/etc/named.conf

编辑主DNS服务器正向区域文件/var/named/test.cn.zone,给子域做授权,添加如下记录:

1
2
重新加载配置文件:service named reload
编辑子域服务器配置文件: vim /etc/named.conf

RHEL6 DNS服务详解_第16张图片

子域的正向区域解析文件:

注意:把文件的权限改为640,属组为named.

RHEL6 DNS服务详解_第17张图片

重启named服务:service named restart

在主服务器上用dig -t A www.dns.test.cn来测试子域服务器是否能解析:

注:父域可以解析子域,但子域不能解析到父域

RHEL6 DNS服务详解_第18张图片


五、DNS转发服务器配置及Acl实现:

acl:访问控制列表,用来定义一组地址,方便在配置文件中调用。

在主服务器上打开配置文件:vim /etc/named.conf

RHEL6 DNS服务详解_第19张图片

在172.16.14.8主机上做测试:

RHEL6 DNS服务详解_第20张图片

在172.16.14.10主机上做测试:


六、View视图智能DNS

我们就模拟国内两大运营商(电信和联通),通过在配置文件中指定特定的客户端(IP地址)来完成智能DNS解析示例。

注:配置文件不做太详细,这里只做简单配置;能说明用法。望谅解

打开配置文件/etc/named.conf编辑内容:

RHEL6 DNS服务详解_第21张图片

编辑模拟联通网络的区域解析文件:

RHEL6 DNS服务详解_第22张图片

编辑模拟电信的区域解析文件:

RHEL6 DNS服务详解_第23张图片

修改区域文件的权限为640,属组为named:

重新启动named服务: service named restart

配置联通IP使用联通客户端验证:

RHEL6 DNS服务详解_第24张图片

RHEL6 DNS服务详解_第25张图片

配置电信IP地址并使用电信客户端验证:

RHEL6 DNS服务详解_第26张图片

RHEL6 DNS服务详解_第27张图片

View视图,智能DNS已经能成功解析。


七:DNS日志系统

RHEL6 DNS服务详解_第28张图片

解析一条A记录信息验证一下:host -t A www.test.cn

RHEL6 DNS服务详解_第29张图片


八、DNS压力测试

1、首先要获取DNS源码包,这里我们使用的版本是bind-9.9.3-P2.tar.gz,可以到官网获取ftp://ftp.isc.org/isc/bind9/9.9.3-P2/bind-9.9.3-P2.tar.gz

2、我们要使用的压力测试工具“queryperf”,把这个工具安装上

3、写一个文本文件,里面包含DNS解析记录,每行一条记录:如:www.test.cn A

开始安装“queryperf”工具: 注:在编译安装过程中有可能会报错,提示没有安装libpcap,把CentOS6.4第二张光盘挂载到系统,使用rpm安装一下这个软件包即可

1
2
3
4
5
[root@localhost ~]# tar xf bind-9.9.3-P2.tar.gz #解压软件包
[root@localhost ~]# cd bind-9.9.3-P2/contrib/queryperf/ #切换工作目录 
[root@localhost queryperf]#./configure --prefix=/usr/local/queryperf #编译前配置
[root@localhost queryperf]# make #编译
[root@localhost queryperf]# make install #编译安装

写一个文本文件包含DNS解析记录信息: 

RHEL6 DNS服务详解_第30张图片

执行"queryperf"命令,做压力测试: -d:指定文件 -s:指定主机地址

RHEL6 DNS服务详解_第31张图片

本博客至此结束,由于内容较多,望广大博友多提宝贵意见.谢谢...