zoukankan      html  css  js  c++  java
  • LINUX下DNS服务器的安装

    DNS 简介
    DNS(Domain Name System)
    作用:管理主机的“户籍”---主机名:IP,是一个分布市数据库系统
    起源:最早的主机解析,依靠hosts文件,由NIC(Network Information Center)维护,后来主机数量变得非常庞大,网络越来越复杂,就产生了DNS服务器。

    DNS系统的结构(倒挂的数形结构):

    域名注册:
    注册.com下面的域名,比如redhat.com,需要找.com的域的管理者(通常为国际域名管理组织www.webnic.cc)
    注册.redhat.com下面的域名,比如mydomain.redhat.com 需要找到redhat.com域的管理者。

    常用术语:
    DNS服务器:提供域名解析服务的主机
    DNS客户机:需要查询主机域名信息的主机,任何联网的主机都需要查询域名,所以任意主机都是DNS客户机。DNS客户机需要知道DNS服务器在哪里,liinux靠/etc/resolv.conf指定。
    正向解析:根据主机名解析IP地址。
    反向解析:根据IP地址解析主机名称。

    DNS解析的过程:常用的是递归解析,如果你要解析mail.sohu.com这个域名,主机就会向/etc/reslv.conf中指定的DNS服务器发送解析请求,如果其上有对应的缓存,就直接反馈给,如果没有就进行递归查询,其先向根(.)请求,跟就会把.com的DNS服务器地址返回给请求者,然后本地的DNS就会向.com的DNS发送解析请求,.com返回sohu.com的DNS地址,原因同上,然后本地向.sohu.com的DNS发送解析请求,sohu.com的DNS将mail.sohu.com对应IP地址返回给本地的DNS,本地的DNS再将对应的信息返回给客户机。这就是递归查询的过程,实际应用中会有一些差别。具体可以从网上搜索相关资料。

    安装配置BIND
    1.下载bind http://www.isc.org
       ftp://ftp.isc.org/isc/bind9/ 该FTP中可以找到最新版本的bind文件。根据自己需要下载。
    2.编译安装
      [root@happyboy soft]# tar xvzf bind-9.4.0.tar.gz
      [root@happyboy soft]# cd bind-9.4.0
      [root@happyboy bind-9.4.0]# ./configure --sysconfdir=/etc --disable-openssl-version-check
    (因为测试在AS 3环境下进行,安装新版本9.4.0,提示"It is recommended that you upgrade to OpenSSL version 0.9.8d/0.9.7l (or greater).You can disable this warning by specifying:--disable-openssl-version-check,所以添加了个个参数)
      [root@happyboy bind-9.4.0]# make
      [root@happyboy bind-9.4.0]# make install
    安装程序默认将应用程序安装在/usr/local/bin下,如DNS调式工具dig,解析DNS工具nslookup;服务器程序放在/usr/local/sbin目录下,DNS管理工具rndc,named。
      [root@happyboy bind-9.4.0]# vi /etc/nameed.conf               手动创建配置文件,内容如下:

    options {
             directory "/var/named";
    };
    zone "." {
             type hint;
             file "named.ca";
    };

    zone "localhost" {
            type master;
            file "named.local";
    };
    注意文件格式,括号内外都有分号,如果一句结束后没有回车用大括号结束,那大括号与之前的分号之间必须要有空格。
    根服务器,在配置文件named.conf中定义根服务器。
    zone "." {
             type hint;
             file "named.ca";
    };
    产生named.ca文件:
    # echo "nameserver 203.196.1.6" > /etc/resolv.conf      //在本机配置文件中加入任何一个可用的DNS服务器
    # dig -t NS . > /var/named/named.ca                     //查询根域服务器及其对应的IP地址并写入到named.ca
    [root@happyboy named]# more /etc/resolv.conf
    nameserver 127.0.0.1      //完成后将本机DNS配置为自身
      [root@happyboy bind-9.4.0]# vi /var/named/domain.com.zone
      [root@happyboy bind-9.4.0]# named
    [root@happyboy named]# tail /var/log/messages           //启动服务后,可以在该日志文件中看到如下信息:
    Sep 23 21:59:19 happyboy named[22396]: none:0: open: /etc/rndc.key: file not found
    Sep 23 21:59:19 happyboy named[22396]: couldn't add command channel 127.0.0.1#953: file not found
    Sep 23 21:59:19 happyboy named[22396]: zone localhost/IN: loading from master file named.local failed: file not found
    Sep 23 21:59:19 happyboy named[22396]: running
    最后的running表明服务已经启动了(只是我们定义了localhost域,但是没有配置named.local区文件,所以报"file not find")
    用# host www.sohu.com可以验证相关信息。
    [root@happyboy named]# ps -aux |grep named
    root     22396  0.3  2.6  9280 7092 ?        S    21:59   0:00 named
    root     22405  0.0  0.2  4916  668 pts/1    S    22:00   0:00 grep named
    服务还是不完整的,我们需要配置一个RNDC服务器,来控制DNS服务器
    1.产生rndc控制文件
    [root@happyboy named]# rmdc-confgen > /etc/rndc.conf               //用该命令生成rndc的配置文件。
    [root@happyboy named]# cat -n /etc/rndc.conf           //查看该文件,只有前面几行是起作用的,#号注释部分有说明:Use with the following in named.conf,

    adjusting the allow list as needed: 即下面内容加入到named.conf
    [root@happyboy named]# tail +13 /etc/rndc.conf >> /etc/named.conf //按照要求将后面内容假如到named.conf
    千万注意:这样copy过去还要把对应注释符号#取消才可以启作用,说明的两行
    # Use with the following in named.conf, adjusting the allow list as needed:
    # End of named.conf
    就不要取消注释了……
    可以用正则表达式来实现即vi命令(:.,$-1s/^#\ //)即将当前行(.)到倒数第二行($-1,$代表最后一行),s表示替换内容为/^后的内容(# )后面的空格要用转移字符\ //表示删除
    [root@happyboy etc]# killall -9 named
    杀死进程后重启
    [root@happyboy etc]# rndc status   //可以查看到服务器状态,说明服务启动成功。
    日志也正常
    [root@happyboy root]# more /var/log/messages
    Sep 23 22:14:04 happyboy named[22466]: listening on IPv4 interface lo, 127.0.0.1#53
    Sep 23 22:14:04 happyboy named[22466]: listening on IPv4 interface eth0, 192.168.0.200#53  //在53端口守护
    Sep 23 22:14:04 happyboy named[22466]: command channel listening on 127.0.0.1#953   //rndc守护端口

    在确定resolve.conf中定义的DNS服务器为本身,可以正常解析出域名了
    增加localhost域,开始就已经定义好了
    named.conf 中
    zone "localhost" {
            type master;             //类型为master,对应slave ,这个域的数据库需要自己维护
            file "named.local";     //指定该域的区文件
    };
    创建/var/named/named.local内容如下
    @   IN  SOA    localhost.             root (
                   2004081201            ;serial
                   1H                    ;refresh
                   15M                   ;retry
                   1W                    ;expire
                   1D )                  ;TTL
        IN  NS    @
        IN  A     127.0.0.1
    第一个字段一般为一个域名或者一个主机名,这里的@表示当前的local区区名"localhost"
    第二个字段指类型 IN(Internet互联网类型)
    第三字段指记录类型,是服务器NS、地址、或者是文件交换记录。每个区都有一个SOA(起始授权机构)这样的记录记录,内容包括:该区文件是为哪个区(localhost.)定义的;后面

    是该区域的管理者root是缩写,完整的应该以点结尾,没有以点结尾都会加上该区域的后缀,即完整的为root@localhost.,也以点结尾,但是@有定义为本区域,所以转意为

    root.localhost.缩写为root,从小括号(与前面的root之间要有空格)开始是定义本域信息
    后面两行完整应该为
    localhost.     IN  NS   localhost.
    localhost.     IN   A   127.0.0.1
    因为localhost.同@,可以用其代替,有因为这几条记录都是基于同一个域名@的,所以前面省略了,最终同上述模式,这些记录的其他属性,如生存周期ttl同SOA记录
    测试
    [root@happyboy root]# host localhost
    localhost has address 127.0.0.1
    已经可以解析localhost这个在named.conf中定义的域了。
    [root@happyboy root]# dig localhost  //也可以用dig来查询,信息比host丰富,具体。

    named服务器有缓存功能,第一次解析会比较慢,后续会比较快!
    如果有在named.conf中添加新的区域,配置好对应的区域文件后需要执行
    # rndc reload                //重新载入配置文件  使其生效

    测试:增加一个正向解析区域.
    在nemd.conf中定义区域以及区域文件
    zone "v1.com" {
            type master
            file "v1.com.zone";
    };
    定义v1.com.zone区域文件
    @   IN  SOA    v1.com.            root (
                   2004081201            ;serial
                   36000                 ;refresh
                   7200                  ;retry
                   1W                    ;expire
                   1D )                  ;TTL
         IN  NS    ns.v1.com.                    //ns.v1.com.可以简写为ns
         IN  MX 10 mail.v1.com.                   //mail.v1.com.可以简写为mail                 
         IN  A     192.168.0.100
    ns   IN  A     192.168.0.200
    www  IN  A     192.168.0.100
    mail IN  A     192.168.0.100
    news IN  CNAME www.v1.com.                  //www.v1.com.可以简写为www
    [root@happyboy named]# rndc reload
    rndc: 'reload' failed: failure
    [root@happyboy named]# more /var/log/messages

    Sep 26 21:47:46 happyboy named[1452]: loading configuration from '/etc/named.conf'
    Sep 26 21:47:46 happyboy named[1452]: /etc/named.conf:16: missing ';' before 'file'
    Sep 26 21:47:46 happyboy named[1452]: reloading configuration failed: failure
    在named.conf中定义新域时掉了一个分号(上面的master后),导致重新加载配置文件失败,修改好后正常
    [root@happyboy named]# rndc reload
    server reload successful
    [root@happyboy named]# host v1.com
    v1.com has address 192.168.0.100
    v1.com mail is handled by 10 mail.v1.com.
    注意上面的一行     IN  NS    ns.v1.com. 也可以更改为两行
         IN  NS    @
         IN  A     192.168.0.200  //这样表示该域名的ns记录同其@记录,然后在后面再定义其对应@记录即可,但是要注意由于@同上面的最开始省略,故该条记录不要错位到后面

    前面有主机名的记录后面,如果在www  IN  A     192.168.0.200 在表示前面省略的是www了。
    [root@happyboy named]# host -t NS v1.com
    v1.com name server ns.v1.com.
    [root@happyboy named]# host -t A v1.com
    v1.com has address 192.168.0.100
    [root@happyboy named]# host -t SOA v1.com
    v1.com has SOA record v1.com. root.v1.com. 2004081201 36000 7200 604800 86400
    [root@happyboy named]# host news.v1.com
    news.v1.com is an alias for www.v1.com.
    www.v1.com has address 192.168.0.100
    可以看到如上的测试结果,为了在一个本地域中可以省略形式来访问,如只输入news来访问news.v1.com,实现方法如下:
    [root@happyboy named]# echo "search v1.com" >> /etc/resolv.conf
    [root@happyboy named]# more /etc/resolv.conf
    nameserver 127.0.0.1
    search v1.com
    [root@happyboy named]# host news
    news.v1.com is an alias for www.v1.com.
    www.v1.com has address 192.168.0.200
    在区域文件开头部分可以写入全局配置参数
    $TTL 1D            //指定全局的生存周期
    $orignal v1.com。    //指定默认的域,不加也是
    ============================================================================
    127.0.0 反向区域
    /etc/named.conf 追加
    zone "0.0.127.in-addr.arpa" {        //注意区名网段的反向地址+后缀.in-addr.arpa
        type master;
        file "127.0.0.zone";
    };
    编译/var/named/127.0.0.zone;

    @       IN SOA     @   root.localhost. ( 2004051201 1H 14M 1W 1D )      //注意这里的@是代表反向区名0.0.127.in-addr.arpa.,root后面不能省略。
            IN NS      localhost.
    1       IN  PTR    localhost.                //PTR反向解析  IP放在前面,主机名放在后面,数字1完整写法为1.0.0.127.in-addr.arpa.

    测试
    [root@happyboy root]# rndc reload
    [root@happyboy root]# host 127.0.0.1
    1.0.0.127.in-addr.arpa domain name pointer localhost.
    [root@happyboy root]# dig -x 127.0.0.1           //该命令等同dig -t PTR 1.0.0.127.in-addr.arpa
    ; <<>> DiG 9.4.0 <<>> -t PTR 1.0.0.127.in-addr.arpa
    ;; global options:  printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45631
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

    ;; QUESTION SECTION:
    ;1.0.0.127.in-addr.arpa.                IN      PTR

    ;; ANSWER SECTION:
    1.0.0.127.in-addr.arpa. 86400   IN      PTR     localhost.

    ;; AUTHORITY SECTION:
    0.0.127.in-addr.arpa.   86400   IN      NS      localhost.

    ;; ADDITIONAL SECTION:
    localhost.              86400   IN      A       127.0.0.1

    ;; Query time: 9 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ;; WHEN: Mon Oct  1 14:12:42 2007
    ;; MSG SIZE  rcvd: 93

    增加一个反向区/etc/named.conf
    zone "0.168.192.in-addr.arpa" {
            type master;
            file "192.168.0.zone";
    };
    /var/named/192.168.0.zone文件内容:
    [root@happyboy named]# more 192.168.0.zone
    @   IN    SOA    v1.com.   root.v1.com.  (
                        2004081201
                        36000
                        7200
                        3600000
                        86400 )
        IN    NS      ns.v1.com.
    100   IN    PTR     www.v1.com.
    100   IN    PTR     ftp.v1.com.
    3.0.168.192.in-addr.arpa.   IN PTR  mail.v1.com.
    测试:
    [root@happyboy named]# host 192.168.0.100
    100.0.168.192.in-addr.arpa domain name pointer www.v1.com.
    100.0.168.192.in-addr.arpa domain name pointer ftp.v1.com.
    [root@happyboy named]# host 192.168.0.3
    3.0.168.192.in-addr.arpa domain name pointer mail.v1.com.
    注意:在做反向解析时尽量不要使用ns记录与其反向记录在同一个IP上,这样可能出现未知的错误,不会出错,但是就是查询不出来的现象。
    ==========================================================================
    子域授权(就是常用的DNS解析中的NS记录)
    主服务器的/var/named/v1.com.zone 增加两行
    domain     IN      NS    ns.domain     (完整写法为:domain.v1.com.     IN      NS    ns.domain.v1.com.)
    ns.domain  IN      A     192.168.2.1

    (domain    IN      NS    domain
               IN      A     192.168.2.1   //也可以简单地写成这样两行,domain为自己的NS记录,IP指向为……)
    在192.168.2.1 上配置bind服务器,如下:
    增加一个子域:domain.v1.com,named.conf配置文件增加:
    zone "domain.v1.com" {
        type maser;   
        file "domain.v1.com.zone";
    };
    子域服务器的区文件 domain.v1.com.zone如下:
    @   IN   SOA   domain.v1.com.     root.domain.v1.com.
             (2004081201   36000 7200    3600000   86400 )
            IN     NS    ns.domain.v1.com.
    ns      IN     A     192.168.2.1
    www     IN     A     192.168.2.100
    完成后测试方法同主服务器,即将本地/etc/resolve.conf中的DNS更改为127.0.0.1。# host www.domain.v1.com即可看到结果。
    注意:这样正确配置完成后在主服务器192.168.0.200上也可以查到授权给子域服务器192.168.2.1解析的domain.v1.com的内容。但是子域名如果查找父域还是要从根(.)域开始查

    找。实际上实现的是一个递归查询的过程,整个DNS系统本来就是一个授权过程。具体请参考网络上相关文档。
    ==========================================================================================
    辅助域名服务器
    作用:备份主域名服务器的数据,当主服务器出现故障时可以暂时代替主服务器工作。
    eg:在辅域上配置v1.com
    主配置文件/etc/named.conf上增加该域
    zone "v1.com" {
        type slave;                    //指定为辅域
        file "v1.com.zone";
        masters { 192.168.0.200; };   //注意主域名服务器地址用大括号括起来,括号前后都有空格。
    };
    # rndc reload            //重新载入配置文件
    注意:这个更新过程需要对named的directory "/var/named"写入从主服务器上获取的数据,所以named进程用户必须对该目录有写入权限,否则,上述reload过程会失败。
    如果是以root用户运行named则不存在这个问题,如果是以named用户named组运行named则执行# chmod g+w  /var/named即可。
    主服服务器之间数据的同步主要靠
    @   IN  SOA    localhost.             root (
                   2004081201            ;serial      //序列号:服务器版本管理信息,时间越新,数字月大。有变化时通知其他DNS更新数据。
                   1H                    ;refresh     //辅服务器每间隔这个时间向主服务器发送请求,时间由该值决定。如果上述编号变化,则发送请求,数据同步
                   15M                   ;retry       //辅与主通信如果由于网络等原因失败,再次通信前的间隔时间。
                   1W                    ;expire      //过期时间:主辅服务器如果在这个定义时间内不停重试还是无法通信,则表示该记录过期。
                   1D )                  ;TTL         //最小生存期限,即该区记录的生存期限,一般写在SOA前面,表示该SOA记录缓存时间,默认一天(1D)
    这些来实现
    ===============================================================================
    以普通用户身份执行named服务,确保服务器安全。
    普通用户在执行时需要写/var/run目录,该目录包含了每个进程的pid文件。
    [root@happyboy root]# ls -ld /var/run
    drwxr-xr-x    6 root     root         4096 10月  1 13:06 /var/run
    可以看到其他用户对该目录是不具备写入权限的。为了安全,不更改/var/run 目录,给named建立一个独立pid目录,修改该目录权限,如下:
    首先修改named.conf,设置pid-file选项值:
    options {
    ……
    pid-file  "/var/run/named/named.pid";                  //指定named.pid目录
    };
    [root@happyboy root]# useradd -s /bin/false -d /dev/null named
    [root@happyboy root]# id named
    uid=515(named) gid=515(named) groups=515(named)
    [root@happyboy root]# mkdir /var/run/named
    [root@happyboy run]# chown named.named named
    [root@happyboy run]# chmod 700 named
    [root@happyboy run]# ls -ld named
    drwx------    2 named    named        4096 10月  1 13:17 named
    [root@happyboy run]# killall -9 named
    [root@happyboy run]# named -u named            //更改好权限后以named身份运行named
    [root@happyboy run]# more /var/log/messages    //查看日志信息可以看到named已经启动成功。
    [root@happyboy run]# ps -uax |grep named
    named     1427  0.1  1.9  7248 5088 ?        S    13:27   0:00 named -u named
    [root@happyboy run]# which named
    /usr/local/sbin/named
    [root@happyboy run]# echo "/usr/local/sbin/named -u named" >> /etc/rc.local  //让named服务在系统启动时以named身份执行
    同时注意,如果是作为辅服务器运行,需要使named用户对named的工作目录/var/named有写入权限。作为主服务器的话无所谓了。

    DNS服务器配置常用选项:
    options {
        directory "/var/named";                    //服务器工作目录,即数据库文件存放位置。
        forwarders { 192.168.2.1: };           //如果本身无法对某个域名无法解析,将请求转发给的服务器,一般为外部DNS服务器,当该服务器也无法解析就查找根
        allow-transfer { 192.168.1.1; };           //是否允许某一个网段或某一个地址同步该服务器上的数据,一般指定辅服务器地址
        allow-query { 192.168.0/24; };             //允许查询的客户机地址或者范围。非该范围内的DNS查询请求会被拒绝,具体体现日志中。
    };
    zone  "v1.com" {
        type master;                             
        file "v1.com.zone";
        allow-transfer { 192.168.1.1; };         //意义同options,只是这个是对这个域有效
    };
    注意:bind的配置文件格式是非常严格的,大括号前后的空格


    这是我在寝室做测试的完整记录了....

  • 相关阅读:
    Delphi: TMemo垂直滚动条自动显示
    利用百度地图API制作房产酒店地图
    百度地图API--信息窗口
    Echarts饼状图
    JS截取与分割字符串常用技巧总结
    JS DOM1核心概要document
    JS DOM1核心概要1
    phpMVC框架的核心启动类定义
    jquery实现无限滚动瀑布流实现原理
    php连接数据库步骤
  • 原文地址:https://www.cnblogs.com/LCX/p/1017901.html
Copyright © 2011-2022 走看看