分类: Bind

  • prometheus bind_exporter

    prometheus bind_exporter

    named.conf

    [root@aikaiyuan ~]# cat /etc/named.conf | more
    
    statistics-channels {
        inet 127.0.0.1 port 58053 allow { 127.0.0.1; };
    };
    

    bind_exporter

    https://github.com/prometheus-community/bind_exporter/releases

    [root@aikaiyuan ~]# wget https://github.com/prometheus-community/bind_exporter/releases/download/v0.3.0/bind_exporter-0.3.0.linux-amd64.tar.gz
    [root@aikaiyuan ~]# tar zxvf bind_exporter-0.3.0.linux-amd64.tar.gz
    [root@aikaiyuan ~]# cd bind_exporter-0.3.0.linux-amd64/
    [root@aikaiyuan bind_exporter-0.3.0.linux-amd64]#  ./bind_exporter -bind.stats-url="http://127.0.0.1:58053/" -web.listen-address="192.168.1.3:59100"
    
    • -bind.stats-url=”http://127.0.0.1:58053/” 指向 named.conf statistics-channels
    • -web.listen-address=”192.168.1.3:59100″ 监听本地端口, 由 Prometheus 调用

    Make sure BIND was built with libxml2 support. You can check with the following command: named -V | grep libxml2.

    Prometheus

    https://grafana.com/grafana/dashboards/12309

    [root@aikaiyuan ~]# cat prometheus.yml
      - job_name: 'dns'
        scrape_interval: 30s
        static_configs:
        - targets:
          - 192.168.1.3:59100
          labels:
            alias: localdns
    

    转载请注明:爱开源 » prometheus bind_exporter

  • bind 空主机头 cname CNAME and other data

    CNAME and other data

    做named服务,bind原生版本编译完之后不支持空主机头的cname解析。注释掉 lib/dns/rbtdb.c 文件的

    if (rbtversion != NULL &&

    cname_and_other_data(rbtnode, rbtversion->serial))

    return (DNS_R_CNAMEANDOTHER);

    再进行编译,就可以使空主机头的cnae记录生效。

    相关文章

    转载请注明:爱开源 » bind 空主机头 cname CNAME and other data

  • bind options 详解

    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.pid。pid-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选项也可以定义在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。

    minimal-responses

    如果是yes,当产生响应的时候,服务器将只会按照需要将记录添加到authority和additional的数据部分。(例如,delegations,negative 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询问要求递归,那么服务器将会做所有能够回答查询请求的工作。如果recursion是off的,并且服务器不知道答案,它将会返回一个推荐(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系统上加载由NT或DOS系统生成的域文件。在BIND9中,UNIX”的\n”和DOS 的”\r\n”都可以正确处理为换新行,这个选项就被忽略了。

    additional-from-auth

    additional-from-cache

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

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

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

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

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

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

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

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

    match-mapped-addresses

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

    B. 转发

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

    forward

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

    forwarders

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

    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.4的1.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选项中设置的地址是同时用于UDP和TCP两种请求的,但是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-answer和many-answer。transfer-format选项使用在主域名服务器上,用来确定发送哪种格式。one-answer在每个资源记录传输中使用一个

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

    更加有效的,但只有相对比较新的辅域名服务器才支持它,如BIND9、BIND8.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地址使用在IPV4的TCP连接中。它可以选定IPV4的源地址,和可选的UDP端口,用于更新的查询和转发的动态更新。不过不做设置,它会缺省挑选一个系统中的地址(常常是最靠近远程终端服务器的接口地址)。但这个地址必须已经配置在远程终端的allow-tranfer选项中,才能进行域传送。此语句为所有的域设定了transfer-source,但如果view或zone中也使用了transfer-source语句,则全局选项中的配置就在这里失效了。

    transfer-source-v6

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

    notify-source

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

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

    notify-source-v6

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

    G. 操作系统资源限制

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

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

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

    coresize

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

    datasize

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

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

    提供DNS服务。所以,这个选项作为一种限制服务器所使用的内存量的方式就不太有效,但是它能够将操作系统设置的太小的缺省数据尺寸增大。如果要限制服务器使用的内存量,可以使用max-cache-size和recursive-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/24或192.168.3/24网段之后。从一台在192.168.1/24网段上的主机收到的查询将会优先本网段和192.168.2/24和192.168.3/24网。而来自192.168.4/24或192.168.5/24上主机的查询将只优先直连的网段。

    sortlist {

    { localhost; //IF 主机名

    { localnets;

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

    { 192.168.2/24; 192.168.3/24; }; }; }; //IF 在C类192.168.1

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

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

    { 192.168.2/24; //IF C类192.168.1

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

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

    { 192.168.3/24; //IF 在C类192.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响应

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

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

    RFC2874-型查询的方法。返回合成的AAAA和PTR记录。

    这个性质默认下是无效的,可以在分用户基础上添加一个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-ttl是10800秒(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型的时间戳,从1970年1月1日开始以秒计。紧跟这行的是一系列行,包括一个

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

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

    Referral:导致推荐响应查询

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

    Nxdomain:导致NXDOMAIN 的查询数量

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

    Failure:导致失败的查询数量

    相关文章

    转载请注明:爱开源 » bind options 详解

  • bind logging 日志详解

    在默认情况下,BIND9 把日志消息写到 /var/log/messages 文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息;而将调试日志信息写入 BIND 服务器工作目录中的 named.run 文件。
    BIND 9 的日志是可以灵活配置的,要详细记录服务器的运行状况,要在配置文件 named.conf 中使用 logging 语句来定制自己所需要的日志记录。

    BIND 日志的常用术语
    在讲述 logging 语句的语法之前,先要熟悉一些常用术语
    术语 含义
    channel(通道) 日志输出方式,如:syslog、文本文件、标准错误输出或 /dev/null
    category(类别) 日志的消息类别,如:查询消息或动态更新消息等
    module(模块) 产生消息的来源模块名称
    facility(设备) syslog 设备名
    severity(严重性) 消息的严重性等级

    logging 语句的语法
    logging 语句的语法为:
    logging {
    channel channel_name { // 定义通道
    file log_file [versions number | unlimited] [size sizespec]; | syslog optional_facility; | null; | stderr; // 定义输出方式
    severity log_severity; // 定义消息严重性
    [print-time boolean;] // 是否在消息中添加时间前缀,仅用于 file 日志
    [print-severity boolean;] // 是否在消息中添加消息严重性前缀
    [print-category boolean;] // 是否在消息中添加消息类别名前缀
    };
    category category_name { // 定义类别
    channel_name;
    ……
    };
    };
    配置日志时,首先要定义通道,然后将不同的日志类别的数据指派到指定的通道上输出。
    BIND 9 的默认配置是:
    logging {
    // 由于使用了默认通道,所以没有通道定义部分
    category “default” { “default_syslog”; “default_debug”; };
    };

    channel 语句
    channel 语句用于定义通道。指定应该向哪里发送日志数据,需要在以下四种之间则其一:
    file : 输出到纯文本文件
    log_file 指定一个文件名
    version 指定允许同时存在多少个版本的该文件,比如指定 3 个版本(version 3),就会保存 query.log、query.log0、query.log1 和query.log2。
    size 指定文件大小的上限,如果只设定了size 而没有设定 version,当文件达到指定的文件大小上限时,服务器停止写入该文件。如果设定了version,服务器会进行循环,如把 log_file 变成 log_file.log1,log_file.log1 变成 log_file.log2 等,然后建立一个新的 log_file.log 进行写入。

    syslog optional_facility :输出到 syslog,其中 optional_facility 是 syslog 的设备名,通常为以下几个:
    daemon
    local0 到 local7

    null :输出到空设备

    stderr :输出到标准错误输出,默认为屏幕

    severity 语句用于指定消息的严重性等级, log_severity 的取值为(按照严重性递减的顺序):
    critical
    error
    warning
    notice
    info
    debug [ level ]
    dynamic 是一个特殊的值,它匹配服务器当前的调试级别
    定义了某个严重性级别后,系统会记录包括该级别以及比该级别更严重的级别的所有消息。比如定义级别为 error,则会记录 critical 和error 两个级别的信息。
    对于系统管理员来说,一般记录到 info 级别就可以了。
    BIND 9 预制了如下四个默认通道;
    channel “default_syslog” {
    syslog daemon; // 发送给 syslog 的 daemon 设备
    severity info; // 只发送此 info 及其更高优先级的信息
    };
    channel “default_debug” { // 只有当服务器的 debug 级别非 0 时,才产生输出。
    file “named.run”; // 写入工作目录下的 named.run 文件
    severity dynamic; // 按照服务器当前的debug 级别记录日志
    };
    channel “default_stderr” {
    stderr; // 写到stderr
    severity info; // 只发送此 info 及其更高优先级的信息
    };
    channel “null” {
    null; // 丢弃所有发到此通道的信息
    };

    category 语句
    category 语句是指定哪一种类别的信息使用哪个或者哪几个已经定义了的通道输出。
    BIND 9 中可用的类别名(category_name)有:
    类别 说明
    client 处理客户端请求。
    config 配置文件分析和处理。
    database 同BIND内部数据库相关的消息,用来存储区数据和缓存记录。
    default 匹配所有未明确指定通道的类别。
    dnssec 处理 DNSSEC 签名的响应。
    general 包括所有未明确分类的 BIND 消息。
    lame-servers 发现错误授权,即残缺服务器。
    network 网络操作。
    notify 区更新通知消息。
    queries 查询日志
    resolver 名字解析,包括对来自解析器的递归查询信息。
    security 批准/非批准的请求。
    update 动态更新事件。
    xfer-in 从远程名字服务器到本地名字服务器的区传送。
    xfer-out 从本地名字服务器到远程名字服务器的区传送。

    例如要记录查询消息,可以在 named.conf 中添加如下配置:
    logging {
    channel query_log {
    file “query.log” versions 3 size 20m;
    severity info;
    print-time yes;
    print-category yes;
    };
    category queries {
    query_log;
    };
    };
    这样服务器会在工作目录(directory 语句所指定的目录,Ubuntu 为:/var/cache/bind)下创建 query.log 文件,并把运行过程产生的 queries 消息写如到此文件中。

    BIND 配置文件(named.conf) logging 的使用

    bind options 详解

    转载请注明:爱开源 » bind logging 日志详解

  • CDN架构以及原理分析

    在不同地域的用户访问网站的响应速度存在差异,为了提高用户访问的响应速度、优化现有Internet中信息的流动,需要在用户和服务器间加入中间层CDN. 使用户能以最快的速度,从最接近用户的地方获得所需的信息,彻底解决网络拥塞,提高响应速度,是目前大型网站使用的流行的应用方案.

    1. CDN 概述

    • CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络“边缘”的节点,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,提高用户访问网站的响应速度。cdn_overview
    • Cache层的技术,消除数据峰值访问造成的结点设备阻塞。Cache服务器具有缓存功能,所以大部分网页对象(Web page object),如html, htm, php等页面文件,gif,tif,png,bmp等图片文件,以及其他格式的文件,在有效期(TTL)内,对于重复的访问,不必从原始网站重新传送文件实体, 只需通过简单的认证(Freshness Validation)- 传送几十字节的Header,即可将本地的副本直接传送给访问者。由于缓存服务器通常部署在靠近用户端,所以能获得近似局域网的响应速度,并有效减少广域带宽的消耗。不仅能提高响应速度,节约带宽,对于加速Web服务器,有效减轻源服务器的负载是非常有效的。
    • 根据加速对象不同,分为 客户端加速 和 服务器加速

    • 客户端加速 : Cache部署在网络出口处,把常访问的内容缓存在本地,提高响应速度和节约带宽;

    • 服务器加速 : Cache部署在服务器前端,作为Web服务器的代理缓存机,提高Web服务器的性能,加速访问速度
      如果多台Cache加速服务器且分布在不同地域,需要通过有效地机制管理Cache网络,引导用户就近访问(比如通过DNS引导用户),全局负载均衡流量,这是CDN内容传输网络的基本思想.
    • CDN对网络的优化作用主要体现在如下几个方面 – 解决服务器端的“第一公里”问题 – 缓解甚至消除了不同运营商之间互联的瓶颈造成的影响 – 减轻了各省的出口带宽压力 – 缓解了骨干网的压力 – 优化了网上热点内容的分布

    2. CDN 的工作原理

    2.1. 传统访问过程(未加速缓存服务)

    我们先看传统的未加缓存服务的访问过程,以便了解CDN缓存访问方式与未加缓存访问方式的差别:

    normal

    由上图可见,用户访问未使用CDN缓存网站的过程为:

    1. 用户输入访问的域名,操作系统向 LocalDns 查询域名的ip地址.
    2. LocalDnsROOT DNS 查询域名的授权服务器(这里假设LocalDns缓存过期)
    3. ROOT DNS将域名授权dns记录回应给 LocalDns
    4. LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址
    5. 域名授权dns 查询域名记录后,回应给 LocalDns
    6. LocalDns 将得到的域名ip地址,回应给 用户端
    7. 用户得到域名ip地址后,访问站点服务器
    8. 站点服务器应答请求,将内容返回给客户端.

    2.2. CDN访问过程(使用缓存服务)

    CDN网络是在用户和服务器之间增加Cache层,主要是通过接管DNS实现,将用户的请求引导到Cache上获得源服务器的数据
    下面让我们看看访问使用CDN缓存后的网站的过程:

    cdn

    通过上图,我们可以了解到,使用了CDN缓存后的网站的访问过程变为:

    1. 用户输入访问的域名,操作系统向 LocalDns 查询域名的ip地址.
    2. LocalDnsROOT DNS 查询域名的授权服务器(这里假设LocalDns缓存过期)
    3. ROOT DNS将域名授权dns记录回应给 LocalDns
    4. LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址
    5. 域名授权dns 查询域名记录后(一般是CNAME),回应给 LocalDns
    6. LocalDns 得到域名记录后,向智能调度DNS查询域名的ip地址
    7. 智能调度DNS 根据一定的算法和策略(比如静态拓扑,容量等),将最适合的CDN节点ip地址回应给 LocalDns
    8. LocalDns 将得到的域名ip地址,回应给 用户端
    9. 用户得到域名ip地址后,访问站点服务器
    10. CDN节点服务器应答请求,将内容返回给客户端.(缓存服务器一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程)

    通过以上的分析我们可以得到,为了实现对普通用户透明(使用缓存后用户客户端无需进行任何设置)访问,需要使用DNS(域名解析)来引导用户来访问Cache服务器,以实现透明的加速服务. 由于用户访问网站的第一步就是 域名解析 ,所以通过修改dns来引导用户访问是最简单有效的方式.

    2.3. CDN网络的组成要素

    对于普通的Internet用户,每个CDN节点就相当于一个放置在它周围的网站服务器.
    通过对dns的接管,用户的请求被透明地指向离他最近的节点,节点中CDN服务器会像网站的原始服务器一样,响应用户的请求.
    由于它离用户更近,因而响应时间必然更快.

    从上面图中 虚线圈起来的那块,就是CDN层,这层是位于 用户端 和 站点服务器之间.

    • 智能调度DNS(比如f5的3DNS)智能调度DNS是CDN服务中的关键系统.当用户访问加入CDN服务的网站时,域名解析请求将最终由 智能调度DNS 负责处理.
      它通过一组预先定义好的策略,将当时最接近用户的节点地址提供给用户,使用户可以得到快速的服务.
      同时它需要与分布在各地的CDN节点保持通信,跟踪各节点的健康状态,容量等,确保将用户的请求分配到就近可用的节点上.
    • 缓存功能服务

    • 负载均衡设备(如lvs,F5的BIG/IP)

    • 内容Cache服务器(如squid)
    • 共享存储(根据缓存数据量多少决定是否需要)

    3. CDN 智能调度Dns 实例分析

    • 分析img.alibaba.com域名在系统中,执行dig命令,输出如下:
      “`
      #dig img.alibaba.com

      ; 部分省略

      ;; QUESTION SECTION:
      ;img.alibaba.com. IN A

      ;; ANSWER SECTION:
      img.alibaba.com. 600 IN CNAME img.alibaba.com.edgesuite.net.
      img.alibaba.com.edgesuite.net. 7191 IN CNAME img.alibaba.com.georedirector.akadns.net.
      img.alibaba.com.georedirector.akadns.net. 3592 IN CNAME a1366.g.akamai.net.
      a1366.g.akamai.net. 12 IN A 204.203.18.145
      a1366.g.akamai.net. 12 IN A 204.203.18.160

      ; 部分省略
      从上面查询结果可以看出 img.alibaba.com. CNAME img.alibaba.com.edgesuite.net. 后面的CNAME是由 Akamai(CDN服务商) 去跳转到 智能调度器上的.
      - 分析[www.discovery.com](http://www.discovery.com/)域名在系统中,继续执行dig命令,输出如下:

      dig www.discovery.com

      ; 部分省略

      ;; QUESTION SECTION:
      ;www.discovery.com. IN A

      ;; ANSWER SECTION:
      www.discovery.com. 1077 IN CNAME www.discovery.com.edgesuite.net.
      www.discovery.com.edgesuite.net. 21477 IN CNAME a212.g.akamai.net.
      a212.g.akamai.net. 20 IN A 204.203.18.154
      a212.g.akamai.net. 20 IN A 204.203.18.147

      ; 部分省略
      “`
      从上面查询结果可以看出 www.discovery.com. IN CNAME www.discovery.com.edgesuite.net. 后面的CNAME是由 Akamai(CDN服务商) 去跳转到 智能调度器上的.总结:一般来说,网站需要使用到CDN服务时,一般都是将需要加速访问的域名 CNAME到 CDN服务商的域名上.
      缓存服务和调度功能都是由服务商来完成.

    4. CDN的 智能调度Dns 简化实现

    4.1. 调度策略说明

    在用户请求解析域名的时候,智能DNS判断用户的LocalDns的IP,然后跟DNS服务器内部的IP表范围匹配一下,看看用户是电信还是网通用户,然后给用户返回对应的IP地址
    这里使用的是静态拓扑的方法,只是判断LocalDns的IP.要想使用更复杂的调度算法可以考虑商业产品,如F5的3DNS.

    4.2. 假设CDN节点规划

    在这里我们将使用 BIND 的View功能来实现运营商的区分,假设我们在每个运营商的机房都放有一个CDN节点,列表如下:

    域名 运营商(view) 服务地址
    www.cdntest.com 网通(CNC) 192.168.0.1
    www.cdntest.com 电信(TELECOM) 192.168.0.2
    www.cdntest.com 教育网(EDU) 192.168.0.3
    www.cdntest.com 默认(ANY) 192.168.0.4

    4.3. bind view 配置

    • 以下是named.conf配置文件的部分截取,只是涉及到 View 的部分,其他细节可参考互联网.
      “`
      acl “cnc_iprange”{ //定义ip范围(网通)
      192.168.1.0/24;
      192.168.2.0/24;
      //此处只是示例,其他省略
      };

      acl “tel_iprange”{ //定义ip范围(电信)
      192.168.3.0/24;
      192.168.4.0/24;
      //其他省略
      };

      acl “edu_iprange”{ //定义ip范围(教育网)
      192.168.5.0/24;
      192.168.6.0/24;
      //其他省略
      };

      acl “default_iprange”{ //定义ip范围(默认)
      192.168.7.0/24;
      192.168.8.0/24;
      //其他省略
      };

      view “CNC” {
      Match-clients{cnc_iprange};
      zone “.” IN {
      type hint;
      file “named.root”;
      };

      zone "localhost" IN {
              type master;
              file "localhost.zone";
              allow-update { none; };
      };
      
      zone "cdntest.com" IN {
              type master;
              file "cnc_cdntest.zone";
      };
      

      };

      view “TEL” {
      Match-clients{tel_iprange};
      zone “.” IN {
      type hint;
      file “named.root”;
      };

      zone "localhost" IN {
              type master;
              file "localhost.zone";
              allow-update { none; };
      };
      
      zone "cdntest.com" IN {
              type master;
              file "tel_cdntest.zone";
      };
      

      };

      view “EDU” {
      Match-clients{edu_iprange};
      zone “.” IN {
      type hint;
      file “named.root”;
      };

      zone "localhost" IN {
              type master;
              file "localhost.zone";
              allow-update { none; };
      };
      
      zone "cdntest.com" IN {
              type master;
              file "edu_cdntest.zone";
      };
      

      };

      view “DEFAULT” {
      Match-clients{default_iprange};
      zone “.” IN {
      type hint;
      file “named.root”;
      };

      zone "localhost" IN {
              type master;
              file "localhost.zone";
              allow-update { none; };
      };
      
      zone "cdntest.com" IN {
              type master;
              file "default_cdntest.zone";
      };
      

      };
      “`
      – zone文件的配置说明这4个zone配置文件(cnc_cdntest.zone,tel_cdntest.zone,edu_cdntest.zone,default_cdntest.zone)中,只有www.cndtest.com的A记录不一样,其他的都是一样.

    域名 zone配置文件 A记录地址
    www.cdntest.com cnc_cdntest.zone 192.168.0.1
    www.cdntest.com tel_cdntest.zone 192.168.0.2
    www.cdntest.com edu_cdntest.zone 192.168.0.3
    www.cdntest.com default_cdntest.zone 192.168.0.4

    以上只列出了 www.cdntest.com 的A记录地址,其他关于zone的语法 请参考互联网.

    • 域名解析流程简要说明
    1. 用户向 LocalDns 查询域名 www.cdntest.com
    2. LocalDns 向 授权DNS 查询www.cdntest.com
    3. 授权DNS 判断用户使用的 LocalDns的ip地址,匹配上述设置的ip范围,如果范围在网通,就将网通对应的ip地址(192.168.0.1),回应给LocalDns(其他依此类推)
    4. LocalDns 将得到的域名ip地址,回应给 用户端 (域名解析完成)说明:再此过程中,我们简化了主DNS智能DNS 之间的CNAME过程(为了简要说明问题).
      这里使用的是静态拓扑(根据ip范围)的方法,也称为地域化方法,只是判断LocalDns的IP.
    • 此简化方案中的存在的问题
    1. 如果用户设置错误的dns,可能会导致用户访问比原来慢(比如网通用户设置了电信的DNS)
    2. 不能判断CDN节点服务器的健康状态和容量状态,可能会把用户定向到不可用的CDN节点
    3. 由于静态拓扑方法,可能存在用户访问的CDN节点不是最优化和最快的
    4. …..可能还有其他想不到的….

    5. 总结(Summary)

    在建立CDN网路时,最关键的就是 智能调度DNS,这个是CND网络总协调,通过高效的调度算法,可以使用户得到最佳的访问体验.
    其次就是 CND节点的管理,比如涉及到 内容的同步机制,配置文件的更新等等,都需要有一套机制来保证.
    当然在大型网站中,也要考建设CDN体系的成本和回报率.

    转载请注明:爱开源 » CDN架构以及原理分析

  • HTTP/HTTPS自动加密反向代理方案

    这里主要介绍电脑无需任何设置,就能够自动加密代理特定网站的HTTP/HTTPS协议。由于某墙的存在,作用你懂的。敏感磁太多,这里就不多说了。

    方案介绍

    涉及到的软件

    • BIND: 一个流行的域名解析服务器,我们可以设置哪些域名需要走加密线路。
    • Stunnel: 使用TLS对tcp协议进行加密,也就是对tcp建立一条加密线路。
    • SNI Proxy: 代理软件。对于HTTP协议,它可以根据Host请求头解析得出目标站IP;对于HTTPS协议,它可以根据SNI扩展中的域名解析得出目标站IP。

    此方案优缺点

    优点:
    无需手动设置任何代理,就能够自动加密代理特定网站的HTTP或HTTPS协议
    相对于我们常用的ssh隧道,ssh隧道是单路,而此方案是支持多并发连接,可以极大加速网站访问。

    缺点:
    对于代理HTTPS协议,需要发起HTTPS连接的客户端,比如浏览器支持TLS的SNI扩展。好消息是目前浏览器几乎都支持此扩展,但对于一些非浏览器的客户端,不支持SNI扩展。我们只能设置正向代理来解决此问题。

    方案原理

    流程图:
    %E5%8A%A0%E5%AF%86%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86

    原理介绍:

    • 1、首先我们需要准备三台服务器,一台是内网DNS服务器(安装bind),一台是内网代理服务器(安装stunnel),另一台国外服务器(安装stunnel,sniproxy)。
    • 2、我们还需要设置DNS为内网的DNS,并在内网bind dns设置谷歌域名解析的IP为内网代理服务器
    • 3、当我们访问谷歌网站时,首先会向内网DNS服务器发送DNS A记录查询,此时内网DNS服务器会返回内网代理服务器的IP。
    • 4、浏览器得到谷歌域名的解析IP后(即内网代理服务器的IP),会向内网代理服务器发送HTTP或HTTPS请求。
    • 5、此时内网代理服务器(即stunnel),会接收到请求,经过加密,把请求转发到国外服务器(stunnel)的指定端口上。
    • 6、国外服务器(stunnel)接收到来自国内服务器(stunnel)的加密数据后,经过解密,把请求转发到sniproxy。
    • 7、sniproxy再根据HTTP Host请求头或者HTTPS sni扩展的域名解析出谷歌服务器的IP,并把请求转发给谷歌服务器。
    • 8、谷歌服务器收到来自sniproxy发送的请求后,马上返回网页内容给sniproxy,sniproxy再原路返回数据给浏览器。

    方案实施

    由于时间有限,我们仅在Ubuntu server 12.04演示安装。

    环境介绍

    • 系统:Ubuntu server 12.04
    • 内网DNS IP: 10.96.153.201(主),10.96.153.204(从)
    • 内网代理服务器: 10.96.153.204
    • 国外服务器IP: 1.2.3.4

    安装BIND9

    1、在主DNS和从DNS安装bind,即10.96.153.201(主),10.96.153.204(从)。

    wget http://www.isc.org/downloads/file/bind-9-10-0b1-2/?version=tar.gz -O bind-9-10-0b1-2.tar.gz
    tar xzf bind-9-10-0b1-2.tar.gz
    cd bind-9-10-0b1-2
    ./configure --prefix=/usr/local/bind
    make && make install
    

    2、配置主DNS服务器(10.96.153.201)
    2.1、生成/usr/local/bind/etc/rndc.key密钥文件

    /usr/local/bind/sbin/rndc-confgen -a -k rndckey -c /usr/local/bind/etc/rndc.key
    

    2.2、编辑/usr/local/bind/etc/named.conf,写入如何内容:

    include "/usr/local/bind/etc/rndc.key";
    controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndckey"; }; };
    logging {
    channel default_syslog { syslog local2; severity notice; };
    channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
    category default { default_syslog; };
    category general { default_syslog; };
    category security { audit_log; default_syslog; };
    category config { default_syslog; };
    category resolver { audit_log; };
    category xfer-in { audit_log; };
    category xfer-out { audit_log; };
    category notify { audit_log; };
    category client { audit_log; };
    category network { audit_log; };
    category update { audit_log; };
    category queries { audit_log; };
    category lame-servers { audit_log; };
    };
    options {
        directory "/usr/local/bind/etc";
    pid-file "/usr/local/bind/var/run/bind.pid";
    transfer-format many-answers;
    interface-interval 0;
    forward only;
    forwarders { 202.96.128.166;202.96.134.133; };
    allow-query {any;};
    };
    zone "google.com" {
    type master;
    file "google.com.zone";
    allow-transfer { 10.96.153.204; };
    };
    

    在这个named.conf文件中,我们只需要关心如下内容:
    对于options{}区域,202.96.128.166和202.96.134.133这两个是ISP提供的本地DNS,需要修改为自己所在ISP的本地DNS。
    对于zone “google.com”{}区域,这里定义了google.com域名的区域文件google.com.zone,还有允许10.96.153.204(即从DNS)同步区域文件。
    2.3、建立google.com.zone区域文件

    $TTL 3600
    @ IN SOA ns1.google.com. hostmaster.google.com. (
    2014072015  ; Serial
    3600    ; Refresh
    900 ; Retry
    3600000 ; Expire
    3600 )  ; Minimum
    @ IN NS ns1.google.com.
    @ IN NS ns2.google.com.
    ns1 IN A 10.96.153.201
    ns2 IN A 10.96.153.204
    @ IN A 10.96.153.204
    * IN A 10.96.153.204
    

    对于这个区域文件,
    ns1 IN A 10.96.153.201 指向第一个dns服务器,即主DNS。
    ns2 IN A 10.96.153.204 指向第二个dns服务器,即从DNS。
    @ IN A 10.96.153.204和* IN A 10.96.153.204指向内网的代理服务器(stunnel)。我们只需要修改这三个地方就好了。

    3、配置从DNS服务器(10.96.153.204)
    编辑named.conf,写入如下内容

    logging {
    channel default_syslog { syslog local2; severity notice; };
    channel audit_log { file "/var/log/bind.log"; severity notice; print-time yes; };
    category default { default_syslog; };
    category general { default_syslog; };
    category security { audit_log; default_syslog; };
    category config { default_syslog; };
    category resolver { audit_log; };
    category xfer-in { audit_log; };
    category xfer-out { audit_log; };
    category notify { audit_log; };
    category client { audit_log; };
    category network { audit_log; };
    category update { audit_log; };
    category queries { audit_log; };
    category lame-servers { audit_log; };
    };
    options {
        directory "/usr/local/bind/etc";
    pid-file "/usr/local/bind/var/run/bind.pid";
    transfer-format many-answers;
    interface-interval 0;
    forward only;
    forwarders { 202.96.128.166;202.96.134.133; };
    allow-query {any;};
    };
    
    zone "google.com" {
    type slave;
    file "google.com.zone";
    masters { 10.96.153.201; };
    };
    

    配置从DNS就简单得多,只需要写入如上内容到named.conf文件。同样的,
    options{}中202.96.128.166和202.96.134.133这两个是当地ISP本地dns。
    zone “google.com”{}中10.96.153.201指明主DNS服务器IP。
    4、启动bind dns服务器

    /usr/local/bind/sbin/named
    

    安装Stunnel

    1、在内网代理服务器和国外主机安装stunnel

    apt-get install stunnel4
    

    2、内网代理服务器stunnel配置
    编辑/etc/default/stunnel4,设置ENABLED=1。
    编辑/etc/stunnel/stunnel.conf,内容如下:

    client = yes
    pid = /etc/stunnel/stunnel.pid
    [http]
    accept = 80
    connect = 1.2.3.4:8082
    
    [https]
    accept = 443
    connect = 1.2.3.4:4433
    

    此配置文件表示,监听了80端口,并把此端口流量转发到1.2.3.4:8082,监听了443端口,并把此端口流量转发到1.2.3.4:4433
    3、国外服务器stunnel配置
    3.1、生成ssl证书stunnel.pem文件

    openssl genrsa -out key.pem 2048
    openssl req -new -x509 -key key.pem -out cert.pem -days 1095
    cat key.pem cert.pem >> /etc/stunnel/stunnel.pem
    

    3.2、编辑/etc/stunnel/stunnel.conf文件

    client = no
    [http]
    accept = 1.2.3.4:8082
    connect = 127.0.0.1:8082
    cert = /etc/stunnel/stunnel.pem
    
    [https]
    accept = 1.2.3.4:4433
    connect = 127.0.0.1:4433
    cert = /etc/stunnel/stunnel.pem
    

    此配置文件表示,监听了1.2.3.4:8082,并转发此地址流量到127.0.0.1:8082,监听了1.2.3.4:4433,并转发给地址流量到127.0.0.1:4433。
    3.3、编辑/etc/default/stunnel4,设置ENABLED=1。
    4、启动stunnel

    service stunnel4 start
    

    安装sniproxy

    sniproxy项目地址:https://github.com/dlundquist/sniproxy
    1、安装sniproxy
    同样只演示在ubuntu server 12.04安装。
    1.1、安装UDNS

    mkdir udns_packaging
    cd udns_packaging
    wget http://archive.ubuntu.com/ubuntu/pool/universe/u/udns/udns_0.4-1.dsc
    wget http://archive.ubuntu.com/ubuntu/pool/universe/u/udns/udns_0.4.orig.tar.gz
    wget http://archive.ubuntu.com/ubuntu/pool/universe/u/udns/udns_0.4-1.debian.tar.gz
    tar xfz udns_0.4.orig.tar.gz
    cd udns-0.4/
    tar xfz ../udns_0.4-1.debian.tar.gz
    dpkg-buildpackage
    cd ..
    dpkg -i *.deb
    

    1.2、安装sniproxy

    apt-get install autotools-dev cdbs debhelper dh-autoreconf dpkg-dev gettext libev-dev libpcre3-dev libudns-dev pkg-config
    wget https://github.com/dlundquist/sniproxy/archive/master.zip
    unzip master.zip
    cd sniproxy-master/
    dpkg-buildpackage
    cd ..
    dpkg -i *.deb
    

    2、配置sniproxy
    /etc/sniproxy.conf内容如下:

    user daemon
    pidfile /var/run/sniproxy.pid
    error_log {
        syslog deamon
        priority notice
    }
    listen 127.0.0.1:8082 {
        proto http
        table http_hosts
    }
    table http_hosts {
            .*      *:80
    }
    
    listen 127.0.0.1:4433 {
        proto tls
        table https_hosts
    }
    table https_hosts {
    .*  *:443
    }
    

    此配置文件表示,监听了127.0.0.1:8082地址,并解析http协议中的Host请求头为IP,然后转发请求到此IP;监听了127.0.0.1:4433地址,并解析TLS中SNI扩展中的域名为IP,并转发请求到此IP。
    3、启动sniproxy

    sniproxy
    

    结束

    到目前为止,我们已经搭建完成了整套HTTP/HTTPS加密代理方案。方案中的HTTP明文协议,利用stunnel使用了TLS加密,变成了HTTPS协议,使得数据包无法被解析出明文。方案中的HTTPS协议,本身是加密的,但为了防止SNI扩展的中域名被嗅探,还是走了stunnel的加密通道。对于发送HTTPS请求而不支持SNI扩展的客户端,需要手动设置下代理。下一篇博文我们来介绍加密的正向代理方案。

    转载请注明:爱开源 » HTTP/HTTPS自动加密反向代理方案

  • BIND 配置文件(named.conf) logging 的使用

    1.明白 channels 和 categories.

    Channel:说明日志去往哪里,syslog,file,stderr,null.

    五种日志等级(critical, error, warning, notice, and info)这五种类似于syslog。

    还有其他两种(debug,dynamic)为BIND 8 和 9 所有.

    Category:对日志的分类存放,如对查询的日志专门存放到一个文件(应先开启rndc querylog)

    2.Logging 的语法如下

    logging {

    [ channel channel_name {
    ( file path_name
    [ versions ( number | unlimited ) ]
    [ size size_spec ]
    | syslog ( kern | user | mail | daemon | auth | syslog | lpr |
    news | uucp | cron | authpriv | ftp |
    local0 | local1 | local2 | local3 |
    local4 | local5 | local6 | local7 )
    | stderr
    | null );

    [ severity ( critical | error | warning | notice |
    info | debug [ level ] | dynamic ); ]
    [ print-category yes or no; ]
    [ print-severity yes or no; ]
    [ print-time yes or no; ]
    }; ]

    [ category category_name {
    channel_name; [ channel_name; … ]
    }; ]

    };

    3.我的 logging 模板

    logging {
    channel default_debug {
    file “data/named.run”;
    severity dynamic;
    };
    channel my_syslog {
    syslog daemon;
    severity info;
    };
    category statistics { default_debug;my_syslog; };
    category queries { default_debug; };
    };

    转载请注明:爱开源 » BIND 配置文件(named.conf) logging 的使用

  • DNS bind 主从服务搭建

    最近研究DNS主从服务,也是参考了很多文章,这里记录一下,方便大家少走弯路,DNS服务可以算是Linux服务中比较难的一个了,尤其是配置文件书写,少一个字符都有可能造成错误。

    那什么是DNS呢?简单的说就是完成域名到IP的解析过程。简洁的域名能让人们更方便记忆,不需要记那么长的IP访问某一个网站。
    DNS解析过程到底是怎样的呢?
    第一步:客户机访问某个网站,请求域名解析,首先查找本地HOST文件,如果有对应域名、IP记录,直接返回给客户机。如果没有则将该请求发送给本地的域名服务器:
    第二步:本地DNS服务器能够解析客户端发来的请求,服务器直接将答案返回给客户机。
    第三步:本地DNS服务器不能解析客户端发来的请求,分为两种解析方法
    1、采用递归解析:本地DNS服务器向根域名服务器发出请求,根域名服务器对本地域名服务的请求进行解析,得到记录再给本地DNS服务器,本地DNS服务器将记录缓存,并将记录返给客户机。
    2、采用迭代解析:本地DNS服务器向根域名服务器发出请求,根域名服务器返回给本地域名服务器一个能够解析请求的根的下一级域名服务器的地址,本地域名服务器在向根返回的IP地址发出请求,最终得到域名解析记录。
    如上只是简单介绍了一下DNS相关知识,言归正传,如下通过脚本自动安装并添加域名解析,脚本可以根据自己的需求修改:(脚本适用于CentOS x86_64 5.8系列)

    #!/bin/sh
    #auto install config bind server
    #wugk 2013-08-28
    #定义变量
    BND_ETC=/var/named/chroot/etc
    BND_VAR=/var/named/chroot/var/named
    BAK_DIR=/data/backup/dns_`date +%Y%m%d-%H%M`
    ##Backup named server
    if
    [ ! -d $BAK_DIR ];then
    echo “Please waiting Backup Named Config …………”
    mkdir -p $BAK_DIR
    cp -a /var/named/chroot/{etc,var} $BAK_DIR
    cp -a /etc/named.* $BAK_DIR
    fi
    ##Define Shell Install Function
    Install ()
    {
    if
    [ ! -e /etc/init.d/named ];then
    rpm -e –nodeps bind-utils
    rpm -e –nodeps bind-libs
    rpm -e –nodeps bind
    rpm -e bind-chroot
    rpm -e caching-nameserver
    rpm -ivh –nodeps bind-9.3.6-20.P1.el5_8.6.x86_64.rpm bind-chroot-9.3.6-20.P1.el5_8.6.x86_64.rpm bind-libs-9.3.6-20.P1.el5_8.6.x86_64.rpm bind-utils-9.3.6-20.P1.el5_8.6.x86_64.rpm caching-nameserver-9.3.6-20.P1.el5_8.6.x86_64.rpm
    
    else
    echo ————————————————-
    echo “The Named Server is exists ,Please exit ………”
    sleep 1
    fi
    }
    ##Define Shell Init Function
    Init_Config ()
    {
    cd $BND_ETC ;ls ./*
    cp -p named.caching-nameserver.conf named.conf
    sed -i -e ”s/localhost;/any;/g” -e ”/port/s/127.0.0.1/any/g” named.conf
    echo ————————————————-
    sleep 2
    echo “The named.conf config Init success !”
    }
    ##Define Shell Add Name Function
    Add_named ()
    {
    ##DNS name
    read -p “Please Insert Into Your Add Name ,Example 51cto.com :” NAME
    echo $NAME |grep -E “com|cn|net|org”
    
    while
    [ "$?" -ne 0 ]
    
    do
    read -p “Please reInsert Into Your Add Name ,Example 51cto.com :” NAME
    echo $NAME |grep -E “com|cn|net|org”
    
    done
    ## IP address
    read -p “Please Insert Into Your Name Server IP ADDress:” IP
    echo $IP |egrep -o “([0-9]{1,3}\.){3}[0-9]{1,3}”
    while
    [ "$?" -ne "0" ]
    
    do
    read -p “Please reInsert Into Your Name Server IP ADDress:” IP
    echo $IP |egrep -o “([0-9]{1,3}\.){3}[0-9]{1,3}”
    done
    ARPA_IP=`echo $IP|awk -F. ”{print $3″.”$2″.”$1}”`
    ARPA_IP1=`echo $IP|awk -F. ”{print $4}”`
    cd $BND_ETC
    grep “$NAME” named.rfc1912.zones
    
    if
    [ $? -eq 0 ];then
    echo “The $NAME IS exist named.rfc1912.zones conf ,please exit …”
    exit
    else
    read -p “Please Insert Into SLAVE Name Server IP ADDress:” SLAVE
    
    echo $SLAVE |egrep -o “([0-9]{1,3}\.){3}[0-9]{1,3}”
    while
    
    [ "$?" -ne "0" ]
    do
    read -p “Please Insert Into SLAVE Name Server IP ADDress:” SLAVE
    echo $SLAVE |egrep -o “([0-9]{1,3}\.){3}[0-9]{1,3}”
    done
    grep “rev” named.rfc1912.zones
    
    if
    [ $? -ne 0 ];then
    cat />;/>;named.rfc1912.zones <;/>;named.rfc1912.zones <;$NAME.zone <;/>;/dev/null
    
    if
    [ $? -ne 0 ];then
    cat />;/>;$ARPA_IP.rev <;/>;$NAME.zone
    echo “$ARPA_IP3 IN PTR $HOST.$NAME.” />;/>;$ARPA_IP.rev
    
    [ $? -eq 0 ]; echo -e “The $NAME config success:
    $HOST IN A $IP_HOST
    $ARPA_IP3 IN PTR $HOST.$NAME.”
    else
    
    sed -i “9a IN NS $NAME.” $REV
    echo “$HOST IN A $IP_HOST” />;/>;$NAME.zone
    echo “$ARPA_IP3 IN PTR $HOST.$NAME.” />;/>;$REV
    
    [ $? -eq 0 ]; echo -e “The $NAME config success1:
    $HOST IN A $IP_HOST
    $ARPA_IP3 IN PTR $HOST.$NAME.”
    fi
    }
    ##Define Shell List A Function
    Add_A_List ()
    {
    if
    cd $BND_VAR
    REV=`ls *.rev`
    read -p “Please Insert Into Your Add Name ,Example 51cto.com :” NAME
    [ ! -e "$NAME.zone" ];then
    echo “The $NAME.zone File is not exist ,Please ADD $NAME.zone File :”
    Add_named ;
    else
    
    read -p “Please Enter List Name A NS File ,Example /tmp/name_list.txt: ” FILE
    if
    
    [ -e $FILE ];then
    
    for i in `cat $FILE|awk ”{print $2}”|sed “s/$NAME//g”|sed ”s/\.$//g”`
    #for i in `cat $FILE|awk ”{print $1}”|sed “s/$NAME//g”|sed ”s/\.$//g”`
    do
    j=`awk -v I=”$i.$NAME” ”{if(I==$2)print $1}” $FILE`
    
    echo ———————————————————–
    echo “The $NAME.zone File is exist ,Please Enter insert NAME HOST ….”
    sleep 1
    ARPA_IP=`echo $j|awk -F. ”{print $3″.”$2″.”$1}”`
    ARPA_IP2=`echo $j|awk -F. ”{print $4}”`
    echo “$i IN A $j” />;/>;$NAME.zone
    echo “$ARPA_IP2 IN PTR $i.$NAME.” />;/>;$REV
    [ $? -eq 0 ]; echo -e “The $NAME config success:
    $i IN A $j
    $ARPA_IP2 IN PTR $i.$NAME.”
    done
    
    else
    
    echo “The $FILE List File IS Not Exist …….,Please exit …”
    
    fi
    fi
    }
    ##Define Shell Select Menu
    
    PS3=”Please select Menu Name Config: ”
    select i in “自动安装Bind服务” “自动初始化Bind配置” “添加解析域名” “批量添加A记录”
    do
    case $i in
    “自动安装Bind服务”)
    Install
    ;
    “自动初始化Bind配置”)
    Init_Config
    ;
    “添加解析域名”)
    Add_named
    ;
    “批量添加A记录”)
    Add_A_List
    
    ;
    * )
    echo —————————————————–
    sleep 1
    echo “Please exec: sh $0 { Install(1) or Init_Config(2) or Add_named(3) or Add_config_A(4) }”
    ;
    esac
    done
    

    转载请注明:爱开源 » DNS bind 主从服务搭建