DNS基本工作原理

及正反向解析和主从同步测试



域名系统DNS是一个分布式数据库,它在本地负责控制整个分布式数据库的部分段,每一段中的数据通过客户服务器模式在整个网络上均可存取,通过采用复制技术和缓存技术使得整个数据库可靠的同时,又拥有良好的性能。


一、基本工作原理


  域名是分层次的。最顶部是根域;这一域上的信息驻留在从整个Internet中所选的一些根服务器上。在根域下面是顶级域,也就是国家代码或机构代码。国家代码的例子有SG(新加坡)和CA(加拿大)等;而机构代码则包括众所周知的COM(商业机构)、EDU(教育机关)、GOV(政府机构)和NET(网络机构)等。在顶级域下面是次级域(whitehouse.gov、microsoft.com、inforamp.net等诸如此类),然后是第3级域,向下以此类推。

跨网络的通信是必须通过ip地址进行的,而我们对ip那一串数字的记忆是效果不明显的,网址那么多,不能每次都拿个小本本记下地址,然后查一下,再写到地址栏链接到那个网址。这时就需要一种服务机制,把我们更适宜形象记忆的字母单词格式的网址转换为ip地址,然后进行通信,这样我们就不需要记忆纯数字的ip了。这就诞生了DNS服务。

我们在网址的某处输入网址名称(比如 www.baidu.com),这时,电脑就先查找本机的host文件,如果没有,则向给我们主机提供域名解析服务的DNS服务器发出查询任务。而A得到任务后,就会先查一定时间内别人查询过的信息里有没有这一条信息的缓存,有的话将结果反馈给我们,如果没有,就查自己负责的域里有没有这么个地址,有则反馈给我们。如果还没有,则找最顶级的根,根一看,是.com的顶级域,就返回结果,让A去找负责.com的服务器。我们的A收到根的回信后就去找.com服务器,.com服务器一看地址,先查缓存,如果别人查过,在缓存里有条目,则直接返回对应的ip地址给A,如果没有则再查解析库里有没有记录,有也同样返回。没有则直接告诉A这地址不存在。这时,A就可能收到两个结果,一个是有ip的返回信息,一个是这个地址不存在的信息。A将查询到的信息反馈给我们后任务结束了,并在自己的缓存里记录下这一次的查询结果,以便能在有相同查询时迅速给出结果,而不需要到DNS服务器上自根向下查询多遍。同时我们的主机上相关的程序也会记录下地址,在一定时间内就不需要再次去向DNS查询了。

其中,A给出结果时,是通过由根始从上一级向下一层级依次查询得来的,这种查询方式叫做迭代查询。我们将任务发给这台DNS服务器(取名为A)后,就只需要等着它返回给我们最终结果了,这种查询方式,称为递归查询,即只要查询一次就能得到结果。

我们通过地址查询ip的方式叫做正向查询,而通过ip查询域名的方式就叫反向查询。因此,DNS有2套独立的查询数,一套是正向查询的,一套是反向查询的,各自有自己的解析库,互不干扰。因此,正向解析的服务器和反向解析的服务器可以是同一台主机,也可以是不同的主机,只要同一套系统内的上下层级之间,同一个域名的主从服务器之间是不同的主机即可。

域名解析协议最成功的实现就是BIND了。


二、 虚拟机正反向域名解析及同步测试


(一)需要安装的程序包:

①bind  : 提供服务

②bind-libs  :提供库文件

③bind-utils  :测试服务是否ok

     # yum install bind 可以同时安装上面三个有依赖关系的程序包

bind:

服务脚本:/etc/rc.d/init.d/named  (所以 start、stop 、restart、status参数也接受) 

主配置文件:① /etc/named.conf, ② /etc/named.rfc1912.zones(rfc 请求注解文档), ③ /etc/rndc.key

解析库文件:/var/named/ZONE_NAME.ZONE (默认是空的,需要我们自己手动创建)

注意:

(1) 一台物理服务器可同时为多个区域提供解析(即可以有多个zone);

(2) 必须要有根区域文件;默认由centos bind-rpm包提供,安装后/var/named/named.ca(包含全球13个根服务器的详细信息)

(3) 应该有两个(如果包括ipv6的,应该更多)实现localhost和本地回环地址的解析库;


rndc: remote name domain controller,默认与bind安装在同一主机,且只能通过127.0.0.1来连接named进程;提供辅助性的管理功能;默认监听在  953/tcp  (tcp的953端口),可以给监视DNS运行提供命令操作。

wKioL1U6T8KAQtdvAAEHpeBRKzE626.jpg


(二)主配置文件修改:

# vim /etc/named.conf

全局配置:options {}

日志子系统配置:logging {}

区域定义:本机能够为哪些zone进行解析,就要定义哪些zone;

  zone "ZONE_NAME" IN {}

wKiom1U6TqyDmxOYAAgLx0CPdjc304.jpg

wKioL1U6UBLBgSQRAAIKsVyhhxk357.jpg

注意:任何服务程序如果期望其能够通过网络被其它主机访问,至少应该监听在一个能与外部主机通信的IP地址上;缓存名称服务器的配置:监听外部地址即可;

(三)主DNS名称服务器配置:

 (1) 在主配置文件中定义区域

# vim /etc/named.rfc1912.zones

   zone "ZONE_NAME" IN {

type {master|slave|hint|forward};

file "ZONE_NAME.zone";

   };

master:表示是区域的主DNS服务器

slave  :表示是区域的从DNS服务器

hint : 根(根提示)服务器

forward: 做转发用的

ZONE_NAME.zone : 自己需要建立的一个文件,定义各种rr,并以 .zone 结尾

wKioL1U6UInQ_N-CAAVvZVjxKo0093.jpg

(2) 定义区域解析库文件

      (2.1)  # vim /var/ZONE_NAME.zone

这个需要自己从头开始建立,第一条是SOA,后面是ns和A,AAAA,MX的记录出现的内容:

① 宏定义:以 $ 开头;

$ORIGIN :省略域名的自动补上ORIGIN后面的内容

$TTL 86400: 表示默认的全局肯定查询结果的ttl是86400

② 资源记录;

wKioL1U6UNOCJ88CAAPWXH04fbc794.jpg

(2.2)测试解析库文件有没有语法错误

# named-checkzone "区域名”  /区域解析库文件绝对地址/

# named-checkzone "chlhost.com" /var/named/chlhost.com.zone

wKioL1U6UR_AAlJoAARBjTZHGyQ513.jpg

wKiom1U6T8KgWQ1RAAIXjSRTNvE926.jpg

                          

(2.3)修改区域解析库文件属性

        我们建立的服务器配置文件不应该允许别人随便访问修改

wKioL1U6UVixPgYlAAYpNqRVWek765.jpg

(四)启动DNS服务

# service named start

wKiom1U6UDXxdtj4AAMHznkt_Kw417.jpg

(五)测试: 

(1)dig命令

dig    [-t type]     name    [@SERVER]     [query options]

-t type:制定需要返回的结果是什么类型,可以是A,AAAA,any,MX等,不指定则默认是A

name:自己需要测试的区域名,如“chlhostcom”

@SERVER:指定找SERVER服务器解析,如果没有,则会自动根据/etc/resolv.conf 文件中配置的”nameserver“进行解析;

 [query options]:查询选项:

+[no]trace:跟踪解析过程

+[no]recurse:进行递归解析

注:①dig用于测试dns系统,因此,不会查询hosts文件进行解析;

    ② 因为是自建DNS,如果没有@server,则是默认找外网的服务器解析,结果是否定的

    ③ 如果一个域名有多台主机提供服务的,则返回结果是轮询返回的

wKioL1U6Uc6DdKZCAAVkSI4bStc936.jpg

wKioL1U6UdTAA7jNAATsny6L6_Q266.jpg

测试反向解析:

由IP地址解析出对应的域名

dig -x  IP @SERVER

事例:查看下面反向解析的测试图片

     与正向解析相比,不需要加 “-t type”了,直接跟要查找的IP即可

模拟区域传送:

dig -t axfr ZONE_NAME @SERVER

-axfr:表示做全量传送(all transfer),即将所有跟查询有关的信息记录都一次全部传送过来。通过这个可以知道某公司所有网络拓扑结构,所以一般需要关闭你所做的DNS服务器的这项功能


例如:# dig -t axfr chlhost.com @172.16.20.97

      # dig -t axfr 20.16.172.in-addr.arpa  @172.16.20.97

wKioL1U6Uh6CYjL0AAZqEEStH5w763.jpg

wKiom1U6UMeAuJSLAAWPw519klA404.jpg

(2)host命令:

格式:host [-t type] name [SERVER]

与dig相比,返回结果更简洁。

如上面的dig查询可以用下面的命令:

# host -t NS chlhost.com 172.16.20.97

# host -t A ww.chlhost.com 172.16.20.97


(3)nslookup命令:

 nslookup [-option] [name | -] [server]

这个命令还可以提供交互式模式查询方式:

nslookup>

server IP: 指明使用哪个DNS server进行查询;

set q=RR_TYPE: 指明查询的资源记录类型;

NAME: 要查询的名称;

wKioL1U6UkLithaHAALCuBib6FE269.jpg

(六)修改后的重启命令:

DNS服务器在运行服务期间,我们做了调试、测试或者项目添加修改时,要让配置能马上生效而不用系统重启(系统停止会让数据丢失),这时我们不应该用# service named restart这种方法,而应该使用下面方法只让系统重读文件但不用重启:

方法一: 

        # service named reload

方法二:

# rndc reload


(七)反向区域 配置:


与上面的正向解析配置基本一样,只不过区域名称中网络地址须反写,并加“.in-addr.arpa."

区域名称:网络地址反写.in-addr.arpa.

例如:172.16.100. --> 100.16.172.in-addr.arpa.


(1) 定义区域

# vim /etc/named.rfc1912.zones

zone "ZONE_NAME" IN {

type {master|slave|forward};

file "网络地址.zone"

};

wKiom1U6UT6SydL8AAFPZtb6Dg4081.jpg


(2) 区域解析库文件

  # vim /var/ZONE_NAME.zone

这个也是需要自己从头开始建立,第一条是SOA,后面是NS和PTR的记录,不需要其他类型的记录

NS指明有多少台服务器提供反向解析服务

PTR指明IP地址解析后的网址是什么,对应每个正向解析的网址记录都应该有一个反向解析记录

注意:不需要MX和A,以及AAAA记录;以PTR记录为主;

wKiom1U6UYCxuyFRAAJykv87nqo340.jpg

wKioL1U6UueCRXuuAAUtAuu_yL4766.jpg


(八)泛域名解析

       顾客是上帝,顾客出错了我们也得给他/她提供最好的服务,所以,顾客输错了head我们也需要能一步到位提供正确的解析,这时就需要用到泛域名解析功能。

      如顾客输入了  “chlhost.com”,我们需要给他正确ip地址,顾客输入了“wwe.chlhost.com”我们也可以给他提供正确的ip地址,这就是用了泛域名解析。

      注:bind可能不支持别名泛域名,需要设置为A记录。

      操作过程:修改区域解析库,添加泛域名A记录即可

           # vim /var/named/chlhost.com.zone

wKiom1U6Uc7Q4aM5AANxJ8dQHLc580.jpg

wKioL1U6UzaCRoxBAAMC6E-yorU599.jpg




(八)从服务器的设置

(8.1)找一台主机,测试能不能联通刚才设置好bind的主机,能则安装好bind,并启动服务

wKioL1U6U6bgUvrTAAcn9iOeEUc423.jpg

wKiom1U6Uk7wrfa3AAK8LWOrXZY504.jpg

wKioL1U6U7PSXJS-AALblbAcwEk794.jpg

(8.2)我们可以把这台机器配置成正向解析从服务器和/或反向解析从服务器

配置过程比主服务器配置简单,只需要定义好服务域名就可以了,合法性是由主服务器的解析库(/var/named/chlhost.com.zone)定义的

(8.3.1)修改从服务器的主配置文件/etc/named.conf,并重启named服务,用# ss -tunl  查看监听是否正常

wKiom1U6Up3gxcpOAAKnBCfJecE857.jpg

wKioL1U6VAPgGTpAAAPPtCjl_r8198.jpg


这时就成为一个缓存名称服务器了

(8.3.2)修改主配置文件 /etc/named.rfc1912.zones,使本机成为正向的名称解析从服务器

添加一个域

注:因为设置好后,系统会自动从主服务器出同步数据,自动创建正向解析库文件而不需要我们root手动创建(如主服务器上的 /var/named/chlhost.com.zone一样),这时就需要赋予进程named的一个能写的目录进行创建解析库文件,/var/named下的slaves目录就是为这个准备的!

wKiom1U6VFnx1IcDAAGVvVNlITk914.jpg

wKioL1U6VbuRb64kAAawS5qOmZ8320.jpg

wKiom1U6VFzzLRzUAAPEobk8cGM459.jpg


正向解析从服务器到此就设置成功

(8.3.3)修改主配置文件 /etc/named.rfc1912.zones,使本机成为反向的名称解析从服务器

wKioL1U6Veuzz0YZAArDFqSZsY8244.jpg

通知机制:

因为主服务器上有两条记录是(   IN NS ns2 ; ns2   IN  A  172.16.20.96 ),这就给了主服务器定义服务器是哪台主机,当主服务器上的内容发生改变(修改完内容后,我们必须将其序列号手动加1)时,主服务器就会通知从服务器更新解析库。少了前面那条,主服务器不知道有从服务器;少了后面那条,主服务器找不到从服务器的。同理,因为从服务器可以是链式传送,所以,这台更新了的从服务器又会向其能联系到的其他从服务器发出数据更新的通知。

当带宽足够时,由于有通知机制,主从服务器的数据基本上都是实时同步的


wKiom1U6VLPCwPt1AApFoqXUFg8902.jpg

主从复制:

1、应该为一台独立的名称服务器;

2、主服务器的区域解析库文件中必须有一条NS记录是指向从服务器;

3、从服务器只需要定义区域,而无须提供解析库文件;解析库文件应该放置于/var/named/slaves/目录中;

4、主服务器得允许从服务器作区域传送;

5、主从服务器时间应该同步,可通过ntp(网络时间协议)进行;

6、bind程序的版本应该保持一致;否则,应该从高,主低;