当前位置:Linux教程 - Linux - Linux DNS and BIND 服务器

Linux DNS and BIND 服务器



        


    概述

    注意事项

    软件包的来源

    安装软件包需要注意的问题

    编译和安装

    配置和优化

    编译和优化

    清除不必要的文件

    配置

    Caching-only域名服务器

    为简单的“caching”服务器配置“/etc/named.conf”文件

    为简单的“caching”服务器配置“/var/named/db.127.0.0”文件

    为简单的“caching”服务器配置“/var/named/db.cache”文件

    主域名服务器

    为主域名服务器配置“/etc/named.conf”文件

    为主域名服务器和辅域名服务器配置“/var/named/db.127.0.0”文件

    为主域名服务器和辅域名服务器配置“/var/named/db.208.164.186”文件

    为主域名服务器配置“/var/named/db.openarch”文件

    为主域名服务器和辅域名服务器配置“/var/named/db.cache”文件

    二级域名服务器(辅域名服务器)

    为二级域名服务器配置“/etc/named.conf”文件

    为所有名称服务器配置“/etc/rc.d/init.d/named”脚本文件

    加强BIND/DNS安全性

    限制BIND运行于“虚”根(chroot)环境下。

    清理工作

    区带(Zone)转移

    允许查询

    转发限制

    参考文献

    DNS管理工具

    DNS用户工具

    安装到系统中的文件

    概述
    安装完所有必要的系统安全软件之后,下一步要考虑如何提高和调整服务器的网络性能。DNS对IP网络通讯来说是最重要的网络服务,因为所有的Linux客户机(client)至少都要配置成具有缓冲(caching)能力。为本地的客户端计算机建立缓冲服务可以降低主域名服务器(primary server)的负荷。一台“caching only”的域名服务器可以进行域名解析并把结果记录下来下次还要用到这个域名的时候就不要花很长时间解析了。这可以在很大程度上缩短下次域名解析的时间。

    因为安全方面的问题,保证在企业内部网的主机和企业外部的主机之间不存在DNS这一点十分重要。如果只用IP地址连接企业外部的主机,当然就更安全了。

    在我们的配置和安装中我们以非“root”用户在“chrooted”环境中运行BIND/DNS。我们提供了三种不同的配置:1)简单的“caching only”域名服务器(客户端);2)辅域名服务器(secondary server);3)主域名服务器(primary server)。

    配置简单的“caching only”域名服务的服务器是不会用来做主/辅域名服务器的,只有主域名服务器或辅域名服务器才需要配置主域名或辅域名服务。通常情况下只有一台服务器作为主域名服务器,另一台服务器作为辅域名服务器,其它的服务器都作为简单的“caching only”客户端域名服务器。



    上面是我们在这本书中介绍的DNS的配置的图示。我们在不同的服务器上使用了不同的设置(caching only DNS、主DNS和辅DNS)。在实际情况中有很多种可能存在,所以要根据需要和网络结构来配置。

    注意事项
    下面所有的命令都是Unix兼容的命令。

    源路径都为“/var/tmp”(当然在实际情况中也可以用其它路径)。

    安装在RedHat Linux 6.1下测试通过。

    要用“root”用户进行安装。

    bind的版本号是8.2.2-patchlevel5。

    软件包的来源
    bind主页:http://www.isc.org/

    下载:bind-contrib.tar.gz, bind-doc.tar.gz, bind-src.tar.gz。

    安装软件包需要注意的问题
    最好在编译前和编译后都做一张系统中所有文件的列表,然后用“diff”命令去比较它们,找出其中的差别并知道到底把软件安装在哪里。只要简单地在编译之前运行一下命令“find /* >dns1”,在编译和安装完软件之后运行命令“find /* > dns2”,最后用命令“diff dns1 dns2 > dns”找出变化。

    编译和安装
    把软件包(tar.gz)解压缩:

    [root@deep /]# mkdir /var/tmp/bind
    [root@deep /]# cp bind-contrib.tar.gz /var/tmp/bind/
    [root@deep /]# cp bind-doc.tar.gz /var/tmp/bind/
    [root@deep /]# cp bind-src.tar.gz /var/tmp/bind/

    我们创建了一个名为“bind”的目录,用来处理tar文档。

    转到新的“bind”目录(cd /var/tmp/bind),解压tar文件:

    [root@deep bind]# tar xzpf bind-contrib.tar.gz
    [root@deep bind]# tar xzpf bind-doc.tar.gz
    [root@deep bind]# tar xzpf bind-src.tar.gz

    配置和优化
    编辑“Makefile.set”文件(vi /src/port/linux/Makefile.set),并加入:

    CC=egcs -D_GNU_SOURCE
    CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-
    frame-pointer -fno-exceptions’
    DESTBIN=/usr/bin
    DESTSBIN=/usr/sbin
    DESTEXEC=/usr/sbin
    DESTMAN=/usr/man
    DESTHELP=/usr/lib
    DESTETC=/etc
    DESTRUN=/var/run
    DESTLIB=/usr/lib/bind/lib
    DESTINC=/usr/lib/bind/include
    LEX=flex -8 -I
    YACC=yacc -d
    SYSLIBS=-lfl
    INSTALL=install
    MANDIR=man
    MANROFF=cat
    CATEXT=$$N
    PS=ps -p
    AR=ar crus
    RANLIB=:

    第一行说明我们用的gcc编译器的名字是egcs,第二行是优化参数。“DESTLIB=”这一行说明bind所需的库函数目录,“DESTING=”说明bind的“include”目录在哪里。

    编译和优化
    输入下面的命令:

    [root@deep bind]# make -C src
    [root@deep bind]# make clean all -C src SUBDIRS=../doc/man
    [root@deep bind]# make install -C src
    [root@deep bind]# make install -C src SUBDIRS=../doc/man

    “make”命令把所有的源文件都编译成二进制文件,接着“make install”把二进制文件和相关的配置文件安装到相应的目录中。

    [root@deep bind]# strip /usr/bin/addr
    [root@deep bind]# strip /usr/bin/dig
    [root@deep bind]# strip /usr/bin/dnsquery
    [root@deep bind]# strip /usr/bin/host
    [root@deep bind]# strip /usr/bin/nslookup
    [root@deep bind]# strip /usr/bin/nsupdate
    [root@deep bind]# strip /usr/bin/mkservdb
    [root@deep bind]# strip /usr/sbin/named
    [root@deep bind]# strip /usr/sbin/named-xfer
    [root@deep bind]# strip /usr/sbin/ndc
    [root@deep bind]# strip /usr/sbin/dnskeygen
    [root@deep bind]# strip /usr/sbin/irpd
    [root@deep bind]# mkdir /var/named

    “strip”命令去掉目标文件中的所有符号信息。这样二进制程序就会小一些,可以提高一点程序的性能。“mkdir”命令创建一个“/var/named”目录。

    清除不必要的文件
    [root@deep /]# cd /var/tmp
    [root@deep tmp]# rm -rf bind/

    这些命令删除用来编译和安装BIND/DNS的源文件。

    配置
    不同服务器的配置文件是不相同的,要根据需求和网络结构的实际情况来决定。可能在家里只要安装一个“caching only”的DNS服务器,在公司里就可能要安装主DNS、辅DNS和“caching only”DNS。

    可以到这去下载“floppy.tgz”文件:http://pages.infinit.net/lotus1/doc/opti/floppy.tgz。把“floppy.tgz”文件解开之后,可以在相应的目录下发现我们在这本书中介绍的所有软件的配置文件。这样就没有必要手工重新生成这些文件,或者用拷贝粘贴的方法把它们粘贴到配置文件中去。不管是打算自己动手生成配置文件还是拷贝现成的,你都要学会自己修改配置文件并且把配置文件拷贝到正确的目录下。下面将具体说明。

    为了运行“caching only”域名服务器,必须创建或者拷贝下面的文件到相应的目录下:

    l 把“named.conf”文件拷贝到“/etc”目录下

    l 把“db.127.0.0”文件拷贝到“/var/named”目录下

    l 把“db.cache”文件拷贝到“/var/named”目录下

    l 把“named”脚本文件拷贝到“/etc/rc.d/init.d”目录下

    为了运行主域名服务器,必须创建或者拷贝下面的文件到相应的目录下:

    l 把“named.conf”文件拷贝到“/etc”目录下

    l 把“db.127.0.0”文件拷贝到“/var/named”目录下

    l 把“db.cache”文件拷贝到“/var/named”目录下

    l 把“db.208.164.186”文件拷贝到“/var/named”目录下

    l 把“db.openarch”文件拷贝到“/var/named”目录下

    l 把“named”脚本文件拷贝到“/etc/rc.d/init.d”目录下

    为了运行辅域名服务器,必须创建或者拷贝下面的文件到相应的目录下:

    l 把“named.conf”文件拷贝到“/etc”目录下

    l 把“db.127.0.0”文件拷贝到“/var/named”目录下

    l 把“db.cache”文件拷贝到“/var/named”目录下

    l 把“named”脚本文件拷贝到“/etc/rc.d/init.d”目录下

    可以把“floppy.tgz”解压之后,找到上面列出来的文件,并拷贝到相应的目录下,或者用拷贝粘贴的方法从本书中直接粘贴出。

    Caching-only域名服务器
    “caching-only”域名服务器处除了对“0.0.127.in-addr.arpa”有效,对其它的域都是无效的。“caching-only”域名服务器能够在区域(zone)内或在区域外查找域名,就像主域名服务器和辅域名服务器那样。所不同的是当“caching-only”域名服务器开始在区域内查找域名的时候,只查询本区域的一台主域名服务器或辅域名服务器就结束了。

    用来建立简单的“caching-only”域名服务器所需的文件为:

    l named.conf

    l db.127.0.0

    l db.cache

    l named 脚本

    为简单的“caching”服务器配置“/etc/named.conf”文件
    只要不作为主域名服务器和辅域名服务器,可以在网络上的其它服务器上使用这一个配置。为本地的客户端计算机建立简单的“caching”服务器可以减轻主域名服务器的负荷。许多拨号上网的用户也是因为这个原因使用这种配置。

    创建“named.conf”文件(touch /etc/named.conf),在文件中加入这些行:

    options {
    directory "/var/named";
    forwarders { 208.164.186.1; 208.164.186.2; };
    forward only;
    };
    //
    // a caching only nameserver config
    zone "." in {
    type hint;
    file "db.cache";
    };
    zone "0.0.127.in-addr.arpa" in {
    type master;
    file "db.127.0.0";
    };

    在“forwarders”这一行,“208.164.186.1”和“208.164.186.2”是主域名服务器和辅域名服务器的IP地址。也可以用ISP提供的DNS服务器或者其它的DNS服务器。

    为了提高BIND/DNS服务器的安全性,需要防止当主/辅域名服务器当机或者没有反应的时候,“caching”域名服务器会试图查询其它服务器。在“named.conf”文件中设置了“forward only”这个参数,可以防止这种情况的发生,也就是当“forwarders”中定义的域名服务器没有反应的时候,域名服务器不会去查询其它服务器。

    为简单的“caching”服务器配置“/var/named/db.127.0.0”文件
    只要不作为主域名服务器和辅域名服务器,可以在网络上的其它服务器上使用这一个配置。“db.127.0.0”文件包括自转(loopback)网络。在“/var/named”目录下创建下面的文件。

    创建“db.127.0.0”文件(touch /var/named/db.127.0.0),在文件中加入下面这些行:

    $TTL 345600
    @ IN SOA localhost. root.localhost. (
    00 ; Serial
    86400 ; Refresh
    7200 ; Retry
    2592000 ; Expire
    345600 ) ; Minimum
    IN NS localhost.
    1 IN PTR localhost.

    为简单的“caching”服务器配置“/var/named/db.cache”文件
    在启动DNS服务器之前必须要有一个“db.cache”文件的拷贝,把这个文件拷贝到“/var/named”目录下。“db.cache”告诉服务器根区域(root zone)在哪里。

    用下面的命令在其它的Unix计算机上创建“db.cache”文件,或这从RedHat Linux源代码的光盘中拷贝一个。

    用下面的命令生成一个新的“db.cache”文件:

    [root@deep]# dig @.aroot-servers.net . ns > db.cache

    不要忘了吧“db.cache”文件拷贝到需要这个文件的服务器的“/var/named”目录学。

    注意:内部网的地址,如“192.168.1/24”因为安全问题不能出现在DNS的配置文件中。还有一点很重要,就是在企业网内的主机和外部主机之间不能存在DNS。

    主域名服务器
    主域名服务器从文件中读取区域数据,这些数据对整个区域来说都是具有权威性的。

    为了建立主域名服务器所必须的文件是:

    l named.conf

    l db.127.0.0

    l db.208.164.186

    l db.openarch

    l db.cache

    l named script

    为主域名服务器配置“/etc/named.conf”文件
    在作为主域名的服务器中使用这样的配置。编译完DNS之后,比较为服务器建立主域名。我们用“openarch.com”作为力争,假定其IP地址为:208.164.186.0。为了实现这个目的在“/etc/named.conf”文件中加入这几行:

    options {
    directory "/var/named";
    fetch-glue no;
    recursion no;
    allow-query { 208.164.186/24; 127.0.0/8; };
    allow-transfer { 208.164.186.2; };
    transfer-format many-answers;
    };
    // These files are not specific to any zone
    zone "." in {
    type hint;
    file "db.cache";
    };
    zone "0.0.127.in-addr.arpa" in {
    type master;
    file "db.127.0.0";
    };
    // These are our primary zone files
    zone "openarch.com" in {
    type master;
    file "db.openarch";
    };
    zone "186.164.208.in-addr.arpa" in {
    type master;
    file "db.208.164.186";
    };

    “fetch-glue no”与“recursion no”选项一起使用以防止服务器的缓冲区增长的过大以至崩溃。禁止递归选项将你的服务器设成被动模式,它不会代理其它名称服务器和解释器而发送请求。禁止递归的名称服务器因为不会发送请求因此不会缓存任何数据,也就很难被欺骗。这是一个安全特性。

    在“allow-query”行中“208.164.186/24”和“127.0.0/8”表示本服务器允许向其请求的IP地址。

    在“allow-query”行中“208.164.186.2”表示本服务器允许接收区带转移的IP地址。你必须确保只有辅域名服务器才可以接收你的区带转移。这些信息往往被一些IP欺骗程序所利用。

    注意:“named.conf”文件中选项 “recursion no”,“allow-query”和“allow-transfer”是一些安全方面的特性。

    为主域名服务器和辅域名服务器配置“/var/named/db.127.0.0”文件
    本配置文件适用于主域名服务器和辅域名服务器。 “db.127.0.0”文件包括回环网络的设置,是主机用于将信息流直接导向本地的特殊地址。在“/var/named/”目录中创建下列文件。

    创建“db.127.0.0”文件(touch /var/named/db.127.0.0)并加上如下几行:

    ; Revision History: April 22, 1999 - [email protected]
    ; Start of Authority (SOA) records.
    $TTL 345600
    @ IN SOA deep.openarch.com. admin.mail.openarch.com. (
    00 ; Serial
    86400 ; Refresh
    7200 ; Retry
    2592000 ; Expire
    345600 ) ; Minimum
    ; Name Server (NS) records.
    NS deep.openarch.com.
    NS mail.openarch.com.
    ; only One PTR record.
    1 PTR localhost.

    为主域名服务器和辅域名服务器配置“/var/named/db.208.164.186”文件
    本配置文件适用于主域名服务器。文件“db.208.164.186”用于映射主机名和IP地址。在“/var/named/”中创建下列文件:

    创建“db.208.164.186”文件(touch /var/named/db.208.164.186)并加入:

    ; Revision History: April 22, 1999 - [email protected]
    ; Start of Authority (SOA) records.
    $TTL 345600
    @ IN SOA deep.openarch.com. admin.mail.openarch.com. (
    00 ; Serial
    86400 ; Refresh
    7200 ; Retry
    2592000 ; Expire
    345600 ) ; Minimum
    ; Name Server (NS) records.
    NS deep.openarch.com.
    NS mail.openarch.com.
    ; Addresses Point to Canonical Names (PTR) for Reverse lookups
    1 PTR deep.openarch.com.
    2 PTR mail.openarch.com.
    3 PTR www.openarch.com.

    为主域名服务器配置“/var/named/db.openarch”文件
    本配置文件适用于主域名服务器。文件“db.openarch”用于映射主机名和IP地址。在“/var/named/”中创建下列文件:

    创建“db.openarch”文件(touch /var/named/db.openarch)并加入:

    ; Revision History: April 22, 1999 - [email protected]
    ; Start of Authority (SOA) records.
    $TTL 345600
    @ IN SOA deep.openarch.com. admin.mail.openarch.com. (
    00 ; Serial
    86400 ; Refresh
    7200 ; Retry
    2592000 ; Expire
    345600 ) ; Minimum
    ; Name Server (NS) records.
    NS deep.openarch.com.
    NS mail.openarch.com.
    ; Mail Exchange (MX) records.
    MX 0 mail.openarch.com.
    ; Address (A) records.
    localhost A 127.0.0.1
    deep A 208.164.186.1
    mail A 208.164.186.2
    www A 208.164.186.3
    ; Aliases in Canonical Name (CNAME) records.
    ;www CNAME deep.openarch.com.

    为主域名服务器和辅域名服务器配置“/var/named/db.cache”文件
    在你开始启动DNS服务器之前你必须在“/var/named/”目录中拥有文件“db.cache”。 “db.cache”文件告诉你的服务器你的服务器的“根”区带的位置。

    用以下的命令从其它的UNIX主机上(你的主域名服务器)或者从你的Red Hat Linux CD-ROM 发行源盘获取一份拷贝。

    [root@deep]# dig @.aroot-servers.net . ns > db.cache

    获取文件之后不要忘记把db.cache拷贝到你的DNS服务器“/var/named/”目录下。

    二级域名服务器(辅域名服务器)
    二级域名服务器平时可以分担主域名服务器的负载。当主服务器当机时接管主服务器的工作。二级域名服务器可以从网络上接收别的域名服务器传来的数据(通常是主域名服务器)。这个过程叫区带转移。

    建立一个二级域名服务器所需的文件包括:

    l named.conf

    l db.127.0.0

    l db.cache

    l named script

    为二级域名服务器配置“/etc/named.conf”文件
    本配置文件适用于二级域名服务器。你必须修改二级域名服务器主机上的“named.conf”文件。把除了“0.0.127.in-addr.arpa”以外每次出现的“primary”改为“secondary”并添上主域名服务器和其IP地址的记录。

    创建“named.conf”文件(touch /etc/named.conf)并加上如下几行:

    options {
    directory "/var/named";
    fetch-glue no;
    recursion no;
    allow-query { 208.164.186/24; 127.0.0/8; };
    allow-transfer { 208.164.186.1; };
    transfer-format many-answers;
    };
    // These files are not specific to any zone
    zone "." in {
    type hint;
    file "db.cache";
    };
    zone "0.0.127.in-addr.arpa" in {
    type master;
    file "db.127.0.0";
    };
    // These are our slave zone files
    zone "openarch.com" in {
    type slave;
    file "db.openarch";
    masters { 208.164.186.1; };
    };
    zone "186.164.208.in-addr.arpa" in {
    type slave;
    file "db.208.164.186";
    masters { 208.164.186.1; };
    };

    以上设置此域名服务器为区带“openarch.com”二级域名服务器,而且它应该与“208.164.186.1”主机所保存的区带信息保持一致。

    二级域名服务器不必从网络上获取所有的db文件;总括文件,“db.127.0.0”和 “db.cache”,与主域名服务器相同,所以只须在二级域名服务器中保留一份本地拷贝。

    从主域名服务器中拷贝“db.127.0.”文件到二级域名服务器。

    从主域名服务器中拷贝“db.cache”文件到二级域名服务器。

    为所有名称服务器配置“/etc/rc.d/init.d/named”脚本文件
    本配置文件适用于所有类型的名称服务器(缓存、主、辅名称服务器)。配置“/etc/rc.d/init.d/named”脚本文件用以启动和停止DNS/BIND服务器守护进程。

    创建“named”脚本文件 (touch /etc/rc.d/init.d/named) 并添加:

    #!/bin/sh
    #
    # named This shell script takes care of starting and stopping
    # named (BIND DNS server).
    #
    # chkconfig: - 55 45
    # description: named (BIND) is a Domain Name Server (DNS)
    # that is used to resolve host names to IP addresses.
    # probe: true
    # Source function library.
    . /etc/rc.d/init.d/functions
    # Source networking configuration.
    . /etc/sysconfig/network
    # Check that networking is up.
    [ ${NETWORKING} = "no" ] && exit 0
    [ -f /usr/sbin/named ] || exit 0
    [ -f /etc/named.conf ] || exit 0
    RETVAL=0
    # See how we were called.
    case "$1" in
    start)
    # Start daemons.
    echo -n "Starting named: "
    daemon named
    RETVAL=$?
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named
    echo
    ;;
    stop)
    # Stop daemons.
    echo -n "Shutting down named: "
    killproc named
    RETVAL=$?
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named
    echo
    ;;
    status)
    /usr/sbin/ndc status
    exit $?
    ;;
    restart)
    $0 stop
    $0 start
    ;;
    reload)
    /usr/sbin/ndc reload
    exit $?
    ;;
    probe)
    # named knows how to reload intelligently; we don want linuxconf
    # to offer to restart every time
    /usr/sbin/ndc reload >/dev/null 2>&1 || echo start
    exit 0
    ;;
    *)
    echo "Usage: named {start|stop|status|restart}"
    exit 1
    esac
    exit $RETVAL

    好了,现在更改脚本的缺省权限使其可以执行:

    [root@deep]# chmod 700 /etc/rc.d/init.d/named

    通过执行以下命令创建BIND/DNS到rc.d的符号链接:

    [root@deep]# chkconfig --add named

    BIND/DNS脚本不会在下次重起机器的时候自动启动named守护进程。你可以通过执行以下命令使它成为缺省设置:

    [root@deep]# chkconfig --level 345 named on

    执行以下命令手工启动DNS服务器:

    [root@deep]# /etc/rc.d/init.d/named start

    加强BIND/DNS安全性
    限制BIND运行于“虚”根(chroot)环境下。
    本部分侧重于防止BIND被黑客当作攻击运行它的主机系统的切入点。BIND要完成一项相当复杂和大型的功能,因此其安全方面的潜在漏洞出现的概率就比较高。事实上,人们已经发现BIND中的缺陷可以让一个远程的用户在一台运行BIND的主机上获取根的访问权限。

    BIND可以作为非根用户运行,这样可以把风险降到最低,可以把损害限制在一个普通用户在本地Shell所能造成的恶劣后果之内。当然,允许匿名访客用户也会极大影响大多数DNS系统的安全性,因此有必要采用进一步措施来对付它——在“虚”根环境中运行BIND。

    采用“虚”根环境最主要的优势在于它可以限制守护进程所能见到的文件系统在“虚”根之内。而且,因为这个“虚”根仅须支持BIND,“虚”根内所须的程序就非常有限。最为重要的是没有必要让转换为根用户的程序运行,可以避免通过获取根用户权限的办法来打破“虚”根的限制。

    注意:“named”程序必须位于你的PATH环境变量所列出的目录之内。如果你是根用户,而且已经安装了BIND,这肯定不成问题。在其他情况下,我们假定你的named程序位于“/usr/sbin/named”。

    找出支持运行“named”所须的共享库文件,这些文件需要拷进“虚”根之内。

    [root@deep]# ldd /usr/sbin/named
    libc.so.6 => /lib/libc.so.6 (0x40017000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

    记下上面所列之文件,过一会儿会用到它们。

    第一步:

    为运行“named”添加一个新的用户名和用户组。这是非常重要的,因为以根用户运行BIND会使“虚”根毫无意义。而用一个现存的用户帐号容易造成服务之间互相访问对方资源,不利于多层次的安全性。

    下面是用户和组id的例子,检查一下“/etc/passwd”和“/etc/group”两个文件找出尚未使用的用户和组id,我们将采用53。

    [root@deep]# groupadd -g 53 named
    [root@deep]# useradd -g 53 -u 53 named

    第二步:

    设置“虚”根环境。首先创建一个“虚”根目录。我们将选择“/chroot/named”,因为我们将它设立在隔离的文件系统内以防止文件系统遭到攻击。在早些时候我们的安装过程中为这个目的创建了一个特别的分区“/chroot”。

    [root@deep]# /etc/rc.d/init.d/named stop (仅当named守护进程在运行时)
    [root@deep]# mkdir -p /chroot/named

    接着,如下创建其余的目录:

    [root@deep]# mkdir /chroot/named/dev
    [root@deep]# mkdir /chroot/named/lib
    [root@deep]# mkdir /chroot/named/etc
    [root@deep]# mkdir -p /chroot/named/usr/sbin
    [root@deep]# mkdir -p /chroot/named/var/run

    拷贝主要配置文件,带区文件,named,named-xfer程序:

    [root@deep]# cp /etc/named.conf /chroot/named/etc/
    [root@deep]# mkdir /chroot/named/var/named
    [root@deep]# cd /var/named ; cp -a . /chroot/named/var/named/
    [root@deep]# mknod /chroot/named/dev/null c 1 3
    [root@deep]# chmod 666 /chroot/named/dev/null
    [root@deep]# cp /usr/sbin/named /chroot/named/usr/sbin/
    [root@deep]# cp /usr/sbin/named-xfer /chroot/named/usr/sbin/

    重要提示:目录“/chroot/named/var/named”及其目录内的所有文件的属主必须设成二级域名服务器下名字为“named”的进程,并且只有二级域名服务器可以进行区带转移,而你自己不能直接操作。

    欲使目录“/chroot/named/var/named”及其目录内的所有文件的属主设成二级域名服务器下名字为“named”的进程,执行以下命令:

    [root@deep]# chown -R named.named /chroot/named/var/named/

    为“named.conf”设置不可更改位:

    [root@deep]# cd /chroot/named/etc/
    [root@deep]# chattr +i named.conf

    拷贝前面查找出的共享库文件到“虚”根下的lib目录:

    [root@deep]# cp /lib/libc.so.6 /chroot/named/lib/
    [root@deep]# cp /lib/ld-linux.so.2 /chroot/named/lib/

    拷贝“localtime” and “nsswitch.conf”文件到“虚”根下以使日志文件的条目符合当地时间:

    [root@deep]# cp /etc/localtime /chroot/named/etc/
    [root@deep]# cp /etc/nsswitch.conf /chroot/named/etc/

    为“nsswitch.conf”设置不可更改位:

    [root@deep]# cd /chroot/named/etc/
    [root@deep]# chattr +i nsswitch.conf

    具有“+i”属性的文件不能被修改:它不能被删除和改名,不能创建到这个文件的链接,不能向这个文件写入数据。只有超级用户才能设置和清除这个属性。

    第三步:

    告诉syslogd守护进程新的“虚” 根服务。

    通常情况下,进程通过“/dev/log”向syslogd发送消息。由于虚” 根的限制,这种通信被禁止。因此syslogd需要改为监听“/chroot/named/dev/log”。我们可以通过编辑syslog的启动脚本来设定新的监听地点。

    编辑syslog脚本(vi +24 /etc/rc.d/init.d/syslog)作如下改动:

    daemon syslogd -m 0

    改为:

    daemon syslogd -m 0 -a /chroot/named/dev/log

    第四步:

    编辑“named”脚本(vi /etc/rc.d/init.d/named) 作如下改动:

    [ -f /usr/sbin/named ] || exit 0

    改为:

    [ -f /chroot/named/usr/sbin/named ] || exit 0

    [ -f /etc/named.conf ] || exit 0

    改为:

    [ -f /chroot/named/etc/named.conf ] || exit 0

    daemon named

    改为:

    daemon /chroot/named/usr/sbin/named -t /chroot/named/ -unamed -gnamed

    l “-t”设定named在“虚” 根环境下启动。

    l “-u”规定运行进程的用户。

    l “-g”规定运行进程的组。

    Red Hat的启动脚本的daemon()函数不允许规定替代的PID文件。但这不会影响named初始化脚本的启动和停止,因为它们是从“虚” 根以外调用的。

    在8.2版本的BIND中“ndc”命令已经编译成二进制代码,以致在本设置中,发行版的ndc没有实际用途。可以重新编译BIND源文件进行弥补。

    必须明白这些设置仅对ndc有效。如果你需要一个新的named及named xfer,应该采用原来的设置。

    为了实现这一点,在源文件的顶层目录中。

    对于ndc:

    [root@deep]# cp bind-src.tar.gz /vat/tmp
    [root@deep]# cd /var/tmp/
    [root@deep]# tar xzpf bind-src.tar.gz
    [root@deep]# cd src
    [root@deep]# cp port/linux/Makefile.set port/linux/Makefile.set-orig

    编辑“Makefile.set”文件(vi port/linux/Makefile.set)并做如下改动:

    CC=egcs -D_GNU_SOURCE
    CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
    DESTBIN=/usr/bin
    DESTSBIN=/chroot/named/usr/sbin
    DESTEXEC=/chroot/named/usr/sbin
    DESTMAN=/usr/man
    DESTHELP=/usr/lib
    DESTETC=/etc
    DESTRUN=/chroot/named/var/run
    DESTLIB=/usr/lib/bind/lib
    DESTINC=/usr/lib/bind/include
    LEX=flex -8 -I
    YACC=yacc -d
    SYSLIBS=-lfl
    INSTALL=install
    MANDIR=man
    MANROFF=cat
    CATEXT=$$N
    PS=ps -p
    AR=ar crus
    RANLIB=:

    更改Makefile前后所带来的变化是我们改变了“DESTSBIN=”, “DESTEXEC=”, 和 “DESTRUN=”三行,使其指向正确的“虚” 根路径。经过修改后,ndc程序知道到那里去寻找“named”。

    [root@deep]# make clean
    [root@deep]# make
    [root@deep]# cp bin/ndc/ndc /usr/sbin/
    [root@deep]# cp: overwrite `/usr/sbin/ndc? y
    [root@deep]# strip /usr/sbin/ndc

    我们重新编译二进制文件,并把编译“ndc”程序的结果拷贝到“/usr/sbin”目录下覆盖老版本。我们没有忘记为提高性能而优化代码。

    重建一下“named”二进制文件是一个不错的主意,这样可以确保“named”和“ndc”具有相同的版本号。

    对于named:

    [root@deep]# cd /var/tmp/src
    [root@deep]# cp port/linux/Makefile.set-orig port/linux/Makefile.set
    [root@deep]# cp: overwrite `port/linux/Makefile.set`? y

    编辑“Makefile.set”文件(vi port/linux/Makefile.set)并做如下改动:

    CC=egcs -D_GNU_SOURCE
    CDEBUG=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-
    frame-pointer -fno-exceptions
    DESTBIN=/usr/bin
    DESTSBIN=/usr/sbin
    DESTEXEC=/usr/sbin
    DESTMAN=/usr/man
    DESTHELP=/usr/lib
    DESTETC=/etc
    DESTRUN=/var/run
    DESTLIB=/usr/lib/bind/lib
    DESTINC=/usr/lib/bind/include
    LEX=flex -8 -I
    YACC=yacc -d
    SYSLIBS=-lfl
    INSTALL=install
    MANDIR=man
    MANROFF=cat
    CATEXT=$$N
    PS=ps -p
    AR=ar crus
    RANLIB=:

    [root@deep]# rm -f .settings
    [root@deep]# make clean
    [root@deep]# make
    [root@deep]# cp bin/named/named /chroot/named/usr/sbin
    [root@deep]# cp: overwrite `/chroot/named/usr/sbin/named? y
    [root@deep]# cp bin/named-xfer/named-xfer /chroot/named/usr/sbin
    [root@deep]# cp: overwrite `/chroot/named/usr/sbin/named-xfer? y
    [root@deep]# strip /chroot/named/usr/sbin/named
    [root@deep]# strip /chroot/named/usr/sbin/named-xfer

    因为编译系统可以缓存变量,我们可以删除“.settings”文件。运行“make clean”命令可以确保没有过时的垃圾残留。编译完“named”,“named-xfer”之后拷贝这两个文件到“虚” 根目录之下,并且不要忘记优化代码以提高程序性能。

    删除不必要的目录和文件

    [root@deep]# rm -f /usr/sbin/named
    [root@deep]# rm -f /usr/sbin/named-xfer
    [root@deep]# rm -f /etc/named.conf
    [root@deep]# rm -rf /var/named/

    我们从“/usr/sbin”中删除了“named”,“named-xfer”文件,因为我们已经可以让“虚”根目录之下程序拷贝来完成同样的这些日常工作。对于“named.conf”文件和“/var/named”目录,如法炮制。

    第五步:

    测试以下“虚”根环境下的配置情况!重新启动“syslogd”守护进程:

    [root@deep]# /etc/rc.d/init.d/syslog restart

    启动“虚”根环境下的新的BIND:

    [root@deep]# /etc/rc.d/init.d/named start

    核查以下以确信named正在采用新的参数运行。

    [root@deep]# ps auxw | grep named

    named 11446 0.0 1.2 2444 1580 ? S 23:09 0:00 /chroot/named/usr/sbin/named -t /chroot/named/ -unamed -gnamed

    第一列应该是“named”,表示运行这个程序的属主。最后一列应该为“named -t /chroot/named/ -unamed -gnamed”。

    清理工作
    [root@deep]# rm -rf /var/tmp/bind/

    注意:出于安全考虑,在企业内部网和外部主机之间不要架设DNS。如果仅仅通过IP地址将企业内部网同外界联系起来将极大的提高系统的安全性。

    区带(Zone)转移
    限制区带转移。

    限制区带转移可以预防:

    l 他人“借用”域名服务器。

    l 黑客列出区带的内容。

    以下是一个“named.conf”文件之中包括“allow-transfer”选项的例子:

    options {
    allow-transfer { 208.164.186.2; };
    };

    以上限制了那些二级域名服务器可以从这台域名服务器上获取区带信息。限制区带转移需注意:不仅要在主域名服务器上限制区带转移,在二级域名服务器也要限制区带转移。

    允许查询
    限制域名服务器所接受的查询可以规定:

    l 允许使用本域名服务器的IP地址范围。

    l 它们可以查询的区带。

    以下是一个“named.conf”文件之中包括“allow-query”选项的例子:

    options {
    allow-query { 208.164.186/24; 127.0.0/8; };
    };

    以上规定了能够向本台域名服务器发出请求的IP地址范围。特别的,对于运行在Internet防火墙之内的用户而言,他们有一种对于外部世界隐藏其名字空间的要求,然而同时他们又要给有限的授权用户提供域名服务。

    转发限制
    你可能需要在你的转发服务器宕机或没有应答的时候不要尝试站点之外的转发器。“forward only”选项可以实现这一功能。

    以下是一个named.conf文件之中包括“forward only”选项的例子:

    options {
    forwarders { 205.151.222.250; 205.151.222.251; };
    forward-only;
    };

    在“forwarder”一行中,“205.151.222.250”和“205.151.222.251” 分别代表你的ISP及另外的DNS服务器的IP地址。

    参考文献
    为了获取更详细的信息,可以阅读以下手册页:

    $ man dnsdomainname (1) - show the systems DNS domain name
    $ man dnskeygen (1) - generate public, private, and shared secret keys for DNS Security
    $ man dnsquery (1) - query domain name servers using resolver
    $ man named (8) - Internet domain name server (DNS)

    DNS管理工具
    以下这些命令,是我们日常维护工作时经常要用到的。但是还有许许多多的命令我们没有列出,请阅读以下手册页和其他的参考文献,以便能够得到更加详细的信息。

    dig

    “db.cache”文件规定了“根”区带服务器的位置。它必须定期更新。虽然“根”区带服务器不会经常变动,但有时确实它会变。每隔一到两个月检查一下“db.cache”文件是一个不错的实践经验。

    用以下命令为你的DNS服务器查询一下新的“db.cache”文件:

    [root@deep]# dig @.aroot-servers.net . ns > db.cache

    获取“db.cache”文件后拷贝它到 “/var/named/” 目录下。

    [root@deep]# cp db.cache /var/named/

    其中@.aroot-servers.net是你用来请求“根”区带信息文件(db.cache)服务器,而“db.cache”文件是你的新“db.cache”文件的名称。

    ndc

    这个命令允许系统管理员控制域名服务器的运行情况。如果没有命令输入,ndc将给出提示符,直到遇到文件结束符EOF为止。

    在你的终端上键入ndc及help可以看到各种命令。

    [root@deep]# ndc
    [root@deep]# ndc help

    DNS用户工具
    以下这些命令,是我们日常维护工作时经常要用到的。但是还有许许多多的命令我们没有列出,请阅读以下手册页和其他的参考文献,以便能够得到更加详细的信息。

    nslookup

    nslookup是一个用来查询Inernet域名服务器的实用程序。nslookup有两种运行模式:交互式和非交互式运行模式。交互式运行模式允许用户通过域名服务器检索各种主机,并可以打印出主机名称列表。非交互式运行模式用来打印所请求的某个主机或域的特定的信息。

    进入“nslookup”交互式运行模式,运行下面的命令:

    [root@deep]# nslookup (键入 help 获取有关 nslookup命令的详细信息).
    Default Server: deep.openarch.com
    Address: 208.164.186.3

    进入nslookup非交互式运行模式,运行下面的命令:

    [root@deep]# nslookup www.redhat.com

    非交互式运行模式用于我们已知所要查询的主机IP地址或主机名称的时候,它们通常作为“nslookup”命令的第一个参数,第二个参数通常为域名服务器的IP地址或主机名称。

    dnsquery

    dnsquery程序提供了一个通过调用BIND解释库来访问域名服务器的通用界面。应用这个程序的目的是作为“nslookup”程序的补充和替代。

    通过解释器访问域名服务器,使用命令:

    [root@deep]# dnsquery <-n nameserver>

    例如:

    [root@deep]# dnsquery -n localhost 192.168.1.2

    其中<-n nameserver>代表查询中所用的域名服务器,它可以是IP地址的形式w.x.y.z或域名两种形式(缺省在“/etc/resolv.conf”文件中指定)代表Internet上的主机或域的名字。

    host

    “host”程序用于检索Internet上的主机信息。它从遍布在世界各地的互相连接在一起的服务器来获取这些信息。缺省情况下,它仅完成域名和IP地址之间的转换。然而,“-t”及“-a”两个选项用于查询存储在域服务器内的主机的所有信息。

    通过域服务器查找主机名称,用以下命令:

    [root@deep]# host

    例如:

    [root@deep]# host deep.openarch.com

    其中表示即可以是FDQN,例如(deep.openarch.com),域名,例如 (openarch.com),主机名称,例如(deep),也可以是IP地址,例如(192.168.1.1)。

    为查询主机的所有信息,使用命令:

    [root@deep]# host <-a domain names >

    例如:

    [root@deep]# host -a openarch.com

    其中表示域名,例如(openarch.com)。这个选项用于找出域服务器内关于这台主机的所有信息。

    为获取全域的列表,使用下列命令:

    [root@deep]# host <-l domain names >

    例如:

    [root@deep]# host -l openarch.com

    其中表示域名,例如(openarch.com)。这个选项用于获取整个域(openarch.com)以主记录格式保存的区带数据,服务器内关于这台主机的所有信息。

    注意:“-l”是通过先进行一次完全的区带转移而后过滤出你所需要的信息来实现的。此项命令只有在必要时才可使用。

    安装到系统中的文件
    > /etc/rc.d/init.d/named
    > /etc/rc.d/rc0.d/K45named
    > /etc/rc.d/rc1.d/K45named
    > /etc/rc.d/rc2.d/K45named
    > /etc/rc.d/rc3.d/K45named
    > /etc/rc.d/rc4.d/K45named
    > /etc/rc.d/rc5.d/K45named
    > /etc/rc.d/rc6.d/K45named
    > /etc/named.conf
    > /usr/bin/addr
    > /usr/bin/nslookup
    > /usr/bin/dig
    > /usr/bin/dnsquery
    > /usr/bin/host
    > /usr/bin/nsupdate
    > /usr/bin/mkservdb
    > /usr/lib/bind
    > /usr/lib/bind/include
    > /usr/lib/bind/include/arpa
    > /usr/lib/bind/include/arpa/inet.h
    > /usr/lib/bind/include/arpa/nameser.h
    > /usr/lib/bind/include/arpa/nameser_compat.h
    > /usr/lib/bind/include/isc
    > /usr/lib/bind/include/isc/eventlib.h
    > /usr/lib/bind/include/isc/misc.h
    > /usr/lib/bind/include/isc/tree.h
    > /usr/lib/bind/include/isc/logging.h
    > /usr/lib/bind/include/isc/heap.h
    > /usr/lib/bind/include/isc/memcluster.h
    > /usr/lib/bind/include/isc/assertions.h
    > /usr/lib/bind/include/isc/list.h
    > /usr/lib/bind/include/isc/dst.h
    > /usr/lib/bind/include/isc/irpmarshall.h
    > /usr/lib/bind/include/netdb.h
    > /usr/lib/bind/include/resolv.h
    > /usr/lib/bind/include/res_update.h
    > /usr/lib/bind/include/irs.h
    > /usr/lib/bind/include/irp.h
    > /usr/lib/bind/include/hesiod.h
    > /usr/lib/bind/include/sys
    > /usr/lib/bind/include/net
    > /usr/lib/bind/lib
    > /usr/lib/bind/lib/libbind.a
    > /usr/lib/bind/lib/libbind_r.a
    > /usr/lib/nslookup.help
    > /usr/man/man1/dig.1
    > /usr/man/man1/host.1
    > /usr/man/man1/dnsquery.1
    > /usr/man/man1/dnskeygen.1
    > /usr/man/man3/hesiod.3
    > /usr/man/man3/gethostbyname.3
    > /usr/man/man3/inet_cidr.3
    > /usr/man/man3/resolver.3
    > /usr/man/man3/getnetent.3
    > /usr/man/man3/tsig.3
    > /usr/man/man3/getaddrinfo.3
    > /usr/man/man3/getipnodebyname.3
    > /usr/man/man5/resolver.5
    > /usr/man/man5/irs.conf.5
    > /usr/man/man5/named.conf.5
    > /usr/man/man7/hostname.7
    > /usr/man/man7/mailaddr.7
    > /usr/man/man8/named.8
    > /usr/man/man8/ndc.8
    > /usr/man/man8/named-xfer.8
    > /usr/man/man8/named-bootconf.8
    > /usr/man/man8/nslookup.8
    > /usr/man/man8/nsupdate.8
    > /usr/sbin/ndc
    > /usr/sbin/named
    > /usr/sbin/named-xfer
    > /usr/sbin/irpd
    > /usr/sbin/dnskeygen
    > /usr/sbin/named-bootconf
    > /var/named




    发布人:netbull 来自:LinuxAid