互联网域名解析系统DNS的工作原理及相关服务配置

DNS: Domain Name Service
DNS服务是一种分布式数据库,它提供规范机器名到数字IP地址的映射及数字IP到规范机器名。DNS相关定义:
用于主机和IP地址的一个有层次结构的名字空间;
主机名和地址信息保存在一个分布式数据库中;
一个查询这个数据库的解析器(resolver)
改进了路由电子邮件的机制,以及邮件发送方的身份验证机制
域名服务器用于交换信息的一种机制
用于查询网络上服务的一种机制
DNS工作原理:
DNS域名服务器其实就是个分布式数据库,它主要提供规范的FQDN到IP地址的解析,反之亦然。
构成全世界DNS系统的是一个分布式数据库,每个站点都维护着这个数据库的一个或者多个组成部分。有点类似如图1
我们通过下面的案例来介绍DNS服务器完成解析(参考图)
域名服务器解析原理及过程:[list=1]
[]说明:服务器之间的箭头上的数字均显示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主机信息时,本地域名服务器直接从缓存中调用此记录即可。
[/list]注:DNS查询类型:
[b] 递归查询:客户端得到结果要么成功,要么失败。(本地客户端和DNS服务直接交互)
迭代查询:服务器以相关最佳记录返回本地域名服务器。(DNS服务与DNS服务交互)
所以本地客户端详本地域名服务器查询请求时,查询类型为:一次递归,多次迭代。

DNS服务器的分类:[/b][list=1]
[]主域名服务器(Primary Name Server)
[
] 主域名服务器是特定域所有信息的权威来源,主域名服务器是特定域所有信息的权威来源,它从域管理员构造本地文件中加载域信息,
[]该文件包含服务器具有管理权的部分域结果的最权威信息。主域名服务器需要配置一组完整的文件,即主机配置文件(named.conf),正向区域文件、反向区域文件、高速缓存初始化文件(named.ca),回送文件(named.local)
[
]辅助DNS服务器(Second Name Server)
[] 辅助DNS服务器用来从主域名服务器同步区域数据文件,作为磁盘文件保存在辅助域名服务器相对应的目录,辅助DNS服务器只需要配置主配置文件即可,不需要配置区域数据文件。
[
]唯高速缓存域名服务器(Cache-only Server)
[] 唯高速缓存域名服务器不包含域名数据库文件,它每次将从域名服务器得到的查询结果返回给客户端,并在本地将以缓存,供下次查询使用。
[/list] DNS层次结构中资源记录的基本格式:[list=1]
[
] [name] [ttl] [class] type [rdata]
[][[b]name/b]:
[
] 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)
[/list]BIND常用到的资源记录语法:[list=1]
[]1、SOA资源记录
[
]$TTL 86400
[]区域名称(Name) 记录类型(type) SOA 主域名服务器(FQDN) 管理员邮箱地址(mail) (
[
] serial ##number 序列号,每次更改配置值是都要在原来的基础上加上1,表示以更新。
[] refresh ##刷新时间(间隔)
[
] retry ##重试时间(间隔)
[] expire ##过期时间(间隔)
[
] na ttl ) ##否定答案缓存TTL值
[] 时间单位:M(分钟)、H(小时)、D(天)、W(周),默认单位是秒
[/list][list=1]
[
]
[]好了,对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工作状态
[
]
[/list]第一步:配置YUM源(可以参考笔者的关于YUM和RPM的介绍来进一步了解YUM和RPM日常工作中的使用)[list=1]
[][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(客户端工具)
[/list]第二步:创建DNS的主配置文件(/etc/named.conf)[list=1]
[
][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)
[]};
[/list]注:修改/etc/named.conf的权限为(640)及属主属组(root:named)[list=1]
[
][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 ~]#
[/list]第三步:创建区域配置文件(example.com.zone)[list=1]
[][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
[/list]
<2>创建反向(PTR)区域配置文件

[list=1]
[][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
[/list]第四步:通过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[list=1]
[][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
[/list]第八步:使用nslookup和dig命令分别在Windows和Linux系统进行查询
<1>使用nslookup命令在Windows系统平台下测试DNS相关资源记录,测试如图(1)
<2>使用dig命令在Linux主机上进行DNS资源查询
注:这里我们将我们的DNS服务指向自己的IP地址(172.16.88.1),也可以不修改我们可以使用@在指定在哪个DNS上查询 第九步:设置递归参数[list=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
[
]测试如图
[/list]b[/b]如果要给某个网段(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提供解析呢(答案:否定),测试如图
[list=1]
*、首先我们要在主DNS服务器的正向区域文件添加辅助DNS的记录
*、先创建一个辅助DNS
*、然后再实现从主DNS服务器完全同步区域数据文件,查看日志文件及从服务器是否完成同步
*、然后再主DNS服务器上新增一条资源记录并查看日志文件,然后到辅助DNS服务上查看日志是否完成增量区域数据同步
*、这步是在主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上配置的。
[/list]b[/b]、创建一个辅助DNS服务器(slaves:172.16.88.2): ##只需要建立主配置文件,区域文件不需要创建,通过主服务器进行同步[list=1]
[][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 ##保存并退出
[/list]使用named-checkconf检查配置文件是否有语法错误并将属组改为named,权限为640
然后到主DNS(172.16.88.1)服务器上执行service named reload,并查看日志(tail /var/log/message)是否将区域数据文件传送到辅助DNS服务器
然后到主DNS(172.16.88.1)分别在正向解析文件和反向解析文件中添加一条新的记录如[list=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
[/list]然后再到辅助DNS(172.16.88.2)执行如下命令[list=1]
[
][root@Gdy-slaves~]# tail /var/log/message ##查看是否同步增量区域数据文件查看是否存在主DNS服务器上添加的新记录
[][root@Gdy-slaves ~]# cat example.com.zone
[/list]第十一步:编译安装dnstop
我们在维护DNS服务器时,网络管理员希望知道哪些用户在使用DNS服务器,同时也希望统计DNS的状态,我们可以使用dnstop来完成查询
dnstop源代码可以到http://www.stearns.org/dnstop/下载(可以选择rpm格式,也可以选择tar.gz)
在编译安装前,我们要准备编译环境将开发工具及开发库安装及libpcap-devel的支持
[list=1]
[
][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 ##完成安装
[/list]编译安装过程附图参考:编译安装成功了,下面就运行下,看看有哪些计算在使用DNS服务器在查询?

这个贴应该归类到linux服务器技术里面去。。。。

虽然不知道在说些什么,但感觉很厉害的样子