一、走进DNS

1.了解DNS
DNS是Domain Name Sercice的缩写,全称为“域名服务器”;是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP;
2、了解FQDN

我们常说的主机名也称为FQDN,而FQDN是Full Qualified Domain Name缩写,全称为“完成限定域名”,也可称“完成合格域名”;
3、DNS转换实现

DNS主要是实现FQDN<-->IP转换,这是一种双向的转换,在实现转换的背后是有复杂的查询过程,DNS查询过程简单来说主要依靠内部的数据库;

早期记录主机名与地址的转换是依靠于/etc/hosts中的hosts文件:
hosts存储格式:
IPADDR FQDN Ailases
例:172.16.0.1
www.magedu.com www

4、分析nsswitch

nsswitch是为多种需要名称解析的机制,提供名称解析的平台框架,注意nsswitch只是提供平台,而不进行名称解析;其配置文件/etc/nesswitch.conf
nsswitch平台能够将dns解析成ip地址的两个机制:
libnss_file.so
libnss_dns.so
而这两个属于库文件,是要被我们的进程调用的

5、了解stub resolver

stub resolver称为名称解析器,假如要ping www.magedu.com 这时候ping命令会借助本地stub resolver让其从/etc/hosts文件中查找magedu.com对应的ip地址,如果这个文件中没有就会依靠dns解析;

6、名称分配机构

目前名称分配机构是IANA,维护IP和FQDN之间对应关系,后来由于互联网的猛速发展计算机急剧增长,同时受到美国的一些控制,IANA机构就交给了一个民间组织ICANN,目前我们的IP地址管理、划分都是由这个组织控制。
7、DNS域名空间的分层结构
在域名系统中,每台计算机的域名由一系列用点分开的字母、数字段组成。域是其层次结构的基本单位,任何一个域最多属于一个上级域,但可以有多个或没有下级域。在同一个域下不能有相同的域名或主机名,但在不同的域中则可以有相同的域名或主机名;而且上级仅知道其直接下级位置,下级只知道根的位置。
7.1、根域
根域只有一个,它没有上级域,以圆点来表示;全世界的IP地址和DNS域名空间都是由位于美国的因特网信息管理中心(INIC)负责管理或进行授权管理的目前全世界有13台根域服务器,这些根域服务器也位于美国,并由INIC管理;
7.2、顶级域
组织域:.com, .org, .net, .cc
国家域:.cn(授予中国的管理机构).tw(授予台湾的管理机构).hk(授予香港的管理机构).iq(授予伊拉克的管理机构).ir(授予伊朗的管理机构).jp(授予日本的管理机构)
反向域:IP--->FQDN(两者之间的转换不在同一个数据库中实现)
   正向:IP-->FQDN(这使用的是一个独立的数据库,经常使用的是这种转换机制)
   反向:FQDN-->IP(这使用的另外一个独立的数据库)

8、查询方式:
归:客户端只发出一次请求
我现在举个简单的例子:假设A想要知道上海在哪里,A就找到了B,而B自己没有去过上海也不知道上海在哪里,但B告诉A可能C知道上海在哪里,于是B就找到C并得到结果,然后B又把结果告诉了A;在整个过程中A只发出了一次请求,中间的过程主要是通过B来实现的。
迭代:客户端发出多次请求
我再给大家举个例子:还假设A想知道上海在哪里,A就找到了B,而B告诉A可能C知道,然后B让A自己去找C,C把结果返回了A,在整个过程中一直是A在向B、C发出请求;
 
9、解析方式:
正向:IP-->FQDN(解析IP地址与主机名的一种机制)
反向;FQDN-->IP(解析主机名与IP地址的一种机制)
在查询过程中是分为两段式:客户端发出的请求属于递归方式,通过名称服务器发出的请求属于迭代方式;

10、DNS服务器两类常见的查询请求方式:
10.1、接受本地客户查询请求
这种查询请求方式属于递归;假设本地主机A想要查询本地主机B的地址,这中间要通过本地DNS服务器查询,本地DNS服务器查找到本地主机B的地址并把本地主机B返回的地址告诉了主机A,这个实现过程就属于本地查询请求;
10.2、外部客户端请求
第一种查询请求方式返回的结果是权威答案,权威答案就是外部客户端发出的请求正是本区域内的地址,本地DNS服务器给外部客户端返回本地区域的地址信息;
权威答案又分为两类:
     肯定答案:如果外部客户端发出的请求查询本地区域内的某个主机名,并且该主机名也存在,本地区域的DNS服务器会给外部客户端返回一个肯定答案,同时并含有这个肯定答案的TTL;
     否定答案:如果外部客户端发出的请求查询本地区域内的某个主机名,而该主机名不存在,本地区域的DNS服务器会给外部客户端返回一个否定答案,同时并含有这个定答案的TTL;
第二种查询请求方式返回到结果是非权威答案,非权威答案就是外部客户端通过本地区域查询另一个区域内的地址,由于查询请求不是本地区域内的地址,本地区域只是给外部客户端一个参考答案(非权威答案); 
11、DNS服务器类型:
11.1 主DNS服务器

一般数据增添、删除在主DNS服务器完成;
11.2 辅助DNS服务器(有时也被称为从DNS服务器)

辅助DNS服务器每隔一段时间向主DNS服务器请求数据同步,如果主DNS服务器修改过内容,那么从DNS服务器就会把更改过的内容同步过来,否则等待下一次请求;
一般来讲,主、辅助DNS服务器完成数据间的同步,要定义下面五种属性信息
    serial number(版本号、序列号,序列号最长长度为10位):每一次主DNS服务器修改数据,会在自己的序列号后面自动加1,从而让辅助DNS服务器知道主DNS服务器有内容更新;
    refresh:定义辅助DNS服务器隔多长时间检查主DNS服务器的序列号
    retry:定义辅助DNS服务器向主DNS服务器请求数据同步,而主DNS服务器没有给辅助DNS服务器响应,辅助DNS服务器重新尝试再次请求的时间
    expire:定义辅助DNS服务器多次请求主DNS服务器都没有应答,辅助DNS服务器认为主DNS服务器的过期时间
    nagative answer TTL:定义否定答案的缓存时长
11.3 缓存DNS服务器

一种特殊的DNS服务器,不提供任何权威答案,只负责缓存数据
11.4 转发器

当客户端不能到达某个DNS服务器或不能访问互联网时,可以通过一个服务器帮忙转发出去请求,而这个服务器就是一个转发器,转发器不缓存数据,只转发请求;
12、资源记录

DNS数据库中的每一个条目称作一个资源记录(Resource Record,RR)
资源记录的定义格式:
NAME         TTL                    IN                  RRT               VALUE
[名称]   [生存时间,可省略] [Internet类型] [资源记录类型]  [名称对应的值]
13、资源记录类型:
13.1 SOA(Start Of Authority)

起始授权机构记录,是最重要、最常用的一种资源记录;总是处于任何标准区域的第一位。它表示最初创建它的DNS服务器或现在是该区域的主服务器的DNS服务器,它还用于存储影响区域更新或过程的其他属性,如版本信息和计时。这些属性会影响在该区域的域名服务器之间进行同步数据的频繁程度。
格式:
[区域名]  [生存时间] [Internet类型] [起始授权机构记录] [主机名]  [管理员邮箱地址]
ZONE NAME    TTL           IN             SOA            FQDN   ADMINISTRATOR_MAILBOX (
                                serial number ;  ###序列号
                                refresh ;   ###刷新时间
                                retry ;   ###重试时间
                                expire ;   ###过期时间
                                na ttl) ;   ###否定答案缓存时长
#####属性的后面可以跟注释信息,要以分号隔开        
时间单位:M(分钟)、H(小时)、D(天)、W(周),默认单位是秒
注意:在邮箱格式中不能出现@符号,@在资源记录中有特殊意义,表示当前区域名称(ZONE NAME)
邮箱格式:
admin@magedu.com. 要写为admin.magedu.com.                           
例: magedu.com.  600    IN     SOA      ns1.magedu.com.   admin.magedu.com. (
                                20130401  ##序列号最长长度为10,也可定义为1
                                   1H
                                   5M
                                   1W
                                   1D )
13.2 DS(Name Server)

名称服务器(定义区域名到主机名,只负责指定区域的名称服务器)
例:magedu.com.    600   IN    NS    ns.magedu.com.   
     ns.magedu.com. 600   IN    A     1.1.1.2
当外部区域想要访问自己区域内的主机时,还要指定自己区域DNS服务器的A记录,一定要成组出现;
13.3 MX(Mail eXchanger)

邮件交换器 (此记录列出了负责接收到域中的电子邮件的主机)
邮件服务器有优先级的定义,优先级在0-99,数字越小级别越高
格式:
[区域名] [生存时间] [Internet类型] [邮件交换器] [优先级] [区域名对应的值] 
ZONE NAME   TTL         IN             MX             pri           VALUE
13.4 A(address)

IPv4的地址(定义主机名到ip地址)
13.5 PTR(pointer):

指针记录(定义在反向区域文件中,这种经常使用)
13.6 CNAME(Canonical NAME)

正式名称,也称为别名记录
例:
     www2.magedu.com.    IN   CNAME     
www.magedu.com.
14、域与区域的区别
域(Domain):站在DNS角度来讲,域属于逻辑概念,实际是不存在的
区域(Zone):属于物理概念,一般来讲创建一个域需要建立两个区域文件,即正向区域文件和反向区域文件
例:如何创建正向区域文件和反向区域文件
下面对mageedu.com.做规划:
mageedu.com.      192.168.0.0/24     ##mageedu.com.区域网段为192.168.0.0/24
www      192.168.0.1        ##创建一个www服务器
创建正向区域文件
magedu.com.   IN   SOA  admin.magedu.com. 2013040201 1H 5M 1W 2D  ##五个属性可以写在一行中,之间要用空格隔开
www.magedu.com.  IN   A   192.168.0.1
上一条记录可简写为:
www    IN   A    192.168.0.1
创建反向区域文件
0.168.192.in-addr.arpa.  IN  SOA   admin.magedu.com. 2013040201 1H 5M 1W 2D
1.0.168.192.in-addr.arpa.  IN   PTR   
www.magedu.com.
上一条记录还可以写成:
1      IN   PTR   
www.magedu.com.
##在反向区域文件中的FQDN不能简写
说明:MX、A记录只定义在正向区域文件中
          NS记录定义正向、反向区域文件中
          PTR记录只定义在反向区域文件中
15、区域传送  
假设从DNS服务器刚从主DNS服务器同步数据5分钟,而主DNS服务器的数据又发生变化,虽然同步时间还没有到,为了随时主、从DSN服务器能够保持数据一致,
主DNS服务器会主动向从DNS服务器上发出通知让从DNS服务器再同步一次数据,这个过程叫做区域传送。 
 
16、区域传送的类型
完全区域传送:axfr(传送主DNS服务器上所有内容到从DNS服务器)
增量区域传送:ixfr(只传送主DNS服务器中的一部分条目到从NDS服务器)
17、区域类型:(针对于传送数据而言要指定区域的类型)

主区域:使用master标识
从区域:使用slave标识
提示区域:使用hint标识(其实是定义根在什么地方)
转发区域:使用forward标识

二、DNS名称服务器软件包BIND

1、了解BIND

互联网上使用最多的服务器软件BIND(全称:Berkeley Internet Name Domain),这个软件不再是Berkeley进行维护,而是另一个组织ISC(互联网协会)维护;
附ISC官方网站:
http://www.isc.org;
其实除了ISC维护外,在linux中维护常用的DHCP服务器;

2、bind97及caching-nameserver

DNS服务器端软件包有很多版本,bind97版本就是服务器端软件包众多版本之一;除了bind97服务器端软件包之外,偶尔还会使用到caching-nameserver软件包;
caching-nameserver软件包作用:能够让DNS服务器立马成为一个缓存服务器,为我们提供了很多的配置文件,这个配置文件结合安装后的bind,能够让bind立刻成为一个缓存DNS服务器。

3、bind配置文件大汇总

bind97主配置文件:/etc/named.conf,主要定义bind进程的工作属性和区域的定义等;需要注意:在/etc/named.conf配置文件中,花括号前后都需要有空格,在花括号中的每一个完整语句都要使用分号结尾;
与dns相关的配置文件:/etc/rndc.key(此配置文件是实现让rndc命令能够远程工作的密钥文件)
rndc(Remote Name Domain Controller):全称为远程名称服务控制器,是能够让我们远程控制DNS服务器这个进程启动关闭甚至装载数据文件和主配置文件的一个常用的命令;
在红帽5上bind自身使用的配置文件是/etc/rndc.conf,其配置文件与/etc/rndc.key有所不同;/etc/rndc.key配置文件只是一些密钥,而/etc/rndc.conf配置文件包含密钥外,还有配置信息;一般来说这两个配置文件只需一个就可以工作。
dns服务器为某个区域进行解析,那么进行解析的来源是来自于区域数据文件,默认下区域数据文件放在/var/named/下,区域数据文件的名称可以自己定义; 
除此之外,bind97安装完成之后,还会有一个服务控制脚本/etc/rc.d/init.d/named,同时这个脚本也支持{start|stop|resart|status|reload},在安装完97后,就可以执行这个脚本了。      
bind本身运行的二进制程序叫做named,而软件包叫做bind;这一点千万要记住呦。

4、配置服务器的顺序

解析一个域首先配置成缓存dns服务器,而后再配置我们所需要负责的域就是主dns服务器,如果我们配置服务器时明确指明slave类型,它就是个从dns服务器,当然从dns服务器必须是某个主dns服务器的从dns服务器;

5、bind97下最核心的几个文件
/etc/named下的几个文件
/etc/named.conf:bind的主配置文件,在红帽5上相当于已经安装了caching-nameserver,而在红帽6上并非如此;
/etc/rc.d/init.d/named:服务脚本;
/etc/rndc.conf:rndc的配置文件;
/etc/rndc.key:实现让rndc命令能够远程工作的密钥文件;
/etc/sysconfig/named:服务脚本的配置文件;
/usr/sbin/下的几个文件
/usr/sbin/named:bind的二进制程序文件;
/usr/sbin/named-checkconf:检查配置文件中是否有语法错误;很常用的命令
/usr/sbin/named-checkzone:检查区域文件中是否有语法错误;很常用的命令
/usr/sbin/rndc:远程控制工具
/usr/sbin/rndc-confgen:专门用于生成/etc/rndc.conf文件
/var/named下所放的是区域数据文件
/var/named/named.ca:存放13个根节点服务器的位置

如果安装bind97之后没有这个文件,我们可以使用dig命令手动生成根服务器文件,前提是在能够访问互联网的主机上;

比如:dig -t NS . ;
如果不借助于本地服务器查找,还可以借助于指定13个根服务器之一去查找根到底有多少台服务器,

比如:dig -t NS . @a.root-servers.net
/var/named/named.localhost:为了避免dns服务器配置错误,将本地主机(localhost)解析成一个正常地址(127.0.0.0);
/var/naned/named.loopback:用于实现本地主机名的正反向解析;

6、DNS监听的协议及端口
    53/udp:默认情况下,客户端发出的查询请求常使用udp,传送速度快,不需要三次握手;
    53/tcp:从dns服务器向主dns服务器传送数据时,为了数据的安全性,常使用tcp协议的53端口;
    953/tcp,rndc:由tcp、rndc协议发起的监听端口;

7、套接字

/usr/sbin/named文件一定要依赖于套接字,而套接字是为了让两个不同的进程互相通信,一般来讲服务器端必须监听在某个套接字上作为客户端的访问入口;
套接字表示方法:IP:PORT(只要接受客户端请求,都要监听在套接字上面)

8、区域声明
格式:
zone "ZONE NAME" IN {
   区域类型(type) {master|slave|hint|forward};
   区域类型只需要在其中任选一个
};
定义主区域:
   file "区域数据文件";
定义从区域:
   file "区域数据文件";
   masters { 主DNS服务器IP地址; };
启动过后的信息都会记录到/var/log/messages下,我建议以后经常用/var/log/messages查看在主、辅助服务器配置信息; 

9、开、关SELinux文件

由于SELinux控制的机制比较复杂,这里为了防止对DNS有影响,一般我们建议要关闭SELinux;
手动临时性地关闭SELinux:
#getenforce  --查看当前状态
Enforcing   ---表示开启状态
#setenforce 0  --手动关闭SELinux,如果想要启动SELinux可把0改为1即可
Permissive   --表示临时关闭状态
永久性关闭SELinux:
在/etc/selinux文件中,把SELinux=permissive或disabled,然后使用service named start启动
注意:在配置文件中配置永久关闭不会立即生效

10、dig、host命令

dig(Domain Information Gropher)到域名服务器中查找相关信息的强大命令;

经常使用的命令选项:

       host -t RT NAME:查询名称的解析结果
       dig -t RT NAME @IP(正向查找)
       dig -x IP:(根据IP查找FQDN)
       +[no]recurse:是否添加递归功能
       +[no]trace:追踪dns的解析过程
       axfr:实现显示对方的完全区域传送,得到对方区域的所有内容
       ixfr:增量区域传送
####
应注意:区域传送只允许自己的从DNS服务器传送

希望这些知识点能够帮助到大家,后面还会有DNS服务器相关的配置实例与大家分享!敬请期待。