首页 > 代码库 > DNS服务器的搭建

DNS服务器的搭建

DNS: Domain Name Service
    C/S
        S: bind   bekerley internet name domain
        C: 共享库

    53/udp, 53/tcp

   

    名称解析:主机名解析
        把一种名称转换为另一种名称的过程
        名称:字串、数字

        解析库:某种存储
            username <--> uid

            某种存储:
                文本文件
                关系型数据库
                LDAP:Lightweight Directory Access Protocol, 389/tcp

        解析:根所用户所提供一种名称,去查询解析库,以得到另一种名称

    hosts: 文本文件
        IANA:
            文本文件
            ftp:--> DNS(中心服务器)

        Unix:

        向下授权管理机制

        根域:root domain
            一级域:top-level domain(顶级域)
            二级域:公司、组织、个人使用
            主机:www
                     其中根域和顶级域是有inan直接管理分配的

        递归:
            A --> B --> C –> D        A问B;B自己不知道,但B知道C有A要的结果,然后B去找C要结果;但C自己也不知道,但C知道D有A要的结果,然后C去找D要结果;得到结果后逐级上报结果,D给C,C给B,B给A

        迭代:
            A --> B
            A --> C
            A –> D

        互联网上是     递归 + 迭代的方式,

    根结点:全球的根节点一共13个

    DNS中的名称与对应的主机的真实主机名不要求是一样。这可以实现负载均衡
        一个名称可以对应多个IP
        一个IP上也可以多个名称

    DNS名称解析:
        FQDN --> IP正向解析
        IP --> FQDN反向解析。邮件服务器要求必须是反向解析的,负责认为是垃圾邮箱服务

       反向解析的域名后缀  .in-addr.arpa

    一级域:
        组织域: .com, .org, .net, .mil军事组织, .edu, .gov政府组织,                .info, .cc, .me, .tv
        国家域:.cn, .us, .uk, .jp, .tw, .hk, .iq, .ir
        反向域:.in-addr.arpa

    域:domain是一个逻辑概念, 区域:zone是一个物理概念,任何一个解析库都叫做一个区域,故一个域有2个区域,但并不是域包含区域,层级不同。
        正向解析:FQDN --> IP
            正向解析库     从物理概念来讲是个文件
        反向解析:IP --> FQDN
            反向解析库     从物理概念来讲也是个文件

    区域解析库:
        资源记录:rr(resource record)     每一行的条目,用来标记不同的身份
            有类型的概念:用于标记此记录解析的属性
                SOA: Start Of Authority, 起始授权记录,一个区域文件只能有一个,标记这个NS服务器区域由谁来管理;
                NS:Name Server名称服务器,可以有多个
                MX: Mail eXchange, 邮件交换器,MX记录有优先级属性(0-99);
                A:FQDN --> IP,专用于正向解析库
                PTR: IP --> FQDN,专用于反向解析库
                AAAA:FQDN --> IPv6,专用于正向解析库
                CNAME: Canonical Name,正式名称

    DNS查询:
        递归
        迭代

        hosts --> local dns cache --> dns server (cache) --> 迭代

        非权威应答:通过缓存,未必准确

客户端要接入互联网就要给其DNS指向,linux是在/etc/resolv.conf里面用nameserver配置指向DNS服务器的,可以有多个,一般只有第一个生效,在第一个出问题后第二个才生效

    DNS服务器类型:
        主DNS服务器
        从DNS服务器
        缓存服务器:只负责一半的任务,不用注册,只管出去迭代,而不给外部解析本地。

        解析库文件同步的过程:区域传送 (单方向传送)
            zone transfer

                完全区域传送:axfr
                增量区域传送: ixfr

                周期性检查 + 通知

子域授权:

    为什么要创建子域呢?比如在一个大公司中申请了一个域名,但公司有上百台主机,而且每个不同的部门要求自我独立互不影响,此时一个域管理起来就很困难了,所以在这个域下划分几个子域来实现更好的管理。

wKioL1PiaCPgKIF2AAF64kXUO3U831.jpg

    正向子域授权:

               只需要在父域的区域解析库中添加“胶水记录”, glue record

                  子域名称      IN     NS  子域的名称服务器,注意每个子域可能有主从多台服务器,此时用ns,ns2,ns3,……。
                ops     IN      NS      ns.ops
                 ns.ops     IN         A       172.16.100.77
               

        子域和父域不一定在同一网段下,只要2个能够通信即可。例如,这里用父域172.16.249.191;子域是192.168.1.199。

  先编辑/var/named/mageedu.com.zone加入我们所需的条目

wKioL1PiaDjj0I8QAACk5oeBl8c029.jpg

重新载入# rndc reload

wKiom1PiZzSzbm2oAAAwLY45gX4482.jpg

本地测试# dig -t NS ops.mageedu.com @172.16.249.191

wKiom1PiZ0biCwYmAAFunnFboVs649.jpg为什么解不到了,本地有记录的啊。

我们做完全区域传送看下# dig -t AXFR mageedu.com @172.16.249.191

wKioL1PiaG6S5pAXAAKT7wLwP0U197.jpg其实是因为此时子域服务器还未建立,所以一切都无法响应

 

接下来我们建立子域服务器:我们子域的地址是:192.168.1.199

     进入我们所在主机,安装bind后  在# vim /etc/named.conf中把不方便我们实验的东西注释掉;然后直接启动named,由于是第一次安装启动bind,所有启动是生成/etc/rndc.key会慢些。完成后,编辑# vim /etc/named.rfc1912.zones文件,定义新的区域:zone   “ops.mageedu.com” IN  {

                                                                                                           type    master;

                                                                                                            file    “ops.mageedu.com.zone”;

                                                                                                             };

    配置好后,本地测试# dig -t A mail.ops.mageedu.com @192.168.1.199

wKioL1PiaH2QoLjRAAISaJ00RLU815.jpg

而后去父节点测试# dig -t NS ops.mageedu.com @172.16.249.191

wKiom1PiZ3bjTK-lAAHT86U3myk232.jpg此时OK。

 

配置转发器:

# vim /etc/named.conf配置

wKioL1PiaKLBiPmRAABQuX4XB1M173.jpg加入允许递归项和转发对象:172.16.249.191就当前而言就是父域的服务器。

# named-checkconf

wKioL1PiaLKTKPlsAAAc9ui0fno894.jpg检测语法是否有误。

# rndc reconfig重读配置文件

wKiom1PiZ6vDidnvAAAbYRdaOs0696.jpg

# dig -t A www.mageedu.com @192.168.1.199解析mageedu.com域

wKioL1PiaNHCNqrfAAIB27EVpTc464.jpg。这里转发的是所有的非本机负责的区域给父级DNS服务器。

                    也可以转发某个或某些特定的区域给上层DNS服务器;配置转发器:

   首先改变/etc/named.conf的配置,然后清空缓存#rndc flush

wKioL1PiaODTrBV3AAAVZd9Asec857.jpg

配置#vim /etc/named.rfc1912.zones文件

wKiom1PiZ9SQCkuSAABIZKGNiaM316.jpg

检查

wKioL1PiaPviH6sFAAA0FrEW9kA204.jpg

此时想解析# dig -t A www.sohu.com就解析不了了

wKioL1PiaQjD8K01AACtMw-yy3Y451.jpg

 

 

 

 

 

    编译安装

    首先得到所需的bind源代码,此处以bind-9.9.5为例,解压后cd到bind-9.9.5下

  确保系统用户named的存在,不存在则添加之。

# ./configure --prefix=/usr/local/bind9.9.5 --sysconfdir=/etc/named/ --enable-threads --disable-chroot --disable-ipv6

wKiom1PiZ_-haiFKAAIZBeB2HjA371.jpg

# make && make install。

# vim /etc/profile.d/bind.sh

wKioL1PiaSnDNRsXAAA2vm2IY0Y290.jpg

提供主配置文件/etc/named/named.conf

为根及localhost提供区域解析库

# dig -t NS . @a.root-servers.net > /var/named/named.ca

# named-checkconfig
    # named -g -u named -c /etc/named/named.conf

    # named -u named

、提供rndc
    # rndc-confgen -r /dev/urandom > /etc/named/rndc.conf
    # chown root:named /etc/named/rndc.conf
    # chmod 440 /etc/named/rndc.conf

把rndc.conf中的后半段复制到named.conf中,并启用之;

提供脚本

                #!/bin/bash
                #
                # description: named daemon
                # chkconfig: - 25 80
                #
                pidFile=/usr/local/bind9/var/run/named.pid
                lockFile=/var/lock/subsys/named
                confFile=/etc/named/named.conf

                [ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions

                start() {
                    if [ -e $lockFile ]; then
                        echo "named is already running..."
                        exit 0
                    fi

                    echo -n "Starting named:"
                    daemon --pidfile "$pidFile" /usr/local/bind9/sbin/named -u named -c "$confFile"
                    RETVAL=$?
                    echo

                    if [ $RETVAL -eq 0 ]; then
                        touch $lockFile
                        return $RETVAL
                    else
                        rm -f $lockFile $pidFile
                        return 1
                    fi
                }

                stop() {
                    if [ ! -e $lockFile ]; then
                        echo "named is stopped."
                    #    exit 0
                    fi

                    echo -n "Stopping named:"
                    killproc named
                    RETVAL=$?
                    echo

                    if [ $RETVAL -eq 0 ];then
                        rm -f $lockFile $pidFile
                        return 0
                    else
                        echo "Cannot stop named."
                        failure
                        return 1
                    fi
                }

                restart() {
                    stop
                    sleep 2
                    start
                }

                reload() {
                    echo -n "Reloading named: "
                    killproc named -HUP
                    #killall -HUP named
                    RETVAL=$?
                    echo
                    return $RETVAL
                }

                status() {
                    if pidof named &> /dev/null; then
                        echo -n "named is running..."
                        success
                        echo
                    else
                        echo -n "named is stopped..."
                        success
                        echo
                    fi
                }

                usage() {
                    echo "Usage: named {start|stop|restart|status|reload}"
                }

                case $1 in
                start)
                    start ;;
                stop)
                    stop ;;
                restart)
                    restart ;;
                status)
                    status ;;
                reload)
                    reload ;;
                *)
                    usage
                    exit 4
                    ;;   
                esac