DNS: Domain Name Service
DNS服务是一种分布式数据库,它提供规范机器名到数字IP地址的映射及数字IP到规范机器名。
DNS相关定义:
用于主机和IP地址的一个有层次结构的名字空间;
主机名和地址信息保存在一个分布式数据库中;
一个查询这个数据库的解析器(resolver)
改进了路由电子邮件的机制,以及邮件发送方的身份验证机制
域名服务器用于交换信息的一种机制
用于查询网络上服务的一种机制
DNS工作原理:
DNS域名服务器其实就是个分布式数据库,它主要提供规范的FQDN到IP地址的解析,反之亦然。
构成全世界DNS系统的是一个分布式数据库,每个站点都维护着这个数据库的一个或者多个组成部分。有点类似如图1
我们通过下面的案例来介绍DNS服务器完成解析(参考图)
域名服务器解析原理及过程:
- 说明:服务器之间的箭头上的数字均显示DNS查询事件的次序,字母则表示事件查询请求的类型。并且在此查询之前,ns.fin.example.com服务器没有相关的缓存记录,并且本地缓存文件也没有相关的www.fin.example.com的相关记录。
- 本地域名服务器是一台递归服务器,当它第一次发送查询请求时,得到的是推荐DNS服务器地址,则本地DNS服务器去新的DNS服务器发出查询请求,然后再去得到推荐的DNS服务发送请求,直到找到相应的主机记录为止。
- 查询流程详解:
- <1>所以当sandy用户查询www.fin.example.com这台主机的相关记录,它首先去本地(/etc/hosts)查询有没有相关的记录,有则返回结果,
- 没有则去本地DNS服务器(ns.fin.example.com)发送请求。
- <2>本地域名服务器(ns.fin.example.com)查询缓存发现没sandy用户查询的相关记录,所以它去根服务器查询fin.example.com的相关记录,并得到一个推荐的DNS服务器的地址(.com)
- <3>然后本地域名服务去com域名服务器查询(fin.example.com)的相关记录,并得到了关于exampl.com域服务器地址,然后本地域名服务向example.com发送查询请求,example.com域名服务器查询缓存没有相应的答案,则推荐到fin.example.com域名服务器去查询,对于查询域名信息来说,fin.example.com的域名则是权威的,它在自己的管辖内找到www这台主机,然后用www这台主机的地址回复本地域名服务器(ns.fin.example.com)。
- <4>本地域名服务器(ns.fin.example.com)得到了关于www.fin.example.com的主机记录,并将记录到缓存区域,然后发送给sandy用户。
- <5>下次再有用户查询www.fin.example.com主机信息时,本地域名服务器直接从缓存中调用此记录即可。
注:DNS查询类型:
递归查询:客户端得到结果要么成功,要么失败。(本地客户端和DNS服务直接交互)
迭代查询:服务器以相关最佳记录返回本地域名服务器。(DNS服务与DNS服务交互)
所以本地客户端详本地域名服务器查询请求时,查询类型为:一次递归,多次迭代。
DNS服务器的分类:
- 主域名服务器(Primary Name Server)
- 主域名服务器是特定域所有信息的权威来源,主域名服务器是特定域所有信息的权威来源,它从域管理员构造本地文件中加载域信息,
- 该文件包含服务器具有管理权的部分域结果的最权威信息。主域名服务器需要配置一组完整的文件,即主机配置文件(named.conf),正向区域文件、反向区域文件、高速缓存初始化文件(named.ca),回送文件(named.local)
- 辅助DNS服务器(Second Name Server)
- 辅助DNS服务器用来从主域名服务器同步区域数据文件,作为磁盘文件保存在辅助域名服务器相对应的目录,辅助DNS服务器只需要配置主配置文件即可,不需要配置区域数据文件。
- 唯高速缓存域名服务器(Cache-only Server)
- 唯高速缓存域名服务器不包含域名数据库文件,它每次将从域名服务器得到的查询结果返回给客户端,并在本地将以缓存,供下次查询使用。
DNS层次结构中资源记录的基本格式:
- [name] [ttl] [class] type [rdata]
- [name(名字)]:
- name字段表示该记录所描述的实体(通常是主机或者一个域)。如果几个连续的记录涉及同一个实体的话,那么则第一条之后可以省略,利用@特殊
- 字符来代替这个name字段。
- [ttl]字段
- TTL(time to live (存活时间)),默认字段以秒为单位指定时间长度,在指定的时间内,数据项可被缓存并且仍被认为是有效的。TTL必须位于该区域数据文件的第一行,来进行标识
- class:class指定网络类型:默认类型为IN
- IN(指Internet)、HS(Hesiod:本地使用的目录服务)、CH(供域名服务器内部用来标示自己)
- type类型:
- A(Address):记录FQDN-IP转换
- MX(Mail eXchanger):记录邮件交换记录
- CNAME(Canonical NAME):记录别名,允许将多个名字映射到一个主机,通常CNAME主要用于WEB和邮件服务器。
- SOA:(Start Of Authority):一个授权区的开始。每个配置文件必须包含SOA记录,以标志服务器所管理的起始处。
- PTR(domain name PonitTeR):记录IP-FQDN
- HINFO(Host INFOrmation):记录一组描述主机的信息文件组成,例如:一些硬件名称及操作系统名称等信息。
- rdata:
- A:记录主机IP地址
- HINFO:记录Hardware和OS相关记录
- MX:记录提供收发电子邮件相关信息,一般包含两个部分(preference-value)
BIND常用到的资源记录语法:
- 1、SOA资源记录
- $TTL 86400
- 区域名称(Name) 记录类型(type) SOA 主域名服务器(FQDN) 管理员邮箱地址(mail) (
- serial ##number 序列号,每次更改配置值是都要在原来的基础上加上1,表示以更新。
- refresh ##刷新时间(间隔)
- retry ##重试时间(间隔)
- expire ##过期时间(间隔)
- na ttl ) ##否定答案缓存TTL值
- 时间单位:M(分钟)、H(小时)、D(天)、W(周),默认单位是秒
- 好了,对DNS工作原理有所了解,那么就来创建个DNS服务器吧!!!
- 实验环境:
OS:RedHat 5.8
Software:bind97 bind97-utils bind97-libs
master server(172.16.88.1)
Domain Name:example.com
www主机地址:172.16.88.3/172.16.88.4 ##提供http服务
mail服务器:172.16.88.5 ##提供邮件的收发
www主机创建别名 sandy
slave server (172.16.88.2) ##实现负载均衡- 第一步:使用YUM安装DNS所使用的软件包(BIND),这里使用的是bind97
- 第二步:自己创建配置文件(/etc/named.conf)
- 第三步:创建区域数据文件(/var/named)
- 第四步:使用相关命令(named-checkconf、named-checkzone)测试配置文件及区域文件是否存在语法错误
- 第五步:启动named服务(service named start 、/etc/rc.d/init.d/named start)
- 第六步:使用命令更改系统启动时自动在启动named服务(chkconfig named on)默认2345级别(可以根据自己的需求设定启动级别)
- 第七步:更改iptables和selinux的设置
- 第八步:分别使用(dig/nslookup)在Linux/Windows主机进行查询DNS相关资源记录
- 第九步:设置递归选项
- (1),实现不给任何主机递归,但可以给本地递归
- (2),实现只给172.16.0.0/16网段递归,其他不递归。
- 第十步:设置区域传送,并创建辅助DNS服务器并实现从主DNS服务同步区域数据文件并查看日志文件(/var/log/message)
- (1)、先创建一个辅助DNS
- (2)、然后再实现从主DNS服务器完全同步区域数据文件,查看日志文件及从服务器是否完成同步
- (3)、然后再主DNS服务器上新增一条资源记录并查看日志文件,然后到辅助DNS服务上查看日志是否 完成增量区域数据同步
- 第十一步:编译安装dnstop工具,查看DNS工作状态
第一步:配置YUM源(可以参考笔者的关于YUM和RPM的介绍来进一步了解YUM和RPM日常工作中的使用)
- [root@Gdy ~]# yum list all | grep 'bind'
- [root@Gdy ~]# rpm -e bind-libs bind-utils ##这里采用的是bind97版本,所以把系统默认安装的bind-libs、bind-utils卸载
- [root@Gdy ~]# yum install bind97 bind97-utils ##bind97(服务器所使用的软件包) bind97-utils(客户端工具)
第二步:创建DNS的主配置文件(/etc/named.conf)
- [root@Gdy ~]# mv /etc/named.conf /etc/named.conf.bak
- [root@Gdy ~]# vim /etc/named.conf
- 编辑主配置文件,添加如下内容(named.conf里面没有任何内容)
- options {
- directory "/var/named" ; ##指明区域文件保存的位置
- };
- zone "." IN ##定义根区域文件名称
- type hint;
- file "named.ca"; ##默认存放在/var/named/named.ca
- };
- zone "localhost" IN {
- type master;
- file "named.localhost";
- };
- zone "0.0.127.in-addr.arpa" IN {
- type master;
- file "named.loopback";
- };
- zone "example.com" IN { ##定义example.com正向区域配置文件
- type master; ##类型为master(主DNS)
- file "example.com.zone"; ##example.com域正向区域配置文件存放名称(/var/named/example.com.zone)
- };
- zone "88.16.172.in-addr.arpa" IN { ##定义example.com域反向区域配置文件
- type master; ##类型为master(主DNS)
- file "172.16.88.zone"; ##example.com域反向区域配置文件存放名称(/var/named/172.16.88.zone)
- };
注:修改/etc/named.conf的权限为(640)及属主属组(root:named)
- [root@Gdy ~]# chown root:named /etc/named.conf ##将主配置文件的属主和属组改为root和named
- [root@Gdy ~]# chown 640 /etc/named.conf ##将named.conf的权限更改为640,只有管理员具有读写的权限,组有读的权限。
- [root@Gdy ~]# ll /etc/named.conf
- -rw-r--r-- 1 640 named 374 Apr 2 15:41 /etc/named.conf
- [root@Gdy ~]#
第三步:创建区域配置文件(example.com.zone)
- [root@Gdy ~]# cd /var/named
- [root@Gdy named]# vim example.com.zone
- 添加如下内容:
- $TTL 86400
- @ IN SOA ns1.example.com. admin.example.com. (
- 2013040201 ##序列号(每次更新时都加上1,便于从服务器更新)
- 1H ##都长时间主动发送请求更新区域数据文件
- 5M ##如果更新失败,多长时间重试
- 7D ##过期时间
- 3D )
- IN NS ns1.example.com.
- ns1 IN A 172.16.88.1
- www IN A 172.16.88.3
- www IN A 172.16.88.4
- mail IN A 172.16.88.5
- ftp IN CNAME sandy
- :wq
- 注:更改example.com.zone的权限及属主及属组(同上)
- [root@Gdy named]# chown root:named example.com.zone
- [root@Gdy named]# chmod 640 example.com.zone
<2>创建反向(PTR)区域配置文件
- [root@Gdy named]# vim 172.16.88.zone
- 添加如下内容:
- $TTL 86400
- @ IN SOA ns1.example.com. admin.example.com. (
- 2013040201
- 1H
- 5M
- 7D
- 3D )
- IN NS ns1.example.com.
- 1 IN PTR ns1.example.com.
- 3 IN PTR www.example.com.
- 4 IN PTR www.example.com.
- 5 IN PTR mail.example.com.
- :wq
- 注:更改172.16.88.zone的权限及属主及属组(同上)
- [root@Gdy named]# chown root:named 172.16.88.zone
- [root@Gdy named]# chmod 640 172.16.88.zone
第四步:通过named-checkconf及named-checkzone检测配置文件及区域文件是否有语法错误
第五步:启动二进制进程named
[root@Gdy ~]# service named restart {start|restart|reload|status}
第六步:设置named进程在开机时自动在2345级别下运行并查看named在哪个端口上启动并监听[root@Gdy ~]# chkconfig named on
[root@Gdy ~]# netstat -ntupl ##查看DNS启动端口
第七步:设置防火墙及SElinux
- [root@Gdy ~]# iptables -A FORWARD -i eth0 -p tcp --dport 53 -j ACCEPT
- [root@Gdy ~]# iptables -A FORWARD -i eth0 -p udp --doprt 53 -j ACCEPT
- 设置SELinux
- [root@Gdy ~]# getsebool -a | grep named
- named_disable_trans --> off
- named_write_master_zones --> off
- [root@Gdy ~]# getsebool
- [root@Gdy ~]# setsebool -P named_write_master_zones 1
第八步:使用nslookup和dig命令分别在Windows和Linux系统进行查询
<1>使用nslookup命令在Windows系统平台下测试DNS相关资源记录,测试如图(1)
<2>使用dig命令在Linux主机上进行DNS资源查询
注:这里我们将我们的DNS服务指向自己的IP地址(172.16.88.1),也可以不修改我们可以使用@在指定在哪个DNS上查询
第九步:设置递归参数
- (1)在配置文件,设置给不给任何主机递归,但给自己内网主机递归
- 实现过程:
- [root@Gdy ~]# vim /etc/named.conf
- 只要在options选项添加recursion no;即可
- options {
- directory "/var/named" ;
- recursion no;
- };
- [root@Gdy ~]# service named reload ##重新读取配置文件
- 注:笔者虚拟机可以连入网络,因为我们的DNS只给不给任何主机递归,只负责解析自己所属的域
- 所以我们使用dig命令来测试:
- [root@Gdy ~]# dig +recurse -t A www.baidu.com @172.16.88.1
- 测试如图
(2)如果要给某个网段(172.16.0.0/26)提供递归的话,我们用allow-recursion { 172.16.0.0/16; };
注:修改完成后,千万别忘记使用# service named reload命令来执行重新读取配置文件内容
我们还可以使用上面的指令在测试,看是否可以提供解析
[root@Gdy ~]# dig +recurse -t A www.baidu.com @172.16.88.1测试如图:
我用我的Windows主机来测试,看看能不能为192.168.0.0/24提供解析呢(答案:否定),测试如图
第十步:设置区域传送,并创建辅助DNS服务器并实现从主DNS服务同步区域数据文件并查看日志文件(/var/log/message)
- (1)、首先我们要在主DNS服务器的正向区域文件添加辅助DNS的记录
- (2)、先创建一个辅助DNS
- (3)、然后再实现从主DNS服务器完全同步区域数据文件,查看日志文件及从服务器是否完成同步
- (4)、然后再主DNS服务器上新增一条资源记录并查看日志文件,然后到辅助DNS服务上查看日志是否完成增量区域数据同步
- (1)、这步是在主DNS(172.16.88.1)添加一条辅助DNS名称及A记录及设置只允许172.16.88.2同步传输区域数据文件
- [root@Gdy ~]# vim /var/named/example.com.zone
- 添加如下内容:
- options {
- directory "/var/named";
- allow-recurion { 172.16.0.0/16; };
- notify yes; ##当有数据更新时,立即通知辅助DNS服务
- }
- IN NS ns2.example.com.
- ns2 IN A 172.16.88.2
- :wq
- [root@Gdy ~]# vim /etc/named.conf
- 在example.com及88.16.172区域中添加如下内容:
- allow-transfer { 172.16.88.2; }; ##只允许172.16.88.2发送请求同步传送区域数据文件
- 注:辅助DNS服务器(172.16.88.2/16),所以下面的配置在辅助DNS上配置的。
(2)、创建一个辅助DNS服务器(slaves:172.16.88.2): ##只需要建立主配置文件,区域文件不需要创建,通过主服务器进行同步
- [root@Gdy-slaves ~]# yum list all | grep 'bind'
- [root@Gdy-slaves ~]# rpm -e bind-libs bind-utils ##这里采用的是bind97版本,所以把系统默认安装的bind-libs、bind-utils卸载
- [root@Gdy-slaves ~]# yum install bind97 bind97-utils ##bind97(服务器所使用的软件包、bind-libs、bind97-utils(客户端工具)
- [root@Gdy-slaves ~]# mv /etc/named.conf /etc/named.conf.bak
- [root@Gdy-slaves ~]# vim /etc/named.conf
- options {
- directory "/var/named" ;
- allow-recursion { 172.16.0.0/16; };
- };
- zone "." IN {
- type hint;
- file "named.ca";
- };
- zone "localhost" IN {
- type master;
- file "named.localhost";
- allow-transfer { none; };
- };
- zone "0.0.127.in-addr.arpa" IN {
- type master;
- file "named.loopback";
- allow-transfer { none; }; ##172.16.88.2是辅助DNS服务器,不需要给任何主机提供传送功能,故在这里使用allow-transfer { none; };
- };
- zone "example.com" IN {
- type slave;
- file "slaves/example.com.zone";
- masters { 172.16.88.1; };
- allow-transfer { none; };
- };
- zone "88.16.172.in-addr.arpa" IN {
- type slave;
- file "salves/172.16.88.zone";
- masters { 172.16.88.1; };
- allow-transfer { none; };
- };
- :wq ##保存并退出
使用named-checkconf检查配置文件是否有语法错误并将属组改为named,权限为640
然后到主DNS(172.16.88.1)服务器上执行service named reload,并查看日志(tail /var/log/message)是否将区域数据文件传送到辅助DNS服务器
然后到主DNS(172.16.88.1)分别在正向解析文件和反向解析文件中添加一条新的记录如
- [root@Gdy ~]# vim /var/named/example.com.zone
- 添加一条新的记录如下,并将序列号加上1,表示数据已更新:
- hello IN A 172.16.88.10
- :wq
- [root@Gdy ~]# vim /var/named/172.16.88.zone
- 10 IN PTR hello.example.com.
- :wq
- [root@Gdy ~]# service named reload
- [root@Gdy ~]# tail /var/log/message
然后再到辅助DNS(172.16.88.2)执行如下命令
- [root@Gdy-slaves~]# tail /var/log/message ##查看是否同步增量区域数据文件查看是否存在主DNS服务器上添加的新记录
- [root@Gdy-slaves ~]# cat example.com.zone
第十一步:编译安装dnstop
我们在维护DNS服务器时,网络管理员希望知道哪些用户在使用DNS服务器,同时也希望统计DNS的状态,我们可以使用dnstop来完成查询
dnstop源代码可以到http://www.stearns.org/dnstop/下载(可以选择rpm格式,也可以选择tar.gz)
在编译安装前,我们要准备编译环境将开发工具及开发库安装及libpcap-devel的支持
- [root@Gdy ~]# yum groupinstall "Development Libraries" "Development Tools" -y
- [root@Gdy ~]# yum install libpcap-devel -y
- [root@Gdy ~]# tar xf dnstop-20110502.tar.gz -C /usr/local ##解压路径
- [root@Gdy ~]# cd /usr/local/dnstop-20110502
- [root@Gdy dnstop-20110502]#./configure ##这里以默认属性安装
- [root@Gdy dnstop-20110502]#make
- [root@Gdy dnstop-20110502]#make install ##完成安装
编译安装过程附图参考:
编译安装成功了,下面就运行下,看看有哪些计算在使用DNS服务器在查询?