DNS总结

DNS 名称解析的查询模式DNS 名称解析的查询模式1、递归查询:当收到客户端的递归查询请求后,当前DNS 服务器只会向DNS 客户端返回两种信息:要么是在该DNS 服务器上查询到的结果,要么是查询失

DNS 名称解析的查询模式

DNS 名称解析的查询模式

1、递归查询:当收到客户端的递归查询请求后,当前DNS 服务器只会向DNS 客户端返回两种信息:要么是在该DNS 服务器上查询到的结果,要么是查询失败,如果当前DNS 服务器中无法解析名称,它并不会主动告知DNS 客户端其它可能的DNS 服务器,而是自行向其它DNS 服务器查询并完成解析。如果其它DNS 服务器解析失败,则DNS 服务器将向DNS 客户端返回查询失败的消息。递归即是有来有往。

2、迭代查询:迭代查询通常在一台DNS 服务器向另一台DNS 服务器发出解析请求时使用。如果当前DNS 收到其它DNS 服务器发来的迭代查询请求并且未能在本地查询到所需要的数据,则当前DNS 服务器将告诉发起查询的DNS 服务器另一台DNS 服务器的IP 地址。然后,再由发起查询的DNS 服务器自行向另一台DNS 服务器发起查询;依次类推,直到查询到所需数据为止。如果到最后一台DNS 服务器仍没有查到所需数据,则通知最初发起查询的DNS 服务器解析失败。迭代的意思就是若在某地查不到,该地就会告知查询者其它地方的地址。让查询转到其它地方去查。

说白就是这样:

1. 递归查询:

一般客户机和服务器之间属递归查询,即当客户机向DNS 服务器发出请求后, 若DNS 服务器本身不能解析, 则会向另外的DNS 服务器发出查询请求,得到结果后转交给客户机;

2. 迭代查询(反复查询):

一般DNS 服务器之间属迭代查询,如:若DNS2不能响应DNS1的请求,则它会将DNS3的IP 给DNS2,以便其再向DNS3发出请求;

举例:比如学生问老师一个问题,王老师告诉他答案这之间的叫递归查询。这期间也许王老师也不会,这时王老师问张老师,这之间的查询叫迭代查询!

Forwarder

为了提高我们这个DNS 服务器的查询效率,我们会采取这样的措施:把非本地域的解析请求转发到我们的ISP 提供的DNS 。

这个功能是由forwarder 选项来完成的。所谓的 forwarder ,就是当某一台 NS 主机遇到非本机负责的 zone ( slave zone 也属于本机负责的范围) 查询请求的时候,将不直接向 root zone 查询而把请求转交给指定的 forwarder (一台或多台) 主机代为查询。如果你不了解 DNS 的查询模式,那么很难理解这个 forwarder 的意义和好处。

我们知道,当DNS 服务器接到客户端主机的查询请求时,首先会检查这个查询是否属于本机管辖,否则将转向 root zone 再逐级的查询下去,最后再把查询结果告诉客户端。在这个过程之中,DNS 服务器还会将查询到的结果存放到缓

,

存中。只要缓存中的 TTL 没过期,在下次遇到同样查询的时候,就可以直接将结果响应给客户端,而无需再重复上次的查询流程。

如果DNS 服务器上指定了forwarder ,那这个 DNS 发现缓存中没有记录时,将不向 root 查询,而是向 forwarder 送出同样的请求(转发),然后等待查询结果,即把逐级往下查询这个耗费精力的动作,交给 forwarder 负责。但无论这个结果是自己直接查询得来的,还是 forwarder 送回来的,DNS 服务器都会保存一份数据在缓存中。这样,以后的相同查询就快多了,这对于DNS 所服务的客户端而言查询效率会提高很多。

forwarder 机制的好处并非仅是上面所提到的效率提升,对于整个网络流量(尤其是对外的流量) 也是有帮助的。比方说,你的内部网络需要 10 台 DNS 来提供服务,你只需在某一台能直接与外界沟通的计算机上架设 DNS 服务,然后将其它内部DNS 的 forwarder 指向该服务器就行了。这样可能本来需要 10 次的 root 查询,在 forwarders 的机制下,就只需 1 次而已。连同下层的往返查询来计算的话,总体上所省下的对外查询就更多了,再加上缓存带来的好处,forwarder 所降低的 DNS 流量是非常显著的。

事实上,在本章开始我们就提到如何集中管理内部局域网用户域名解析问题,解决的方法就是:在本地DNS 的 forwarder 设定为 ISP 的 DNS ,局域网用户把DNS 都设置成本地DNS 地址,在进行外部域名解析时,我们的DNS 把解析请求转发给ISP 的DNS ;又因为 ISP 上的 DNS 也有缓存的关系,所以这样设置查询还可以提高速度。

罗嗦了半天,现在看看如何配置。具体的设置很简单:在named.conf 的options 部分添加这样一行:

forwarders { 211.136.17.107; 202.102.152.3; };

如此设置完毕,那么所有非本区域的查询都会直接转发到forwarders 指定的DNS 服务器上去。

§§ 测试DNS

在Linux 上我们可以用ping 、nslookup 、dig 、host 等命令来测试DNS 是否工作正常,这些小工具都很简单,以host 为例:

[root@rh73 ']# host ns.silly.com

,

6.options 语句

options 语句的定义和使用:

options 语句用来设置可以被整个BIND 使用的全局选项。这个语句在每个配置文件中只有一处。如果出现多个options 语句,则第一个options 的配置有效,并且会产生一个警告信息。

如果没有options 语句,则每个选项使用缺省值。

options {

[ version version_string; ]

[ directory path_name; ]

[ named-xfer path_name; ]

[ tkey-domain domainname; ]

[ tkey-dhkey key_name key_tag; ]

[ dump-file path_name; ]

[ memstatistics-file path_name; ]

[ pid-file path_name; ]

[ statistics-file path_name; ]

[ zone-statistics yes_or_no; ]

[ auth-nxdomain yes_or_no; ]

[ deallocate-on-exit yes_or_no; ]

[ dialup dialup_option; ]

[ fake-iquery yes_or_no; ]

[ fetch-glue yes_or_no; ]

,

[ has-old-clients yes_or_no; ]

[ host-statistics yes_or_no; ]

[ minimal-responses yes_or_no; ]

[ multiple-cnames yes_or_no; ]

[ notify yes_or_no | explicit; ]

[ recursion yes_or_no; ]

[ rfc2308-type1 yes_or_no; ]

[ use-id-pool yes_or_no; ]

[ maintain-ixfr-base yes_or_no; ]

[ forward ( only | first ); ]

[ forwarders { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]

[ check-names ( master | slave | response )( warn | fail | ignore ); ]

[ allow-notify { address_match_list }; ]

[ allow-query { address_match_list }; ]

[ allow-transfer { address_match_list }; ]

[ allow-recursion { address_match_list }; ]

[ allow-v6-synthesis { address_match_list }; ]

[ blackhole { address_match_list }; ]

[ listen-on [ port ip_port ] { address_match_list }; ]

[ listen-on-v6 [ port ip_port ] { address_match_list }; ]

[ query-source [ address ( ip_addr | * ) ] [ port ( ip_port | * ) ]; ]

[ max-transfer-time-in number; ]

,

[ max-transfer-time-out number; ]

[ max-transfer-idle-in number; ]

[ max-transfer-idle-out number; ]

[ tcp-clients number; ]

[ recursive-clients number; ]

[ serial-query-rate number; ]

[ serial-queries number; ]

[ transfer-format ( one-answer | many-answers ); ]

[ transfers-in number; ]

[ transfers-out number; ]

[ transfers-per-ns number; ]

[ transfer-source (ip4_addr | *) [port ip_port] ; ]

[ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]

[ notify-source (ip4_addr | *) [port ip_port] ; ]

[ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]

[ alsonotify { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]

[ max-ixfr-log-size number; ]

[ coresize size_spec ; ]

[ datasize size_spec ; ]

[ files size_spec ; ]

[ stacksize size_spec ; ]

[ cleaning-interval number; ]

,

[ heartbeat-interval number; ]

[ interface-interval number; ]

[ statistics-interval number; ]

[ topology { address_match_list }];

[ sortlist { address_match_list }];

[ rrset-order { order_spec ; [ order_spec ; ... ] } };

[ lame-ttl number; ]

[ max-ncache-ttl number; ]

[ max-cache-ttl number; ]

[ sig-validity-interval number ; ]

[ min-roots number; ]

[ use-ixfr yes_or_no ; ]

[ provide-ixfr yes_or_no; ]

[ request-ixfr yes_or_no; ]

[ treat-cr-as-space yes_or_no ; ]

[ min-refresh-time number ; ]

[ max-refresh-time number ; ]

[ min-retry-time number ; ]

[ max-retry-time number ; ]

[ port ip_port; ]

[ additional-from-auth yes_or_no ; ]

[ additional-from-cache yes_or_no ; ]

,

[ random-device path_name ; ]

[ max-cache-size size_spec ; ]

[ match-mapped-addresses yes_or_no; ]

};

version

回答针对服务器版本的请求时的内容。缺省返回的是服务器的真实版本。

directory

服务器的工作目录。配置文件中所有使用的相对路径,指的都是在这里配置的目录下。大多数服务器的输出文件(如named.run )都缺省生成在这个目录下。如果没有设定目录,工作目录缺省设置为服务器启动时的目录„. ‟。指定的目录应该是一个绝对路径。

named-xfer

这个选项已经被废弃了。它在BIND8 中,它用来给named-xfer 程序设定路径名。在BI ND9中,不需要单独的named-xfer 程序;它的功能已经内置在域名服务器中。 tkey-domain

这个域名将会附带在由TKEY 生成的所有共享密匙名字的后面。当用户请求进行TKEY 交换时,它会为密匙设定或不设定所要求的名称。如果设置了tkey_domain,共享密匙的名字将会是"client specified part" (用户设定的部分) "tkey-domain" 。否则,共享密匙的名字将是"random hex digits" (随机的16 进制数) "tkey-domain" 。在大多数情况下,domainname 应该是服务器的域名。

tkey-dhkey

,

针对使用Diffie-Hellman 的TKEY 模式的用户,服务器用来生成共享密匙的Diffie-Hellm an 密匙。服务器必须可以从工作目录中调入公共和私人密匙。大多数情况下,密匙的名称应该是服务器的主机名。

dump-file

当执行rndc dumpdb 命令时,服务器存放数据库文件的路径名。如果没有指定,缺省名字是named_dump.db。

memstatistics-file

服务器输出的内存使用统计文件的路径名。如果没有指定,默认值为named.memstats 。 注意:还没有在BIND9中实现!

pid-file

进程ID 文件的路径名。如果没有指定,默认为/var/run/named.pid。pid-file 是给那些需要向运行着的服务器发送信号的程序使用的。

statistics-file

当使用rndc stats 命令的时候,服务器会将统计信息追加到的文件路径名。如果没有指定,默认为named.stats 在服务器程序的当前目录中。

port

服务器用来接收和发送DNS 协议数据的UDP/TCP端口号。默认为53。这个选项主要用于服务器的检测;因为如果不使用53端口的话,服务器将不能与其它的DNS 进行通讯。 random-device

服务器使用的entropy 源:entropy 主要用于DNSSEC 操作,如TKEY 的数据交换和加密域的动态更新。此选项指定了entropy 将会从哪个设备(或文件)中读取信息。如果它是一个文件,则当文件耗尽后,需要entropy 的操作将会失败。如果没有指定,默认值是/d

,

ev/random(或等价的),如果它存在,否则就是没有。random-device 选项是在服务器启动时,初始化配置时起作用的,在以后的重启时则被忽略。

A.Boolean 选项

auth-nxdomain

如果是yes ,那么AA 位将一直设置成NXDOMAIN 响应,甚至在服务器不是授权服务器的情况下都是这样的。默认值是no ;这与BIND8不同。如果用户使用的是非常老版本的DN S 软件,则有必要把它设置成yes 。

deallocate-on-exit

此选项在BIND8中用于检查出口处内存泄露。BIND9忽略此选项,并始终进行检查。 dialup

如果是yes ,那么服务器将会像在通过一条按需拨号的链路进行域传送一样,对待所有的域(按需拨号就是在服务器有流量的时候,链路才连通)。根据域类型的不同它有不同的作用,并将集中域的维护操作,这样所有有关的操作都会集中在一段很短的时间内完成,每个he artbeat-interval 一次,一般是在一次调用之中完成。它也禁止一些正常的域维护的流量。默认值是no 。

dialup 选项也可以定义在view 和zone 语句中,这样就会代替了全局设置中dialup 的选项。

如果域是一个主域,服务器就会对所有辅域发送NOTIFY 请求。这将激活辅域名服务器中的对域的序列号的检验。这样当建立一个连接时,辅域名服务器才能确认这个域的传输合法性。

,

如果这个域是一个辅域或是末梢域(stub zone ),那么服务器将会禁止通常的“zone up to date ”(refresh )请求,为了能发送NOTIFY 请求,只有在heartbeat-interval 过期之后才执行。

通过下列的设置,可以实现更好的控制。

1、notify 只发送NOTIFY 信息。

2、notify-passive 发送NOTIFY 信息,并禁止普通的刷新(refresh )请求。

3、refresh 禁止普通的刷新处理,当heartbeat-interval 过期时才发送刷新请求。

4、passive 只用于关闭普通的刷新处理。

fake-iquery

在BIND8中,此选项用来模拟陈旧的DNS 查询类型IQUERY 。BIND9不再进行IQUERY 模拟。

fetch-glue

这个选项以后不再使用。

has-old-clients

这个选项在BIND8中执行有问题,BIND9则忽略了这个选项。为了达到has-old-clients yes 的预期效果,可以设定两个独立选项auth-nxdomain yes 和rfc2308-type1 no 来代替。

host-statistics

在BIND8中,它可以保留每台和域名服务器交互的主机统计信息。BIND9中不支持。 maintain-ixfr-base

此选项不再使用了。在BIND8用于判定是否保存了增量域传输的处理日志。BIND9任何可能的时候都会保存传输日志。如果需要禁止流出的增量域传输,可以使用provide-ixfr no 。

标签: