本博客主要讲:
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”协议。它的基本工作原理用图来表示如:
DNS域名称
域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。DNS数据库中的名称形成一个分层树状结构称为域命名空间。域名包含单个标签分隔点,如:www.google.com 完全限定的域名(FQDN)唯一地标识在 DNS分层树中的主机的位置,通过指定的路径中点分隔从根引用的主机的名称列表。DNS 域名称层次结构如:
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条信息,以指定服务器应答的问题
指定的 DNS 域名,表示为完全合格的域名 (FQDN)
指定的查询类型,它可根据类型指定资源记录
DNS域名指定的类别
对于DNS 服务器,它始终应指定为 Internet 类别。例如,指定的名称可以是计算机的完全合格的域名,如im.qq.com,并且指定的查询类型用于通过该名称搜索地址资源记录
DNS 查询以各种不同的方式进行解析。客户机有时也可通过使用从以前查询获得的缓存信息就地应答查询。DNS 服务器可使用其自身的资源记录信息缓存来应答查询,也可代表请求客户机来查询或联系其他 DNS 服务器,以完全解析该名称,并随后将应答返回至客户机。这个过程称为递归查询
另外,客户机自己也可尝试联系其他的DNS 服务器来解析名称。如果客户机这么做,它会使用基于服务器应答的独立和附加的查询,该过程称作迭代查询,即DNS服务器之间的交互查询就是迭代查询
DNS查询的过程如下图:
在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析
如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析
如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性
如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性
如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机
如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机
注:从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询
注:红色字体为命令
二、DNS缓存服务器
1、规划好配置信息
NS服务器是:172.16.14.1
两台www服务器分别是:172.16.14.1,172.16.14.2
mail服务器是:172.16.14.3
有一台FTP主机在www服务器上,即FTP为www的别名(CNAME)
2、准备工作:
首先我们需要先获取到软件包,rpm包可以到光盘映像里索取,也可以配置Yum;本博客采用yum安装。而源码包可以从官方网站下载https://www.isc.org/downloads/,本博客主要以rpm安装方式进行讲解,我们使用(CentOS6.4)光盘映像中的bind软件来搭建DNS服务器,首先需要安装好bind-9.8.2-0.17.rc1.el6.x86_64、bind-libs.x86_64、bind-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 { #定义根区域
type hint; #定义区域类型为根
file "named.ca" ; #定义数据文件
};
zone
"localhost" IN { #定义本地解析区域
type master|slave; #定义区域类型为主或辅
file "named.localhost" ; #定义数据文件
};
zone
"0.0.127.in-addr.arpa" IN { #定义反向解析区域
type master|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 { #定义本地解析区域
type master; #定义区域类型为主
file "named.localhost" ; #定义数据文件
allow-update { none; }; #是否允许更新
};
zone
"0.0.127.in-addr.arpa" IN { #定义反向解析区域
type master; #定义区域类型为主
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.3,172.16.14.4
mail服务器是:172.16.14.5
有一台FTP主机在www服务器上,即FTP为www的别名(CNAME)
2、所使用的软件与DNS缓存服务器一样
首先我们先在master与slave服务上安装bind,在安装前确认一下本机上有没有安装bind.如果有比我们使用的版本低的卸载后重新安装或直接升级安装.
安装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 { #定义根区域
type hint; #定义区域类型为根
file "named.ca" ; #定义数据文件
};
zone
"localhost" IN { #定义本地解析区域
type master; #定义区域类型为主
file "named.localhost" ; #定义数据文件
};
zone
"0.0.127.in-addr.arpa" IN { #定义反向解析区域
type master; #定义区域类型为主
file "named.loopback" ; #定义数据文件
};
zone
"test.cn" IN { #定义test.cn解析区域
type master; #定义区域类型为主
file "test.cn.zone" ; #定义数据文件
};
zone
"14.16.172.in-addr.arpa" IN { #定义test.cn反向解析区域
type master; #定义区域类型为主
file "172.16.14.zone" ; #定义数据文件
};
|
创建正向区域解析文件:
vim /var/named/test.cn.zone
创建反向区域解析文件
vim /var/named/172.16.14.zone
检查区域配置文件权限:
修改区域配置文件权限为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
测试NS记录:dig -t NS test.cn
3、从服务器配置
从服务器的准备工作与主服务器是相同的,这里就不再介绍。
配置yum源,安装bind工具包,备份/etc/named.conf文件,手动配置一个主文件/etc/named.conf,/var/named/slaves这个目录默认属主属组是named。这们就直接把要同步过来的文件放到这个目录下
编辑从服务器配置文件: vim /etc/named.conf
修改一下主服务器(172.16.14.1)的主配置文件,允许从服务器区域传送:
修改主服务器的正向与反向区域配置文件,添加从服务器记录信息并重新加载配置文件:
重启named: service named restart
验证从服务器是否同步文件:
查看主服务器日志信息,显示172.16.14.2客户端成功传送:
我们在主DNS服务器添加一条正向解析记录并重新加载配置文件:
重启named: service named restart
查看主服务器日志信息:
查看从服务器/var/named/slaves/目录下的正向区域文件是否同步:
四、子域授权
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
|
子域的正向区域解析文件:
注意:把文件的权限改为640,属组为named.
重启named服务:service named restart
在主服务器上用dig -t A www.dns.test.cn来测试子域服务器是否能解析:
注:父域可以解析子域,但子域不能解析到父域
五、DNS转发服务器配置及Acl实现:
acl:访问控制列表,用来定义一组地址,方便在配置文件中调用。
在主服务器上打开配置文件:vim /etc/named.conf
在172.16.14.8主机上做测试:
在172.16.14.10主机上做测试:
六、View视图智能DNS
我们就模拟国内两大运营商(电信和联通),通过在配置文件中指定特定的客户端(IP地址)来完成智能DNS解析示例。
注:配置文件不做太详细,这里只做简单配置;能说明用法。望谅解
打开配置文件/etc/named.conf编辑内容:
编辑模拟联通网络的区域解析文件:
编辑模拟电信的区域解析文件:
修改区域文件的权限为640,属组为named:
重新启动named服务: service named restart
配置联通IP使用联通客户端验证:
配置电信IP地址并使用电信客户端验证:
View视图,智能DNS已经能成功解析。
七:DNS日志系统
解析一条A记录信息验证一下:host -t A www.test.cn
八、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解析记录信息:
执行"queryperf"命令,做压力测试: -d:指定文件 -s:指定主机地址
本博客至此结束,由于内容较多,望广大博友多提宝贵意见.谢谢...