柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

DNS基本知识及搭建

DNS是什么大家已经很清楚了,就不多做累述了。

一、DNS解析过程

1.1 DNS解析的顺序

linux进行DNS解析的顺序,先查找/etc/hosts文件,如果没有再通过配置/etc/resolv.conf里面设置的DNS服务器进行DNS解析。

Centos6的文件设置:

# cat /etc/nsswitch.conf |grep hosts  #在Centos6里/etc/nsswitch.conf里面指定本地解析顺序的,这里只有两个files指本地的/etc/hosts文件,然后是/etc/resolv.conf里面定义的dns服务进行解析。

#hosts:     db files nisplus nis dns
hosts:      files dns

Centos7的文件设置:

# cat /etc/nsswitch.conf |grep hosts  #在Centos7里/etc/nsswitch.conf里多了一个myhostname,就是多了一个本地主机名的解析,如果你的主机名是自定义的,你直接ping自己的主机名是可以通过。

#hosts:     db files nisplus nis dns
hosts:      files dns myhostname

1.2 /etc/resolv.conf里面的设置

首先介绍一下DNS解析的超时时间:

# cat /etc/resolv.conf

nameserver 114.114.114.114
nameserver 223.6.6.6

#我们一般都会设置两个DNS解析服务器,默认情况下当第一个解析出现问题的时候会让第二个DNS解析服务器负责解析。第一次默认是五秒。

图片.png

#由上图可以看出,就以三个DNS来解释一下公式,第一次都是5S按顺序尝试下次,然后第二次就是超时时间会增加到10秒,公式是10(这个是第二次是10秒)/3(这个DNS服务器设置的数量)=3(取整,后面的小数部分不要)。

然后就是5*3+3*3=24秒。两台DNS服务器设置就是5*2+5*2=20秒,一台就是5*1+10*1=15秒。这个可以将自己/etc/resolv.conf里面设置两个错误不能进行DNS解析的namserver,然后# time dig www.baidu.com测试一下。

然后就引出了options指令:

# cat /etc/resolv.conf  #一般一个正常的DNS解析过程应该是在一秒之内,然后你可能觉得设置两个DNS解析服务器结果出问题了等待反馈的时间有点长,可以用options timeout:2将默认超时时间从5秒改为2秒。

nameserver 114.114.114.114
nameserver 223.5.5.5
options timeout:2

1.3 域的划分

DQDN(完全合格域名):根域+顶级域+二级域+子域+主机名,例如:www.baidu.com.,整个域名空间是一个倒置的树形结构。

根域:所有域的最顶端,管理者顶级域,现在全球有十三个根域。域名就是一个点号“.”。

顶级域:也称为一级域:.com(商业组织)、mil(军事部门)、.net(通常是提供网络基础设施的组织)、org(通常是非盈利组织)、.edu(教育)、.gov(政府)等常见的国际顶级域。还有国家顶级域:.cn、.ck等。

二级域或者次级域:网站使用者在顶级域中注册使用的域名,如baidu.com、sina.cn

子域:在二级域中可以授权多个子域并且可以设置多级子域,如:www.baidu.com这就是一级子域。如:web.mail.51niux.com,这就是一个二级子域,是mail.51niux.com的子域。(web就类似于主机名加上后面的mail.51niux.com域就是一个完整的域名,指向了此域名主机所在的位置。)

反向域:arpa,FQDN<--IP,通过IP反向解析出域名,这也算一个顶级域。

1.4 DNS服务器解析过程

# dig  +trace www.baidu.com  #dig命令是我们经常用到的一个命令,这是追踪一个域名的解析过程

; <<>> DiG 9.9.4-RedHat-9.9.4-38.el7_3.3 <<>> +trace   #dig的版本然后后面是跟的命令参数,追踪www.baidu.com的解析过程 
;; global options: +cmd   #下面可以看到第一列都是.,下面就是获得了13个根域的IP和主机名。
.            18113    IN    NS    e.root-servers.net.
.            18113    IN    NS    g.root-servers.net.
.            18113    IN    NS    m.root-servers.net.
.            18113    IN    NS    j.root-servers.net.
.            18113    IN    NS    l.root-servers.net.
.            18113    IN    NS    c.root-servers.net.
.            18113    IN    NS    b.root-servers.net.
.            18113    IN    NS    k.root-servers.net.
.            18113    IN    NS    a.root-servers.net.
.            18113    IN    NS    d.root-servers.net.
.            18113    IN    NS    h.root-servers.net.
.            18113    IN    NS    f.root-servers.net.
.            18113    IN    NS    i.root-servers.net.
;; Received 811 bytes from 114.114.114.114#53(114.114.114.114) in 39 ms  #114.114.114.114就是我们设置的DNS服务器,为我们返回来13个根域所在的位置。

com.            172800    IN    NS    a.gtld-servers.net. #这里就是向其中一台根域服务器发送www.baidu.com的解析请求,根域将.com顶级域的IP(未显示)和名称告诉了我们。
com.            172800    IN    NS    b.gtld-servers.net.
com.            172800    IN    NS    c.gtld-servers.net.
com.            172800    IN    NS    d.gtld-servers.net.
com.            172800    IN    NS    e.gtld-servers.net.
com.            172800    IN    NS    f.gtld-servers.net.
com.            172800    IN    NS    g.gtld-servers.net.
com.            172800    IN    NS    h.gtld-servers.net.
com.            172800    IN    NS    i.gtld-servers.net.
com.            172800    IN    NS    j.gtld-servers.net.
com.            172800    IN    NS    k.gtld-servers.net.
com.            172800    IN    NS    l.gtld-servers.net.
com.            172800    IN    NS    m.gtld-servers.net.
com.            86400    IN    DS    30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.            86400    IN    RRSIG    DS 8 1 86400 20170618050000 20170605040000 14796 . GkB03B/beJHmV1RNk7C+cWtEK4kHex9DQ/yFdB+N0RRu1KdPL/fGCHon eeQInXxzSiF10WPv+w+BYIJXzN5zULaP8M6SieW+59aZbDcDVqxh7BNB Z1yBZRlvJHu5ILnkcfaZM8HrGj6tZRd3ozygjoR7M9lSFV55aNiYMWyR hfL2cMfN1w7+149wWjngFkNgSopOVCBvM6nUlxuDjw2GQktW8R8JThJQ RRN9VZ0WLeTAY9o0KzCXmoax2GSkb1PDLOYdS8G0nnaRs+Btrbk6u4cf oBXJdx770EckaxhIWA8goAMT/rmOyCAparYQwDmq1exU/vWFDfb1fiRn 4NXj+Q==
;; Received 865 bytes from 198.97.190.53#53(h.root-servers.net) in 291 ms   #h.root-servers.net这个主机为我们返回了上面的com.域的主机位置

baidu.com.        172800    IN    NS    dns.baidu.com. #第三步,向com.域的一台服务器请求www.baidu.com的解析,它为我们返回了百度的五台SOA域服务器,也就是百度自己的DNS服务器。
baidu.com.        172800    IN    NS    ns2.baidu.com.
baidu.com.        172800    IN    NS    ns3.baidu.com.
baidu.com.        172800    IN    NS    ns4.baidu.com.
baidu.com.        172800    IN    NS    ns7.baidu.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20170610044750 20170603033750 27302 com. qtstB1qc43bHTc7TaTpoQf+0utzHITmvowD2CchY6qd546A00m3bnJf0 jof3C9kARs52DjVlJinbVbDL1eIa2UO/UVt0WOf9gyBkKbG3qRGWGu6N d6Y4GbgoSb/vRcyohpD15lqVcnFdhDPNVe9wsHBmFICe/lJG3d0RInbr RME=
HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN NSEC3 1 1 0 - HQ01I3PFSK4TG3Q31LT3RIMHGBFQU42T NS DS RRSIG
HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN RRSIG NSEC3 8 2 86400 20170612044853 20170605033853 27302 com. iwBbO4jBbQE91G75HiBDuMChoQbYKugUF1SGTbRxmgUYdfm7GHyhhM7e 4MpiGF+3mXDrbg8AcyeIu8qE+OV5ir5ytKw7/r2gJj7E4s/780brQSLW owNK4jifzcbMFXyoMrR1xC6bnzCQyeEJ1nObglzLMA8R1Ime4gpyPCDh 4pw=
;; Received 697 bytes from 192.48.79.30#53(j.gtld-servers.net) in 301 ms  #j.gtld-servers.net这个com.域主机为我们返回了上面五个百度SOA域服务器所在的位置。

www.baidu.com.        1200    IN    CNAME   www.a.shifen.com. #向上面提供的域主机发起了www.baidu.com的解析请求,为我们返回了一个www的CNAME别名,别名是www.a.shifen.com。按照一般逻辑,当DNS请求到别名的时候查询会终止,而是重新发起查询别名的请求。 
a.shifen.com.        1200    IN    NS    ns2.a.shifen.com.
a.shifen.com.        1200    IN    NS    ns4.a.shifen.com.
a.shifen.com.        1200    IN    NS    ns5.a.shifen.com.
a.shifen.com.        1200    IN    NS    ns3.a.shifen.com.
a.shifen.com.        1200    IN    NS    ns1.a.shifen.com.
;; Received 239 bytes from 180.76.76.92#53(ns7.baidu.com) in 3 ms  #ns7.baidu.com域主机为我们提供了解析服务,为我们返回了上面6个域名解析记录。

#如果你搭建了本地的DNS解析服务器在跟踪解析过程的话,会发现当解析到www.baidu.com.        1200    IN    CNAME    www.a.shifen.com.的时候,会向.com域再次对www.a.shifen.com.进行解析请求。

DNS轮询机制:如果你多对www.baidu.com进行dig查询的话,会发现并不是同一个IP,这就是一个名称对应多个IP,这是为了服务器不断地被轮询询问,防止一台主机接收访问量过大,从而做的负载均衡。

DNS查询分类:递归查询(一直问直到问出最终结果,DNS服务器做的事情)和迭代(反复)查询(只告诉你下一步怎么做或者是招那个域主机去询问,根域啊,com.域啊这些主机做的事情)。

1.5 DNS名字服务器的类型

DNS规范定义了两种类型的名字服务器:primary master(主名字服务器)和secondary master(辅名字服务器)。当然除此之外还有扩展出缓存域名服务器和转发域名服务器。

主名字服务器:也称为主域名服务器,负责维护这个域名区域的所有域名信息,是特定的所有信息的权威信息源。可以对域名进行修改添加管理。从本机中加载数据的文件叫做数据文件。

辅名字服务器:从主名字服务器传送过来的区数据备份到本机的数据文件当中,数据是从另一台域服务器复制过来的,所以数据无法修改只是一个区域文件的副本。如果辅名字服务器被杀死再重启时,它会先读取备份的数据文件,然后检查它的取数据是否是最新的。如果主域名服务器出现故障,辅域名服务器再自杀前还可以提供一段时间的解析服务。

缓存域名服务器:运行域名服务器软件但是没有域名数据库,如果收到域名服务的查询操作,它从某个远程服务器获得域名服务器的查询结果,会放到缓存中,以后再有相同的查询会给予回答。所以缓存域名服务器不是权威性的服务器,因为提供的所有信息都是间接信息。

转发域名服务器:负责所有非本地域名的本地查询。转发域名服务器接到查询请求时,在其缓存中查找,如果找不到请求的结果就以此转发到指定的域名服务器,直到查询到结果为止,否则返回无法映射的结果。名字服务器不能把数据永远的放到缓存中,这些域名的管理员为数据设定一个生存期简称TTL,生存期一过,名字服务器就必须丢弃缓存的数据,并从权威名字服务器上获取新的数据。对于否定缓存数据(也就是之前解析发现不存在的域名)也一样。

1.6 DNS按功能(角色)的分类

权威DNS:权威DNS是经过上一级授权对域名进行解析的服务器,同时它可以把解析授权转授给其他人,如com顶级服务器可以授权51niux.com这个域名的的权威服务器为ns.51niux.com,当然也可以指定别的域名权威服务器。平时我们解析域名的结果都源自权威DNS。比如51niux.com的权威DNS服务器就是万网的dns13.hichina.com和dns14.hichina.com。
递归DNS : 负责接受用户对任意域名查询,并返回结果给用户。递归DNS可以缓存结果以避免重复向上查询。我们平时使用最多的就是这类DNS,他对公众开放服务,一般由网络运营商提供,大家都自己可以架递归DNS提供服务。递归DNS一定要有可靠的互联网连接方可使用。比如谷歌的8.8.8.8和8.8.4.4以及114的114.114.114.114和114.114.115.115都属于这一类DNS。你本地电脑上设置的DNS就是这类DNS。
转发DNS : 负责接受用户查询,并返回结果给用户。但这个结果不是按标准的域名解析过程得到的,而是直接把递归DNS的结果转发给用户。它也具备缓存功能。他主要使用在没有直接的互联网连接,但可以连接到一个递归DNS那里,这时使用转发DNS就比较合适。其缺陷是:直接受递归DNS的影响,服务品质较差。比如我们用的路由器里面的DNS就是这一类,用路由器的朋友可以看下本地电脑的DNS一般都是192.168.1.1。

1.7 DNS常用记录类型

A记录:用来指定域名(或主机名)对应的IP地址记录。

CNAME记录:别名记录,允许将多个名字映射到同一台计算机。

MX记录:邮件交换记录,它指向一个邮件服务器,用于点子邮件系统发邮件时根据收件人的地址后缀来定位邮件服务器。

NS记录:域名服务器记录,用来指定该域名由哪个DNS服务器进行解析,指定负责此DNS区域的权威名称服务器。

PTR记录:指针记录,将一个IP地址映射到对应的域名,也可以看成是A记录的反向,IP地址的反向解析。PTR主要用于邮件服务器,对端的邮件服务器根据发件IP进行反向解析,如果解析结果对应发件人的域名称就接收这封邮件,否则拒绝接收这封邮件。

SOA记录:权威记录的起始,指定有关的DNS区域的权威性信息,包含主要名称服务器、域名管理员的邮箱地址、域名的流水式编号和几个有关刷新区域的定时器。

SPF记录:是为了防范垃圾邮件而提出来的一种DNS记录类型,它是一种TXT类型的记录,它用于登记某个域名拥有的用来外发邮件的所有IP地址。当你定义了你的domain name的SPF记录之后,接收邮件方会根据你的SPF记录来确定连接过来的IP地址是否被包含在SPF记录里面,如果在,则认为是一封正确的邮件,否则则认为是一封伪造的邮件。

TSIG记录:交易证书,用以认证动态更新(Dynamic DNS)是来自合法的客户端,或与 DNSSEC 一样是验证回应是否来自合法的递归名称服务器。

TXT记录:文本记录。一般指某个主机名或域名的说明,TXT的应用之一,SPF(Sender Policy Framework)反垃圾邮件。

博文来自:www.51niux.com

二、DNS服务器搭建

2.1 DNS服务器基本搭建

第一步:安装相关件软件

# yum install bind bind-libs -y #dns服务软件安装。提供域名服务的主要程序及相关文件。

# yum install bind-utils -y #提供了对DNS服务器的测试工具(如nslookup,dig等)

第二步:修改位置文件

# vim /etc/named.conf  #修改主配置文件,我们先做很小的修改让结果显示出来

options {
    //listen-on port 53 { 127.0.0.1; };  #我们将默认的127.0.0.1用//注释掉
    listen-on port 53 { 192.168.1.101; };  #这是新添加的一行,让其监听再192.168.1.101的53端口上面,注意每一行都要以;结尾。
    //listen-on-v6 port 53 { ::1; };   #我们将ipv6的注释掉如果不需要
    directory     "/var/named";        #这就是我们区数据文件的存放位置。
    dump-file     "/var/named/data/cache_dump.db"; #转储名称服务器数据库时存储文件的位置
    statistics-file "/var/named/data/named_stats.txt";  #转储其统计数据,存储文件的位置
    memstatistics-file "/var/named/data/named_mem_stats.txt";  
    //allow-query     { localhost; };  #将原来的只允许本地访问注释掉
    allow-query     { any; };   #新添加一行允许任何地址来访问
    /* 
     - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
     - If you are building a RECURSIVE (caching) DNS server, you need to enable 
       recursion. 
     - If your recursive DNS server has a public IP address, you MUST enable access 
       control to limit queries to your legitimate users. Failing to do so will
       cause your server to become part of large scale DNS amplification 
       attacks. Implementing BCP38 within your network would greatly
       reduce such attack surface 
    */
    recursion yes; #默认是开启递归设置。如果是yes,并且一个DNS询问要求递归,那么服务器将会做所有能够回答查询请求的工作。如果recursion是off的,并且服务器不知道答案,它将会返回一个推荐(referral)响应。默认值是yes。注意把recursion设为no,不会阻止用户从服务器的缓存中得到数据,它仅仅阻止新数据作为查询的结果被缓存。服务器的内部操作还是可以影响本地的缓存内容,如NOTIFY地址查询。

    dnssec-enable yes; #是否支持DNSSEC开关,默认为yes。 (DNSSEC)DNS安全扩展,是由IETF提供的一系列DNS安全认证的机制(可参考RFC2535)。它提供了一种来源鉴定和数据完整性的扩展,但不去保障可用性、加密性和证实域名不存在。DNSSEC是为解决DNS欺骗和缓存污染而设计的一种安全机制。 
    dnssec-validation yes;  # 是否进行DNSSEC确认开关。
    //dnssec-lookaside auto; #该选项的语法格式为:[ (dnssec-lookaside auto| no| domain trust-anchor daomain); ],dnssec-lookside为验证器提供另外一个能在网络区域的顶层验证DNSKEY的方法。当使用dnssec-lookaside指定一个DNSKEY是等于或低于指定域时,正常DNSSEC验证已经忽略了不信任的密钥。如果它能够验证密钥,trust-anchor将被追加到密钥名和DLV记录被查看。如果DLV记录验证一个DNSKEY,这个DNSKEY RRset可以被视为可信任的。如果dnssec-lookside设置为auto,那么内置的默认值DLV域和信任锚定将被使用,随着一个内置的验证密钥。如果设置为no,那么不使用dnssec-lookside,将加载默认DLV密钥存储在文件bind.keys中。默认的DLV密钥存储在文件bind.keys中,如果dnssec-lookaside设置为auto,named在启动时将被加载。

    /* Path to ISC DLV key */
    bindkeys-file "/etc/named.iscdlv.key";   #内置信任的密钥文件。当dnssec-validation和dnssec-lookaside都被设为auto时,这个密钥文件生效。

    managed-keys-directory "/var/named/dynamic"; #指定目录中的文件存储,跟踪管理DNSSEC密钥。默认情况下,保存在/var/named/dynamic目录中。如果named配置不使用视图,然后在管理服务器中的密钥将被跟踪单个文件称为managed-keys.bind;否则将单独跟踪管理的密钥文件。

    pid-file "/run/named/named.pid";  #pid文件的位置
    session-keyfile "/run/named/session.key";  #写入由nsupdate -l使用的命名生成的TSIG会话密钥的文件的路径名。 如果未指定,则默认值为/var/run/named/session.key。
};

logging { #定义bind服务的日志
        channel default_debug {  #定义通道,default_debug只有当服务器的debug级别非0时,才产生输出
                file "data/named.run"; #默认日志保存位置
                severity dynamic;   #severity按照服务器当前的debug级别记录日志。everity语句用于指定消息的严重性等级。log_severity的取值为(按照严重性递减的顺序):critical、error、warning、notice、info、debug [level]、dynamin。dynamic是一个特殊的值,系统会记录包括该级别以及比该级别更严重的级别的所有消息。比如定义级别为error,则会记录critical和error两个级别的消息。对于系统管理来说,一般记录到info级别就可以了。
        };
};

zone "." IN {   #这是定义了根域。zone用来定义一个区域。每个zone区域都是可选的(包括根域、回环域、反向域),具体根据实际需要而定,zone配置部分的IN关键子可以省略。
    type hint;  #指定区域类型为根域,可以设置的区域类型有“根域”、“主域”和“从域”3种类型,在配置文件中分别使用hint、master和slave表示这3种类型。
    file "named.ca";  #定义了根域数据库文件位置,默认是在/var/named/named.ca,设置区域地址数据库文件,该文件名由用户自行设置,只要实际的地址数据库文件名与其保持一致即可。
};

include "/etc/named.rfc1912.zones"; #这两个就是加载哪些文件
include "/etc/named.root.key";

第三步:修改/etc/named.rfc1912.zones区域文件,此文件里面原来的内容可以全删除掉,那就相当于例子供你参考。

zone "51niux.in" IN {  #定义了一个51niux.in的域
     type master;      #类型为主域
     file "51niux.in.zone";   #文件是51niux.in.zone,默认是在/vat/named/目录下面
};
zone "1.168.192.in-addr.arpa" IN {  #定义了一个反向域,这个你要从右向左来看,arpa.addr-in.192.168.1
     type master;    #类型为主域
     file "1.168.192.zone";  #文件位置
};

第四步:添加51niux.in.zone域文件并修改

# cat /var/named/51niux.in.zone

$TTL 86400      //设置地址解析记录的默认存储时间,单位是秒。当然也可以用3h(3小时)或者1D(一天)来表示,大小写没影响不过一般用大写。H(时)、M(分)、S(秒)、W(周)、D(天)
@ IN SOA ns1.51niux.in. csp ( //定义了一条SOA记录,现在是一种缩写,@代表51niux.in.,这是很常见的一种写法。这里定义了SOA标记、SOA域名是ns1.51niux.com,域管理邮箱是csp@51niux.in(也可以写成csp.51niux.in.,这里第一个.就相当于@)
                  2017060616    //更新序列号,10位以内的证书,用于标记地址数据库的变化,这里是以2017年6月6日16时来定义的序列号。
                  3H          //刷新时间,从域名服务器更新该地址数据库文件的间隔时间
                  1H          //重试延时,从域命服务器更新地址数据库失败以后,等待多长时间再次尝试
                  1W          //失效时间,超过该时间仍无法更新地址数据库,则不再尝试并且杀死自己。
                  1H )        //设置无效地址解析记录(该数据库中不存在的地址也就是域名)的默认缓存时间
@ IN NS ns1.51niux.in.        //域名服务器记录,用于设置当前域的DNS服务器的域名地址
@ IN NS ns2.51niux.in.

@          IN MX 5 mail.51niux.in. //设置邮件服务器的MX记录,前面的@就表示51niux.in.
@                    IN  MX  10 mail2.51niux.in. //这里设置了两个MX记录。优先级越高的邮件交换器的优先级值就小,如果上面的MX出问题了,才会解析到现在这台机器。
ns1 IN  A  192.168.1.101           //这些就是A记录了
ns2 IN  A  192.168.1.102                      //因为是缩写了,所以ns2.51niux.in.可以直接缩写成ns2
www IN  A  192.168.1.103
mail IN A  192.168.1.104                     
mail2 IN  A    192.168.1.105              
pop3 IN  CNAME mail.51niux.in.     //这些就是CNAME记录了
imap IN  CNAME mail.51niux.in.

第五步:1.168.192.zone反向域文件的添加并修改

$TTL 86400
@ IN SOA ns1.51niux.in. csp (
                  2017060616
                  3H
                  1H
                  1W
                  1H )
@ IN NS ns1.51niux.in.
@ IN NS ns2.51niux.in.
104 IN PTR mail.51niux.in.  //这是也缩写,标准格式是104.1.168.192.in-addr.arpa,指定了192.168.1.104的反向域名是mail.51niux.in

第六步:重启DNS服务

# named-checkconf  /etc/named.conf  #可以检测下配置文件,没输出就说明没问题

# named-checkzone  51niux.in  /var/named/51niux.in.zone  #检查下zone文件,

zone 51niux.in/IN: loaded serial 2017060616
OK

# service named restart  #重启bind服务,也可以查看日志是否报错# tail -f /var/log/messages
# netstat  -lntup|grep :53  #查看53端口已经启动
tcp        0      0 192.168.1.101:53        0.0.0.0:*               LISTEN      124313/named        
udp        0      0 192.168.1.101:53        0.0.0.0:*                           124313/named

第七步:测试

# cat /etc/resolv.conf  #找一台机器将dns服务器设置成我们的测试DNS服务器
nameserver 192.168.1.101

# ping www.51niux.in #ping检测一下
图片.png
# nslookup www.baidu.com #抓下外网

图片.png

# dig -x 192.168.1.104 @192.168.1.101 #指定通过192.168.1.101去查看192.168.1.104的反向解析。

图片.png

#经过测试我们设置的域名可以解析,外网也可以解析,反向解析也是可以的。

第八步:解决ipv6相关报错

通过上面的配置启用后虽然可以正常使用,不过在/var/log/message 和 /var/named/data/named.run 日志中会出现相关报错。

Jun  6 18:05:56 agent3 named[3218]: error (network unreachable) resolving './DNSKEY/IN': 2001:500:3::42#53
Jun  6 18:05:56 agent3 named[3218]: error (network unreachable) resolving './DNSKEY/IN': 2001:7fe::53#53
Jun  6 18:05:56 agent3 named[3218]: error (network unreachable) resolving './DNSKEY/IN': 2001:dc3::35#53
Jun  6 18:05:56 agent3 named[3218]: error (network unreachable) resolving './DNSKEY/IN': 2001:500:2f::f#53

该报错是由于启用了ipv6的原因导致的,虽然我们在/etc/named.conf中将listen项的IPv6配置已禁用,但是在named.ca配置中还有13台根域的ipv6配置。所以还需要如下两种方法中的任一种来关闭ipv6的使用。
方法1:修改/etc/sysconfig/named配置
直接编辑配置文件/etc/sysconfig/named:

OPTIONS="whatever" 改为  OPTIONS="-4"
# 注意OPTIONS选项的值可以是:whatever、-4、-6中的一个

方法2:完全禁用IPv6

配置文件/etc/sysconfig/network,然后 将NETWORKING_IPV6=YES改为NETWORKING=no;

关闭ip6tables这个服务;向/etc/modprobe.conf文件中,添加如下内容:

alias ipv6 off
alias net-pf-10 off

博文来自:www.51niux.com

三、DNS主辅同步部署

增量区传送(IXFR):区很大的话,区传送需要一定的时间,IXFR是为了解决这个问题,它允许辅名字服务器告诉主名字服务器当前使用的区的版本,并仅仅请求传送它使用的版本和当前版本之间改动过的部分。这样就大大减少了区传送的大小和所需的时间。但是存在的问题比较多,如果最大限度的利用IXFR,最好动态更新修改区而不是手工编辑区数据文件。

全量区传送(AXFR):默认的是这种形式,进行整个区传送的查询类型。

3.1 dns主服务器端(192.168.1.101)的设置

# cat /etc/named.rfc1912.zones

zone "51niux.in" IN {
     type master;
     file "51niux.in.zone"; 
     allow-transfer { 192.168.1.104;}; //辅助DNS的地址,也就是只允许此服务复制51niux.in.zone的信息的信息
     allow-update { none;};            //设置允许动态更新的客户端地址(none为禁止)
     also-notify { 192.168.1.104;};    //当zone信息发送改变时,主DNS会主动给辅助DNS发送信息通知自己更新了
};
zone "1.168.192.in-addr.arpa" IN {
     type master;
     file "1.168.192.zone";
     allow-transfer { 192.168.1.104;};
     allow-update { none;};
     also-notify { 192.168.1.104;};  //BIND8和BIND9是不允许关掉服务器对服务器的NOTIFY声明的,所以notify yes;加不加都行,默认就是开启的。

};

notify: 默认为yes,当服务器的一个域授权发生改变,将发送DNS NOTIFY信息给域NS记录的服务器列表,和一些列在also-notify选项中的服务器.如果选master-only,信息只发给主域,如果是explicit,通知只发给also-notify的列表,no不发通知.这里需要注意:如果我们also-notify没有进行设定的话,那么会造成当主dns记录发生改变后,辅dns并没有同步更改相应的记录。也许有人会说我们可以更改SOA中的Refresh值,把它改小点也一样,这样说到也是可以的,但问题是我们的主DNS修改完重启服务后,它是会主动发送一个notify值,如果辅助DNS服务器没有收到才参考Refresh,Refresh 不成功,则参考Retry ,Retry 一直不成功,则参考 Expire,如果Expire也不成功,则选择放弃zone transfer的过程。所以为了主辅更好的同步,建议大家在这里设置also-notify。

# service named restart #重启主DNS的服务

3.2 dns从服务器端(192.168.1.104)的设置

# cat /etc/named.conf  #只改变一出,上面讲述了这里设置个IP的形式,改成下面的形式就是监听0.0.0.0,主从这样设置的话,主从的named.conf就都不用更改了保持一致了。
listen-on port 53       { any; };

# cat /etc/named.rfc1912.zones

zone "51niux.in" IN {
     type slave;  //类型是不一样,指定自己的DNS类型是slave也就是指定自己是辅助DNS服务器
     file "slaves/51niux.in.zone";
     masters{   //这里指定从哪个master服务器同步zone文件
            192.168.1.101;  //192.168.1.101从这个主服务器同步zone数据
     };
};
zone "1.168.192.in-addr.arpa" IN {
     type slave;
     file "slaves/1.168.192.zone";
     masters{
            192.168.1.101;
     };
};

# service named restart #重启辅助DNS服务器的服务。

# chmod 700 /var/named/slaves

# tail -f /var/log/messages  #当你上面进行重启的时候,查看日志已经有数据同步过来了,如果设置是成功的话。

Jun  6 18:17:13 agent3 named[3399]: zone 51niux.in/IN: Transfer started.
Jun  6 18:17:13 agent3 named[3399]: transfer of '51niux.in/IN' from 192.168.1.101#53: connected using 192.168.1.104#21228
Jun  6 18:17:13 agent3 named[3399]: zone 51niux.in/IN: transferred serial 2017060619  #注意我们设置的这个ID号等会同步的时候就知道它的重要性了。
Jun  6 18:17:13 agent3 named[3399]: transfer of '51niux.in/IN' from 192.168.1.101#53: Transfer completed: 1 messages, 17 records, 391 bytes, 0.001 secs (391000 bytes/sec)
Jun  6 18:17:13 agent3 named[3399]: zone 51niux.in/IN: sending notifies (serial 2017060619)
Jun  6 18:17:13 agent3 named[3399]: zone 1.168.192.in-addr.arpa/IN: Transfer started.
Jun  6 18:17:13 agent3 named[3399]: transfer of '1.168.192.in-addr.arpa/IN' from 192.168.1.101#53: connected using 192.168.1.104#10660
Jun  6 18:17:13 agent3 named[3399]: zone 1.168.192.in-addr.arpa/IN: transferred serial 2017060616
Jun  6 18:17:13 agent3 named[3399]: transfer of '1.168.192.in-addr.arpa/IN' from 192.168.1.101#53: Transfer completed: 1 messages, 5 records, 184 bytes, 0.003 secs (61333 bytes/sec)
Jun  6 18:17:13 agent3 named[3399]: zone 1.168.192.in-addr.arpa/IN: sending notifies (serial 2017060616)

图片.png

3.3 进行测试

主DNS上面的操作:

现在我们在192.168.1.101上面添加一条DNS,并且查看日志:

# vim /var/named/51niux.in.zone  #添加下面一条记录
dnstest IN A 192.168.1.101

# service named reload  #不可能总是重启服务,让named重新加载一下配置文件

# tail -f /var/log/messages  #下面是最后的信息

Jun  6 18:22:30 master named[125967]: reloading zones succeeded
Jun  6 18:22:30 master named[125967]: zone 51niux.in/IN: zone serial (2017060619) unchanged. zone may fail to transfer to slaves.  #区序(2017060619)不变。区域可能无法转移到salves服务器。
Jun  6 18:22:30 master named[125967]: zone 51niux.in/IN: loaded serial 2017060619
Jun  6 18:22:30 master named[125967]: zone 51niux.in/IN: sending notifies (serial 2017060619)  #发送通知(系列2017060619),说明已经通知出去,通知slaves来更新了。

图片.png

#客户端本地测试已经生效了。

辅助DNS上面进行的操作:

# tail -f /var/log/messages  #下面是最后的信息

Jun  6 18:22:31 agent3 named[3399]: client 192.168.1.101#43642: received notify for zone '51niux.in'  #客户端收到了通知51niux.in的更新
Jun  6 18:22:31 agent3 named[3399]: zone 51niux.in/IN: notify from 192.168.1.101#43642: zone is up to date  #从192.168.1.101去更新最新的51nux.in的zone文件

图片.png

注意:

差就差在了主DNS服务器再更改zone文件的时候,serial号没有进行更改。每次更改zone文件,serial号都要进行更改可以按天加或者按小时加,要增大,一定要比辅助DNS的serial号大,这样辅助DNS一查看自己的serial号变小了,就会同步数据了。

如现在我们将主DNS上面的号加大一下再重新加载配置文件:

图片.png

再查看辅助DNS上面的日志:

# tail -f /var/log/messages

Jun  6 18:35:09 agent3 named[3399]: zone 51niux.in/IN: Transfer started.  #zone 51niux.in转移开始
Jun  6 18:35:09 agent3 named[3399]: transfer of '51niux.in/IN' from 192.168.1.101#53: connected using 192.168.1.104#36323  #192.168.1.104连接上来了
Jun  6 18:35:09 agent3 named[3399]: zone 51niux.in/IN: transferred serial 2017060620  #发现号已经发生了变化已经不是2017060619了。
Jun  6 18:35:09 agent3 named[3399]: transfer of '51niux.in/IN' from 192.168.1.101#53: Transfer completed: 1 messages, 18 records, 415 bytes, 0.001 secs (415000 bytes/sec)  #从192.168.1.101传送51niux.in完成,1条信息,18条记录,415字节,0.001秒。
Jun  6 18:35:09 agent3 named[3399]: zone 51niux.in/IN: sending notifies (serial 2017060620)

图片.png

博文来自:www.51niux.com

四、BIND配置语法介绍

acl : 定义IP地址访问控制列表

controls : 定义 rndc 命令使用的控制通道,若省略此句,则只允许经过 rndc.key 认证的 127.0.0.1 的 rndc 控制

include : 加载文件,文件里面可以有一些配置。

key:定义用于 TSIG 的授权密钥

logging : 定义日志的记录规范,只能在配置中出现一次。

options : 定义全局配置选项,只能在配置中出现一次。

server : 设置每个服务器的特有的选项

trusted-keys : 定义信任的DNSSED秘钥

view : 定义域名空间的一个视图,用来做智能DNS解析

zone : 定义一个域

4.1 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程序设定路径名。在BIND9中,不需要单独的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-Hellman 密匙。服务器必须可以从工作目录中调入公共和私人密匙。大多数情况下,密匙的名称应该是服务器的主机名。

dump-file

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

memstatistics-file

服务器输出的内存使用统计文件的路径名。如果没有指定,默认值为named.memstats

注意:还没有在BIND9中实现!

pid-file

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

statistics-file

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

port

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

random-device

服务器使用的entropy源:entropy主要用于DNSSEC操作,如TKEY的数据交换和加密域的动态更新。此选项指定了entropy将会从哪个设备(或文件)中读取信息。如果它是一个文件,则当文件耗尽后,需要entropy的操作将会失败。如果没有指定,默认值是/dev/random(或等价的),如果它存在,否则就是没有。random-device选项是在服务器启动时,初始化配置时起作用的,在以后的重启时则被忽略。

A.Boolean 选项

auth-nxdomain

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

deallocate-on-exit

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

dialup

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

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

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

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

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

1notify 只发送NOTIFY信息。

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

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

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

fake-iquery

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

fetch-glue

这个选项以后不再使用。

has-old-clients

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

host-statistics

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

maintain-ixfr-base

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

minimal-responses

如果是yes,当产生响应的时候,服务器将只会按照需要将记录添加到authorityadditional的数据部分。(例如,delegationsnegative responses)。这样会改善服务器的性能。默认值为no

multiple-cnames

这个选项在BIND8中使用,允许一个域名承认多条CNAME记录(与DNS标准相违

背)。BIND9.2在主hosts文件和动态更新中都严格强制执行CNAME规则。

notify

如果是yes(默认),当一个授权的服务器修改了一个域后,DNS NOTIFY信息被发送出去。此信息将会发给列在域NS记录上的服务器(除了由SOA MNAME标示的主域名服务器)和任何列在also-notify选项中的服务器。

如果是explicit,则notify将只发给列在also-notify中的服务器。如果是no,就不会发出任何报文。

notify选项也可能设定在zone语句中,这样它就替代了options中的notify 语句。如果notify会使得辅域名服务器崩溃,就需要将此选项关闭。

recursion

如果是yes,并且一个DNS询问要求递归,那么服务器将会做所有能够回答查询请求的工作。如果recursionoff的,并且服务器不知道答案,它将会返回一个推荐(referral)响应。默认值是yes。注意把recursion设为no,不会阻止用户从服务器的缓存中得到数据,它仅仅阻止新数据作为查询的结果被缓存。服务器的内部操作还是可以影响本地的缓存内容,如NOTIFY地址查询。

rfc2308-type1

设置成yes 将会使得服务器发送NS 记录和关于negative answer SOA记录。默认值为no

注:BIND9 中还不支持。

use-id-pool

此选项已经不再使用。BIND9 始终都是从池中分配请求ID的。

zone-statistics

如果是yes,缺省情况下,服务器将会收集在服务器所有域的统计数据。这些统计数据可以通过使用rndc stats来访问,rndc stats命令可以将这些信息转储到statistics-file定义的文件中去。

use-ixfr

这个选项不再使用。如果需要针对一个或多个特殊的服务器关闭IXFR,可以参考provide-ixfr中的内容。

provide-ixfr

参阅中关于provide-ixfr的陈述。

request-ixfr

参阅关于request-ixfr的陈述。

treat-cr-as-space

这个选项应用于BIND8中,使服务器正确处理回车(”\r”)字符,就象其它的空格或tab字符一样。这样可以便于在unix系统上加载由NTDOS系统生成的域文件。在BIND9,UNIX”的\n”和DOS 的”\r\n”都可以正确处理为换新行,这个选项就被忽略了。

additional-from-auth

additional-from-cache

当回答具有additional数据的请求,或者当在CNAME DNAME串的后面时,这些选项控制一个权威服务器的操作。

当这两个选项都被设成yes(默认状态),并且查询的是授权的数据(这个域就配置在本地服务器中)时,回答中的additional部分的数据将使用来自于其它授权域和cache

在许多情况下这是不需要的,比如在缓存内容的正确性受到怀疑的情况下,或是在某些辅域可能被非法修改的服务器。还有,避免对这些additional数据的搜索将会加速服务器运转。

例如,如果一个查询需要主机foo.example.comMX记录,找到的记录是"MX 10

mail.example.net",如果知道的话, mail.example.net的地址记录(A,A6 AAAA)也会被提供出来。把选项设置为no,则禁止了这种操作。

这些选项用于授权的服务器,或者是授权的视图中。把它们设成no,但没有同时设置recursion no,将会使得服务器忽略这些选项,并记录一个警告日志。

设定additional-from-cacheno实际上针对additional信息的查询和正在响应的查询,都禁止了缓存的使用。这常常使用在一台授权的服务器中,因为在这里缓存数据的正确性非常重要。

当一台域名服务器不提供递归查询时,并且查询的名称并不在本地域中,一般会对根服务器或者其他已知的上级服务器回答"upwards referral(向上推荐)"。既然在向上查询中的数据来自于缓存,那么当additional-from-cache被设定为no时,服务器就不能提供向上推荐。相反,它会使用REFUSED(拒绝)回答这些查询。因为向上推荐不是在用户解析过程中需要的,所以就不会出任何问题。

match-mapped-addresses

如果是yes,那么一个ipv4映射成的ipv6地址就会匹配任何地址匹配表中能匹配于对应的ipv4 地址的记录。打开这个选项,对于运行了ipv6linux系统有时非常有用,这样通过地址映射,就可以使得ipv4TCP连接(如域传送)实现在Ipv6soket上,因为地址匹配列表是给Ipv4设计的。

B. 转发

转发功能可以用来在一些服务器上产生一个大的缓存,从而减少到外部服务器链路上的流量。它可以使用在和internet没有直接连接的内部域名服务器上,用来提供对外部域名的查询。只有当服务器是非授权的,并且缓存中没有相关记录时,才会进行转发。

forward

此选项只有当forwarders列表中有内容的时候才有意义。当值是First,默认情况下,使服务器先查询设置的forwarders,如果它没有得到回答,服务器就会自己寻找答案。如果设定的是only,服务器就只会把请求转发到其它服务器上去。

forwarders

设定转发使用的ip地址。默认的列表是空的(不转发)。转发也可以设置在每个域上,这样全局选项中的转发设置就不会起作用了。用户可以将不同的域转发到服务器上,或者对不同的域可以实现forward onlyfirst的不同方式,也可以根本就不转发。

C. 访问控制

可以根据用户请求使用的IP地址进行限制。

allow-notify

设定哪个主机上的辅域(不包括主域)已经进行了修改。allow-notify也可以在zone语句中设定,这样全局options中的allow-notify选项在这里就不起作用了。但它只对辅域有效。如果没有设定,默认的是只从主域发送notify信息。

allow-query

设定哪个主机可以进行普通的查询。allow-query也能在zone语句中设定,这样全局options中的allow-query选项在这里就不起作用了。默认的是允许所有主机进行查询。

allow-recursion

设定哪台主机可以进行递归查询。如果没有设定,缺省是允许所有主机进行递归查询。注意禁止一台主机的递归查询,并不能阻止这台主机查询已经存在于服务器缓存中的数据。

allow-v6-synthesis

设定哪台主机能接收对ipv6的响应。

allow-transfer

设定哪台主机允许和本地服务器进行域传输。allow-transfer也可以设置在zone语句中,这样全局options中的allow-transfer选项在这里就不起作用了。如果没有设定,默认值是允许和所有主机进行域传输。

blackhole

设定一个地址列表,服务器将不会接收来自这个列表的查询请求,或者解析这些地址。从这些地址来的查询将得不到响应。默认值是none

D. 接口

接口和端口(服务器回答来自于此的询问)可以使用listen-on选项来设定。listen-on使用可选的端口和一个地址匹配列表(address_match_list)。服务器将会监听所有匹配地址列表中所允许的端口。如果没有设定端口,就使用默认的53

允许使用多个listen-on语句。例如:

listen-on { 5.6.7.8; };

listen-on port 1234 { !1.2.3.4; 1.2/16; };

将在5.6.7.8 ip地址上打开53端口,在除了1.2.3.41.2 网段上打开1234 端口。

如果没有设定listen-on,服务器将在所有接口上监听端口53

listen-on-v6选项用来设定监听进入服务器的ipv6请求的端口。

服务器并不象在ipv4中那样对每个IPV6端口地址绑定一个独立的socket。相反,它一直监听ipv6通配的地址。这样,对于listen-on-v6语句唯一的address_match_list的参数就是:{ any; }{ none;}

多个listen-on-v6选项可以用来监听多个端口:

listen-on-v6 port 53 { any; };

listen-on-v6 port 1234 { any; };

要使服务器不监听任何ipv6地址,使用:

listen-on-v6 { none; };

如果没有设定listen-on-v6语句,服务器将不会监听任何ipv6地址。

E. 查询地址

如果服务器查不到要解析的地址,它将会查询其它域名服务器。query-source可以用来设定这类请求所使用的地址和端口。对于使用ipv6发送的查询,有一个独立的query-source-v6选项。如果address*或者被省略了,则将会使用一个通配的IP地址

(INADDR ANY)。如果port*或者被省略了,则将会使用一个随机的大于1024的端口。

默认为:

query-source address * port *;

query-source-v6 address * port *;

注:query-source选项中设置的地址是同时用于UDPTCP两种请求的,但是port仅仅用

UDP请求。TCP请求使用的是随机的大于1024的端口。

F. 域传输

BIND有适当的机制来简化域传输,并限定系统传输的负载量。下列设定应用于域传输:

also-notify

定义一个用于全局的域名服务器IP地址列表。无论何时,当一个新的域文件被调入系统,域名服务器都会向这些地址,还有这些域中的NS记录发送NOTIFY信息。这有助于更新的域文件尽快在相关的域名服务器上收敛同步。如果一个also-notify列表配置在一个zone语句中,全局options中的also-notify语句就会在这里失效。当一个zone-notify语句被设定为no,系统就不会向在全局中also-notify列表中的IP地址发送NOTIFY消息。缺省状态为空表(没有全局通知列表)

max-transfer-time-in

比设定时间更长的进入的域传输将会被终止。默认值是120分钟(2小时)

max-transfer-idle-in

在设定时间下没有任何进展的进入域传输将会被终止。默认为60分钟(1小时)

max-transfer-time-out

运行时间比设定的时间长的发出的域传输将会被终止。默认为120分钟(2小时).

max-transfer-idle-out

在设定时间下没有任何进展的发出的域传输将会被终止。默认为60分钟(1小时)

serial-query-rate

辅域名服务器将会定时查询主域名服务器,来确定域的串号是否改变。每个查询将会占用一些辅域名服务器网络带宽。为限制占用的带宽,BIND9可以限制每个查询发送的频率。serial-query-rate的值是一个整数,就是每秒能发送的最大查询数。默认值为20

serial-queries

BIND8, serial-queries选项设定了在任何时候允许达到的最大的并发查询数。BIND9不限制串号查询的数量并忽略了serial-queries选项。它会使用serial-query-rate选项来限制查询的频率。

transfer-format

域传输可以用两种不同格式,one-answermany-answertransfer-format选项使用在主域名服务器上,用来确定发送哪种格式。one-answer在每个资源记录传输中使用一个

DNS消息。many-answer则将尽可能多的资源记录集中在一个消息中。many-answer

更加有效的,但只有相对比较新的辅域名服务器才支持它,如BIND9BIND8.x 和打了补丁的BIND4.9.5。默认的设置为many-answer。使用server语句中的相关选项,可以替代全局选项中的transfer-format设置。

transfers-in

可以同时运行的进入的域传输的最大值。默认值为10。增加transfers-in的值,可以加速辅域的收敛速度,但也可能增加本地系统的负载。

transfers-out

可以同时运行的发出的传输的最大值。超过限定的域传输请求将会被拒绝。默认值为10

transfers-per-ns

从一台指定的远程域名服务器,同时进行的进入的域传输的最大值。默认值2。增加

transfers-per-ns的值,会加速辅域的收敛速度,但也可能增加远程系统的负载。使用

server语句中的transfer短语可以替代全局选项中的transfers-per-ns

transfer-source

transfer-source决定在从外部域名服务器上得到域传送数据时,选哪个本地的ip地址使用在IPV4TCP连接中。它可以选定IPV4的源地址,和可选的UDP端口,用于更新的查询和转发的动态更新。不过不做设置,它会缺省挑选一个系统中的地址(常常是最靠近远程终端服务器的接口地址)。但这个地址必须已经配置在远程终端的allow-tranfer选项中,才能进行域传送。此语句为所有的域设定了transfer-source,但如果viewzone中也使用了transfer-source语句,则全局选项中的配置就在这里失效了。

transfer-source-v6

transfer-source一样,只是域传输是通过IPV6执行的。

notify-source

notify-source确定使用哪些本地的源地址和可选的UDP端口,用于发送NOTIFY消息。这个地址必须在辅域名服务器的master域或在allow-notify中设置。它会为所有域设定

notify-source, 但如果viewzone中也使用了notify-source语句,则全局选项中的配置就在这里失效了。

notify-source-v6

notify-source类似,但应用于ipv6地址的notify报文的发送。

G. 操作系统资源限制

可以限制服务器对许多系统资源的使用。这些就是通过调节资源限制的数值来完成的。例如,1G可以代替1073741824,限定一个十亿字节的限制。Unlimited 要求不限制使用,或者最大可用量。Default 将会使用服务器启动时的缺省值。

下列选项设定了域名服务器进程的操作系统资源占用限制。一些操作系统可能不支持一些

或所有的限制。在这样的系统中,当使用不被支持的限制时,会产生一个告警。

coresize

core dump文件的最大值尺寸。默认值为default

datasize

服务器可以使用的最大数据内存量。默认值为default。这是一个在服务器系统内存中

已经设置了的参数。如果服务器要超过这个限制的内存量,则会失败,这将使服务器不能

提供DNS服务。所以,这个选项作为一种限制服务器所使用的内存量的方式就不太有效,但是它能够将操作系统设置的太小的缺省数据尺寸增大。如果要限制服务器使用的内存量,可以使用max-cache-sizerecursive-clients选项。

files

服务器可以同时打开的最大文件数。默认是unlimited

stacksize

服务器可以使用最大的堆栈内存量。默认值为default

H. 服务器资源限制

下列选项设定了服务器资源使用限制,这是由域名服务内部做的而不是操作系统设定的。

max-ixfr-log-size

此选项比较老;它由BIND8兼容接受或者忽略。

recursive-clients

服务器同时为用户执行的递归查询的最大数量。默认值1000,因为每个递归用户使用许多位内存,一般为20KB,主机上的recursive-clients选项值必须根据实际内存大小调整。

tcp-clients

服务器同时接受的TCP连接的最大数量,默认值100

max-cache-size

服务器缓冲使用的最大内存量,用比特表示。但在缓存数据的量达到这个界限,服务器将会使记录提早过期这样限制就不会被突破。在多视图的服务器中,限制分别使用于每个视图的缓存。默认值没有限制,意味着只有当总的限制被突破的时候记录才会被缓存清除。

I. 周期性任务间隔

cleaning-interval

服务器将在cleaning-interval的每一时间中从缓存中清除过期的资源记录。默认为60分钟,如果设置为0,就不会有周期性清理。

heartbeat-interval

服务器将会为所有标记dialup的域运行维护任务,无论它的间隔在何时到期。默认为60分钟,合理值不超过1(1440 分钟)。如果设定为0,不会为这些域产生域维护。

interface-interval

服务器将在每个interface-interval时间扫描网络接口表。默认为60分钟。如果设置为0,仅当配置文件被加载时才会进行接口扫描。在扫描之后,所有新接口上的监听器将会被打开(listen-on配置使用的接口)。关闭接口上的监听器将会被清除。

statistics-interval

域名服务器统计将会在每个statistics-interval时刻被记入日志。默认值60分钟,如果设为0,就没有统计数据记入日志。

注意:BIND9 不支持

J. 拓扑

当服务器从一个域名服务器列表中选择一个域名服务器查询时,这些域名服务器是没有什么不同的,但是服务器会先选择在拓扑结构上距离自己最近的服务器去做解析。拓扑语句使用一个地址匹配列表并且以一个特殊方式解释它。每个顶层列表元素被赋了一段距离,非否定元素得到它们在列表中的位置的距离,匹配距离表的开头越近,它离服务器的距离就越小。否定匹配元素将会从服务器分配最大距离;没有匹配的地址将会得到一个比任何非否定表元素都远的并且比任何否定元素近的距离。例如:

topology {

10/8;

!1.2.3/24;

{ 1.2/16; 3/8; };

};

最优先网段10的服务器,然后是在网络1.2.0.0(网络掩码255.255.0.0)3.0.0.0(网络掩

255.0.0.0);再就是没列出来的,但是没有否定的网段。否定的网段1.2.3 的主机(网络掩

255.255.255.0)

默认拓扑为:

topology { localhost; localnets; };

注意:BIND9不支持拓扑选项。

K. sortlist 语句

对一个DNS询问的响应包括形成一个资源记录集(RR)的多资源记录(RRs)。名称服务器将会以不确定的顺序返回在RRset中的RRs(参见rrset-order语句)。用户端的解答器会重新适当的排列,也就是说,使用任何在本地网上的地址优先于其他的地址。尽管如此,不是所有的解答器可以做到或者正确配置。当用户使用一个本地服务器的时候,服务器可以基于用户地址进行分类。这只要求配置名称服务器,而不是所有用户端。

sortlist语句(如下)使用一个地址匹配表甚至比拓扑语句还要特殊的解释它。每个在sortlist 的顶层语句必须自己就是一个清楚的拥有一个或两个元素的地址匹配表。每个顶级表的第一个元素(可能是一个IP地址,一个IP前缀,一个ACL名称或者一个地址匹配表)与查询源地址进行匹配检查直到找到匹配的地址。

一旦查询的源地址被匹配,如果顶级语句只包括一个元素的话,真正的匹配于源地址的原始元素就被用来选择地址,对应的转移到了响应的开始。如果语句是两个元素的表,那么第二个元素遵照拓扑语句中地址匹配表的方式进行处理。每个顶级元素被赋予一个距离和与响应的开头距离最近的地址。

在下列例子中,任何来自于任何主机地址的查询将会得到本地网上第一首选地址的响应。下一个首选地址在网段192.168.1/24上,既可以在192.168.2/24192.168.3/24网段之后。从一台在192.168.1/24网段上的主机收到的查询将会优先本网段和192.168.2/24192.168.3/24网。而来自192.168.4/24192.168.5/24上主机的查询将只优先直连的网段。

sortlist {

{ localhost; //IF 主机名

{ localnets;

192.168.1/24; //THEN 在下列网中最适合

{ 192.168.2/24; 192.168.3/24; }; }; }; //IF C192.168.1

{ 192.168.1/24; //THEN 使用.1, .2 .3

{ 192.168.2/24; 192.168.3/24; }; }; };

{ 192.168.2/24; //IF C192.168.1

{ 192.168.2/24; //THEN使用2, .1 .3

{ 192.168.1/24; 192.168.3/24; }; }; };

{ 192.168.3/24; //IF C192.168.3

{ 192.168.1/24; 192.168.2/24; }; }; }; //THEN使用.3 .1 .2

};

};

下个例子将给出一个本地主机和直接连接到网上的主机的合理的状态(behavior)。它很象BIND4.9.x分类的地址状态。从本地主机发给查询的响应支持任何直接连接的网络,从其他直接连接网络上的主机发送给查询的响应优先在相同网段上的地址。对其他查询的响应没有分类。

sortlist {

{ localhost; localnets; };

{ localnets; };

};

L. RRset 排序

当多重记录在一个解答中被返回的时候,设定在响应中的记录顺序是很有用的.

rrset-order语句允许对在多记录响应下的记录顺序的设定。参见sortlist语句。

一个order_spec定义如下:

[ class class_name ][ type type_name ][ name "domain_name"] order ordering

如果没有设定类,默认值为ANY。如果没有设定类型,默认值为ANY。如果没有设定

名称,默认值为*”。

合法的排序值是:

fixed:记录以它们在域文件中的顺序

random:记录以随机顺序被返回

cyclic:记录以环顺序被返回

例如:

rrset-order {

class IN type A name "host.example.com" order random;

order cyclic;

};

将会使得任何处于IN类中的A类记录的响应以随机顺序返回,IN 类以"host.example.com"为后缀。其他的记录以循环记录被返回。

如果多重rrset-order语句出现,它们并不组合在一起,只适用于最后一个条。

注意:rrset-order语句不被BIND9支持,BIND9目前只支持"random-cyclic"排序,服务器随机选择RRset集中的开始点,有顺序返回在那个点开始的记录。如果需要的话围绕RRset

结尾。

M. 合成的IPV6响应

许多现存的子域解答器支持ipv6DNS查询(定义在RFC1986 中,使用AAAA 记录进行前向查询和ip6.int域中的”nibble labels”进行反向查询)但是不支持RFC2874-style 查询(使用A6记录和在ip6.arpa 中的二进制标签)对于那些希望继续使用子域解答器而不是转到

BIND9 lightweight 解答器的人来说,BIND 9提供一种自动把RFC1886-型查询转换成

RFC2874-型查询的方法。返回合成的AAAAPTR记录。

这个性质默认下是无效的,可以在分用户基础上添加一个allow-v6-synthesis

{ address_match_list };子句到选项或者视图语句中。当它被激活时,递归AAAA查询使服

务器先进行A6查询,如果失败,执行AAAA查询。不管哪个成功,结果都作为一个合成的AAAA 记录返回。

类似的,在ip6.int中的递归PTR查询将会促使一个ip6.arpa查询使用二进制标签,如果失败,执行另一个在ip6.int中的查询,结果将会以在ip6.int中的合成PTR记录返回。合成记录的TTL 0值。合成响应的DNSSEC确认当前并不被支持;也没有了AD标记。

注:allow-v6-synthesis仅为提供了递归服务的用户执行。

N. 调谐

lame-ttl

设定缓存有问题服务器指示的秒数。0使不缓存(不被推荐)。默认值600(10 分钟)。最大值1800(30 分钟)

max-ncache-ttl

为降低网络流量和提升服务器存储否定回答的性能。max-ncache-ttl以秒为单位设定这些回答的保存时间。默认max-ncache-ttl10800(3小时)max-ncache-ttl不能超过7天,如果设成一个更大的值,则将会被自动减为7天。

max-cache-ttl

max-cache-ttl设定了服务器储存普通(肯定)答案的最大时间。默认值一周(7 )

min-roots

一个请求要求的最小的根服务器数量。默认为2

注意:不被BIND9 支持

sig-validity-interval

设定未来作为动态更新结果的自动生成的DNSSEC信号过期的天数。默认是30天。信号的初始时间无条件设为在当前时间的前一个小时,以允许一个有限的时钟偏差。

min-refresh-time

max-refresh-time

min-retry-time

max-retry-time

这些选项控制了服务器在更新一个域(询问SOA变化)或者重试失败的传输时的状态。通常域的SOA(但是这些值是由主服务器设定的)几乎不给此级服务器管理者对它们内容的控制。

这些选项允许管理者为每域,每个视图或者全局设定一个最小或者最大更新和重试时间。这些选项对于此级和根域是有效的并且设定SOA更新和重试时间。

O. 统计文件

BIND9产生的统计文件和由BIND8产生的类似,但不完全一样。

一个统计数据开始于行+++ Statistics Dump +++ (973798949),这里出现的数字是一个标准UNIX型的时间戳,从197011日开始以秒计。紧跟这行的是一系列行,包括一个

记数器类型,记数器值,任意的域名和任意的视图名,没有所列的视图和域的行是整个服务器的整体统计。具有域和视图的行以给定的视图和域命名(对默认的视图来说视图名缺省)

这个统计数据以行--- Statistics Dump ---(973798949)结束,在这数字是和开始行的数字一样的。Success对服务器或者域做出的成功查询。定义一个成功查询是查询返回非错误响应而不是返回推荐响应。

Referral:导致推荐响应查询

Nxrrset:导致没有数据的非错误查询的响应

Nxdomain:导致NXDOMAIN 的查询数量

Recursion:使服务器运行递归以找出最后答案的查询数量

Failure:导致失败的查询数量

作者:忙碌的柴少 分类:DNS服务器 浏览:3717 评论:0
留言列表
发表评论
来宾的头像