linux下dns的安装配置总结
--------------------------
1.基本的安装
2.建立一个简单的dns server
3.分离式dns和view语句
4.辅助域名服务器
5.单纯的cache-only域名服务器
6.域名服务器的日志配置
7.域名服务器的安全相关
  7.1 acl控制语句
  7.2 普通用户身份运行named
  7.3 chroot环境
  7.4 TSIG技术
  7.5 DNSSEC技术
8.动态更新DNS
--------------------------
 互联网的2个关键组成:route和dns,前者解决了主机的连接,后者解释了主机是谁,方便了人们的记忆。
 dns建立了主机名和IP地址之间的映射关系。
 dns是一个分布式数据库。
 bind是使用最广泛的一种DNS实现。

 dns工作原理:(以 www.example.com举例说明)
   所有的域名服务器都知道根服务器(.),根服务器知道com、net、org、cn等顶级域,
   而顶级域com又知道example.com子域,子域example.com知道主机 www.example.com的IP。
   dns采取层层授权的形式建立起一种分布式的域名管理机制,授权是单向的,只能从父域到子域,
   每个子域都必须向父域注册。

 用户查询主机过程:
   文件/etc/nsswitch.conf(hosts:  files dns)说明查询主机信息顺序先从/etc/hosts开始,
   先查看本地/etc/hosts文件,找不到主机名对应的IP,再进行dns查询,
   到/etc/resolv.conf文件指定的本地域名服务器查询,如果有对应域example.com,则直接返回 www.example.com主机的IP(或没有对应主机的消息)
   如果本地域名服务器不知道example.com这个域,也不知道com域的信息,不过它知道根域的信息(在named.ca中),
   如果允许递归查询的话(recursion yes),它就发送一个查询到根域,根域返回一个com域服务器的IP,
   然后再到com域查询example.com子域的信息,返回一个example.com域服务器的IP,
   最后在example.com域的域名服务器上得到主机 www.example.com的IP,
   本地域名服务器把查询结果返回给用户,并缓存查询结果。
1.基本的安装
tar -zxvf bind-9.7.0-p1.tar.gz
cd bind-9.7.0-p1
./configure --prefix=/usr/local/named \
            --enable-threads \
            --enable-largefile \
            --disable-openssl-version-check
make && make install
环境设置;
 可执行文件路径:
   echo "export PATH=$PATH:/usr/local/named/bin:/usr/local/named/sbin" >>~/.bash-profile
   . ~/.bash_profile

 帮助文档:
  echo "MANPATH /usr/local/named/share/man" >>/etc/man.config
2.建立一个简单的dns server
 2.1 创建named.conf配置文件
  cd /usr/local/named
  vi etc/named.conf
   options {
         directory "/var/named";
         pid-file "/var/named/named.pid';
         dump-file "/var/named/named_dump.db";
         statistics-file "/var/named/named.stats';
      };

     zone "." {
       type hint;
       file "named.ca";
      };

     zone "localhost" {
       type master;
       file "localhost.zone";
      };

     zone "0.0.127.in-addr.arpa" {
       type master;
       file 127.0.0.rev";
      };

     zone "example.com" {
       type master;
       file "example.com.zone";
      };

     zone "10.10.in-addr.arpa" {
       type master;
       file "10.10.rev";
      };

    说明:
      named.conf文件中的单行注释//或#,多行注释 /*  */
      options语句用于设置服务器全局参数
         directory  指定程序运行基准文件存放目录
         pid-file 指定named服务运行时pid存放文件
      dump-file 指定缓存文件
      statistics-file 指定服务器运行状态统计文件

  2.2 创建数据存放目录:
      mkdir /var/named

  2.3 创建named.ca根线索文件
      dig @61.139.2.69 -t NS .
      dig @198.41.0.4 -t NS . >/var/named/named.ca

  2.4 创建正向区文件localhost.zone和example.com.zone
    ;localhost
    $TTL 1d
    @ IN SOA localhost. root (
      2010050101 ;serials
      1h ;refresh
      15m ;retry
      1w ;expire
      1d ) ;ttl
     IN NS localhost.
     IN A 127.0.0.1

    ;example.com
    $TTL 1d
    @ IN SOA log.example.com. root.log (
      2010050101 1h 15m 1w 1d )
     IN ns1.example.com.
     IN ns2
     IN MX 10 mail
     IN A 10.10.0.10
    ns1 IN A 10.10.0.2
    ns2 IN A 10.10.0.3
    mail IN A 10.10.0.11
    log IN A 10.10.0.10
    www IN A 10.10.1.1
    ftp IN A 10.10.1.10
    web IN CNAME www

  2.5 创建反向区文件127.0.0.rev和10.10.rev
    ;127.0.0.rev
    $TTL 1d
    @ IN SOA localhost. root.localhost. (
      2010050101 1h 15m 1w 1d )
     IN NS localhost.
    1 IN PTR localhost.

    ;10.10.rev
    $TTL 1d
    @ IN SOA log.example.com. root.log.example.com. (
      2010050101 1h 15m 1w 1d )
     IN NS ns1.example.com.
     IN NS ns2.example.com.
    10.0 IN PTR log.example.com.
    11.0 IN PTR mail.example.com.
    1.1 IN PTR www.example.com.
    10.1 IN PTR ftp.example.com.

  2.6 使用rndc来控制dns服务器
     a)产生rndc控制文件
      rndc-confgen -a      
     修改named.conf配置文件,添加以下内容:
        include "/usr/local/named/etc/rndc.key";      
        controls {
          inet 127.0.0.1 port 953
               allow { 127.0.0.1; } keys { "rndc-key"; };
         };

 b)测试rndc和域名解析效果
   启动前检查配置文件和区文件的语法:
        named-chechkconf  etc/named.conf
        named-checkzone  "example.com" /var/named/example.com.zone
     启动域名服务:/usr/local/named/sbin/named
     用rndc查看域名服务器状态:rndc status
     测试域名解析:
         echo "nameserver 127.0.0.1" >/etc/resolv.conf
         host www.example.com
         echo "search example.com" >> /etc/resolv.conf
         host www

 2.7 有关区文件的一些说明

      区文件(zone file)包含2个部分:分析器命令和资源记录(Resource Records)
      分析器命令有:
           $TTL  存活时间(time to live)
           $ORIGIN  默认域,区文件中不完整(不以.结尾)的任何域名自动在其后添加默认域,
                    没有设置此命令时,以named.conf文件中zone语句多指定的域名作为初始域。
        $INCLUDE  引入外部文件,注意引入文件的格式要匹配
        $GENERATER  创建一系列不同的资源记录

       例如:
          $ORIGIN  0.10.10.in-addr.arpa.
          $GENERATOR 1-3  IN PTR www.example.org.

        等同于:
              $ORIGIN  0.10.10.in-addr.arpa.
              1   IN PTR www.example.org.
              2   IN PTR www.example.org.
              3   IN PTR www.example.org.

      区文件格式:
        [name] [ttl] [class] type data

      RR中的特殊符号:
        ; 注释(半角分号)
        @ 代表当前域名,named.conf文件中zone语句指定的初始域,或$ORIGIN 指定的默认域
        () 括号允许跨行
        *  通配符(仅由name字段使用)

  [name] 字段表示记录的实体(通常是一个主机或域),连续相同的[name],可以省略除第一个外的[name]字段,例如:
        www  IN  10.10.0.1
             IN  10.10.0.10
             IN  10.10.0.11
    [ttl] (time to live存活时间)字段指定数据可以被缓存的时间,单位秒,也可以用w,d,h,m等后缀来表示周,天,小时,分钟。
    后面记录的时间跟前面一条记录相同时,或区文件开头使用了$TTL命令设置了默认的值,可以省略[ttl]字段。例:
   www  3600  IN  10.10.0.1
   ftp        IN  10.10.0.10
   mail 1d    IN  10.10.0.11
  [class] 字段指定网络类型,可识别的值有3个:IN(Internet)、HS(Hesiod)、CH(Chosnet)。默认值IN,其他的基本不用。
     type字段指定了记录的类型。常用的有:
          SOA  定义一个DNS区
          NS   标识区的服务器,授权子域
          MX   控制邮件的投递
          A    名字到地址的转换
          PTR  地址到名字的转换
          CNAME  主机的别名
          AAAA   名字到IPv6地址的转换

  data字段的类容取决于记录类型(type)。例如:类型为A,data字段就是IP地址;SOA记录,data字段就包括区主名字服务器,联系人邮箱等;而MX记录,则包括优先级和邮件主机
     举例:
      chinaunix.net. 86400 IN  SOA  ns1.chinaunix.net.  postmaster.chinaunix.net. (2010050101 1h 15m 1w 1d)
      ;上面第一个chinaunix.net.可用@替代,后面的联系人邮件地址postmaster.chinaunix.net.也可缩写为postmaster
                          IN  NS   ns1.chinaunix.net.
                          IN  MX   10  mail
                          IN  A    10.10.0.10
           ns1            IN  A    10.10.0.1
           mail           IN  A    10.10.0.10

     区文件SOA记录中的序列号不必连续,但必须单调递增。

3.分离式DNS和view语句
   分离式DNS(split dns)实现了不同用户查询域名,返回不同的查询结果,
   view语句控制哪些用户能看到哪个view的访问列表、用于view中所有区的一些选项和区本身。

   如果启用了view,那么named.conf文件中所有的zone语句都必须在view中出现。

     view "internal" {
      match-clients { 10.10.0.0/16;};
      recursion yes;
      zone "example.com" {
       type master;
       file "internal/example.com.in.zone";
      };
     };

     view "external" {
      match-clients { any; };
      recursion no;
      zone "example.com" {
       type master;
       file "external/example.com.ex.zone";
      };
     };

   注意:view是按顺序来处理的,所以要先加上限制最严格的view,
       如果view次序反了,所有查询都首先匹配any,而不会匹配到10.10.0.0/16,从而造成谁都无法看到内部view了。

4.辅助域名服务器
 主配置文件:/etc/named.conf
 zone "chinaunix.net" {
type slave;
  file "chinaunix.net.zone";
 };
为了让辅助域名服务器自动根据主域名服务器自动建立区文件,
需要让运行named服务的用户在相应目录具有写权限
 chgrp -R named /var/named
 chmod g+w /var/named

主、辅域名服务器同步前需要同步时间:
 ntpdate 0.cn.pool.ntp.org && hwclock -w
然后重新启动服务:
 killall named && named

5. 单纯的Cacha-Only 域名服务器
仅用于帮助client端向外部dns主机请求查询,没有自己的域名解析数据库。
vi etc/named.conf
options {
 directory "/var/named";
 pid-file "/var/named/named.pid";
 dump-file "/var/named/data/cache_dump.db";
 statistics-file "/var/named/named_stats.txt";
forward only;
forwar ders {
  61.139.2.69;
 };
};
include "/etc/rndc.key";


6.域名服务器的日志配置
 logging {
       channel <string>; {
            file <logfile>;;
            syslog <optional_facility>;;
            null;
            stderr;
            severity <logseverity>;
            print-time <boolean>;
            print-severity <boolean>;
            print-category <boolean>;
         };
       category <string>; { <string>;; ... };
};

日志中主要有2个概念:channel(通道)和category(类别)。
channel规定了日志应该发往哪里(file、syslog、null、stderr)
category指定了特定类别的日志通个哪个channel来发送。

syslog指定的facility(设备)主要有:kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, authpriv, ftp, local0 - local7
severity(严重性):定义消息的等级,critical |error|warning|notice|info|debug[level]|dynamic
print-category yes|no 定义是否输出消息类别
print-severity yes|no 定义是否输出严重级别
print-time yes|no  定义是否输出消息的时间

bind中预定义的日志通道:
 default_syslog  发送到syslog、设备为daemon,严重性为info
 default_debug   日志记录到文件named.run中,严重性为dynamic
 default_stderr  发送到named进程的标准出错设备(stderr),严重性为info
 null   丢弃所有消息
   category(日志类别)主要有:
        client  客户机请求
        config  配置文件分析和处理
database  有关数据库操作的信息
        default  没有明确分配通道的类别
        delegation-only  按delegation-only区对NXDOMAIN的查询
        dispatch  把传入的包分发给多个服务器模块
dnssec  DNSSEC消息
        general  未分类的消息
lame-servers  残缺服务器的错误消息
        network  网络操作
notify  有关“区已更改”通知协议的消息
queries  服务器接受到的每个查询的简短日志消息
        resolver  DNS解析,如客户机的递归查询
        security  批准/未批准的请求
        unmatched  named不能对查询进行分类(错误的类,没有view)
update  有关动态更新的消息
xfer-in  服务器正在接受的区传送
xfer-out 服务器正在发送的区传送

        举例:把所有的dns查询日志单独写入一个文件,把lame-servers消息丢掉
           logging {
            channel queries_log {
             file "/var/named/log/queries.log" version 3 size 50m;
             severity info;
             print-severity yes;
             print-category yes;
             print-time yes;
            };
            category queries {
             queries_log;
            };
            category lame-servers {
                 null;
            };

7.域名服务器的安全相关
7.1 acl控制语句
   acl "inside" {
    10.10.0.0/16;
   };
   zone "example.org" {
    type master;
    file "example.org.zone";
    allow-query { inside; };
   };

  acl定义的地址匹配列表可以出现在allow-query、allow-transfer、allow-update、allow-recursion、backhole、match-clients等语句中
  acl有4个预定义的地址匹配:
    any  匹配所有
    none  所有都不匹配
    localhost  匹配系统上所有本地网络接口地址(环回地址和接口地址)
    localnets  匹配所有与本地网络接口地址在同一段的地址块

7.2 以普通用户身份运行named程序
  创建用户和组
   groupadd named
   useradd -g named -s /sbin/nologin -d /var/named -M named

  修改目录权限:
   chown -R named.named /var/named
   chmod -R 700 /var/named

  修改named.conf文件:
   options {
    directory "/var/named";
    pid-file "/var/named.named.pid";
    statistics-file "/var/named/named.stats";
   };

  以普通用户权限运行服务:
    /usr/local/named/sbin/ named -u named

7.3 chroot环境限制named

  创建必要的目录:
   mkdir -p /var/named/{etc,dev,var/{run,named}}
  创建必要的设备文件:
   cd /var/named
   file /dev/{null,zero,random}
   mknod dev/null c 1 3
   mknod dev/zero c 1 5
   mknod dev/random c 1 8
  复制本地时区文件:
   cp /etc/localtime etc/

  创建bind的配置文件named.conf和zone区文件,并放入相应etc、var/named目录

  文件和目录权限修改:
    chown -R root.named /var/named
    find /var/named -type f -print | xargs chmod u=rw,og=r
    find /var/named -type d -print | xargs chmod u=rwx,og=rx
    chmod -R ug=rwx,o=rx /var/named/var

  启动服务:
    /usr/local/named/sbin/ named -u named -t /var/named

7.4 TSIG技术
  通过使用“事务签名(transaction signature)”来保障服务器之间的通信安全。TSIG能保护主、从服务器之间区传送的安全,并能实现安全的动态更新。

 7.4.1使用dnssec-keygen产生加密密钥:
  dnssec-keygen -a hmac-md5 -b 512 -n HOST chinaunix
 产生公钥:Kchinaunix.+157+56132.key  
     私钥:Kchinaunix.+157+56132.private
 文件内容一般包括以下内容:
  Private-key-format: v1.2
  Algorithm: 157 (HMAC_MD5)
  Key: hSPUdopy1pDYfu1ZEfTg3GhCWrR4uDB8R9RoQiQ+9x7JNdA97DfWjqe6je8nBe3i855hax3JlVS3yWAvTi4VpQ==

 用scp复制密钥到主、从服务器: scp Kchinaunix.+157+56132.key root@10.10.0.253:/root

 7.4.2 使用TSIG密钥分别对主、从服务器的named.conf设定:
  key "chinaunix" {
   Algorithm HMAC_MD5;
   secret "hSPUdopy1pDYfu1ZEfTg3GhCWrR4uDB8R9RoQiQ+9x7JNdA97DfWjqe6je8nBe3i855hax3JlVS3yWAvTi4VpQ==";
  };

 7.4.3 在主服务器named.conf添加:
  server 10.10.0.253 { #发往从服务器10.10.0.253的消息用key加密
   keys ( chinaunix; };
  };
  zone "chinaunix.net" {
   type master;
   file "chinaunix.net.zone";
   allow-transfer { key chinaunix; }; //本区传送只允许key
  };

 7.4.4 在辅助域名服务器named.conf添加:
  server 10.10.0.254 { #发往主服务器10.10.0.254的消息用key加密
   keys { chinaunix; };
  };

 7.4.5 验证TSIG技术是否生效:
  删除辅助域名服务器的区文件chinaunix.net.zone
  同步一下主、从域名服务器的时间
  重新启动辅助域名服务器
  检查辅助域名服务器的区文件是否自动建立。

7.5 DNSSEC技术
  DNSSEC是一套对DNS的扩展,它使用公钥加密,对区数据的来源进行身份验证,并验证其完整性。
  私钥用来加密,公钥用来解密。下面以chinaunix.net域来建立DNSSEC配置:

  7.5.1 创建密钥对:

   ZSK密钥对:dnssec-keygen -a DSA -b 768 -n ZONE chinaunix.net
    产生公钥 Kchinaunix.net.+003+49219.key
        私钥 Kchinaunix.net.+003+49219.private
   密钥文件名包括:key name(chinaunix.net.)、algorithm(001表示RSAMD5,003表示DSA,005表示RSASHA1等)、key tag(此处是49219)

  KSK密钥对: dnssec-keygen -a DSA -b 768 -f KSK -n ZONE chinaunix.net
     产生的密钥文件为:Kchinaunix.net.+003+03483.key 和 Kchinaunix.net.+003+03483.private

 7.5.2 对区文件签名
  先在原区文件(chinaunix.net.zone)中引入密钥文件:
   $TTL 1d
   ;chinaunix.net.
   @       IN      SOA     localhost. root.localhost. (
                  2010050101 1h 15m 1w 1d )
           IN      NS      ns1.chinaunix.net.
           IN      NS      ns2
           IN      MX      10      mail
           IN      A       10.10.0.10
   ns1     IN      A       10.10.0.1
   ns2     IN      A       10.10.0.2
   mail    IN      A       10.10.0.10
   www     IN      A       10.10.0.11
   web     IN      CNAME   www
   $INCLUDE        Kchinaunix.net.+003+49219.key ;ZSK
   $INCLUDE        Kchinaunix.net.+003+03483.key ;KSK
然后对区文件签名:
  dnssec-signzone -o chinaunix.net chinaunix.net.zone Kchinaunix.net.+003+49219.key Kchinaunix.net.+003+03483.key

 生成区文件的签名后版本:chinaunix.net.zone.signed
 同时生成了密钥集文件: dsset-chinaunix.net.
 dsset-chinaunix.net.文件内容:
      chinaunix.net.          IN DS 3483 3 1 5D46B000BC003AF35A9541B57F79923C71036185
   chinaunix.net.          IN DS 3483 3 2 36EC5EAD7E5C00917E294089EDB01FC64106F1D6C17E8BA749A02C00 E2AF4D61
  此密钥集文件用于对密钥做签名

 7.5.3 修改named.conf配置文件:
    options {
     directory "/var/named";
dnssec-enable yes;
     dnssec-validation yes
;
    };
    zone "chinaunix.net" {
     type master;
     file " chinaunix.net.zone.signed";
    };

 7.5.4 在DNSSEC中,什么是KSK和ZSK ?
      KSK 表示密钥签名密钥 (Key Signing key) (一种长期密钥),
      ZSK 表示区域签名密钥 (Zone Signing Key) (一种短期密钥)。
      如果有足够的时间和数据,加密密钥最终都会被破解。对于 DNSSECv 中使用的非对称密钥或公钥密码系统而言,
      这意味着***者可通过强力***方法或其他方法确定公钥 – 私钥对的私钥部分(该部分用于创建对 DNS 记录的有效性进行验证的签名),从而使 DNSSEC 提供的保护失效。
      DNSSEC 使用短期密钥(即区域签名密钥 (ZSK) ) 来定期计算 DNS 记录的签名,同时使用长期密钥(即密钥签名密钥 (KSK) ) 来计算 ZSK 上的签名,以使其可以得到验证,从而挫败了这些破解企图。
      ZSK 被频繁更改或滚动,以使***者难以“猜测”,而期限较长的 KSK 则经过一个长得多的时段之后才更改(当前的最佳做法是以年为单位设置此时段)。
      由于 KSK 对 ZSK 进行签名而 ZSK 对 DNS 记录进行签名,因此只需具有 KSK 即可对区域中的 DNS 记录进行验证。
      它是以 授权签名者 (Delegation Signer, DS) 记录形式传递到“父”区域的一个 KSK 示例 。父区域(例如,根区域)使用其自己的、由其自己的 KSK 签名的 ZSK 对子区域(例如, .org )的 DS 记录进行签名
 7.5.4 DNSSEC的缺点:

       标记和校验DNS数据会产生额外的开销,从而影响网络和服务器的性能

8. 动态更新DNS
  下面主要以通过dhcp服务器来动态更新dns的A记录为例:

 8.1 创建密钥对:
  dnssec-keygen -a hmac-md5 -b 128 -n user dhcp_update
   生成了两个密钥文件:Kdhcp_update.+157+53578.key 和 Kdhcp_update.+157+53578.private
   公钥密钥文件Kdhcp_update.+157+53578.key的内容如下:
     dhcp_update. IN KEY 0 3 157 Vb289/ZfG85RfrP8YTVCGg==

  8.2 修改dhcpd.conf文件:
     ddns-update-style interim;
     ignore client-updates;

key dhcp_update {    #更新dns的key,必须的
      algorithm hmac-md5;
      secret Vb289/ZfG85RfrP8YTVCGg==;
     };

zone  chinaunix.net. {  #要更新的zone区
      primary 127.0.0.1;   #dns服务器的IP,此处为本机
      key dhcp_update;
     };

     subnet 10.10.1.0 netmask 255.255.255.0 {
        rang 10.10.1.10  10.10.1.254;
        option routers  10.10.1.1;
        option subnet-mask  255.255.255.0;
        option domain-name-servers 10.10.0.10 10.10.0.11;
        option domain-name  "chinaunix.net";
        default-lease-time 86400;  # 1 day
        max-lease-time   259200;  #3 days
     };

  8.3 修改named.conf文件:
       options {
         directory "/var/named";
       };

       include "/etc/rndc.key";
       controls {
        inet 127.0.0.1 allow { 127.0.0.1; } keys { rndc-key: };

key "dhcp_update" {
         algorithm hmac-md5;
         secret "Vb289/ZfG85RfrP8YTVCGg==";
       };

       zone "chinaunix.net" {
         type master;
         file "chinaunix.net.zone";
update-policy {
          grant dhcp_update subdomain chinaunix.net. A;
         };

       };

    上面的update-policy语句可以直接用allow-update { key dhcp_update; }; 替代
    update-policy语句比allow-update语句能实现更精细的控制,二者不能同时存在。

    update-policy语句的规则:
       ( grant | deny ) identity  nametype name  [types]

   每个规则都说明是允许还是拒绝,一个信息如果与一条规则成功匹配,允许或拒绝立即执行,不再向下检查。
   一个匹配是签名与inentity字段匹配,名字与name字段匹配,类型与type字段匹配。

   identity 字段指授权更新需要的密钥名
   nametype 字段有4个值: name, subdomain, wildcard, 和 self
     name 名称:当更新名与name字段中的名字相同时匹配。
     subdomain 子域:当更新名是name字段值的子域或name字段本身时匹配。
     wildcard 通配名称:当更新名是name字段值的通配名称时匹配。
     self 自已:当更新名是信息签名者自身时匹配,name字段被忽略