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 。