DNS服务器搭建

域名系统

域名系统DNS是一个层次命名系统,充当联网主机和资源的目录。目录中的信息将网络名称映射到数据,并且在称为资源记录的逻辑条目中维护。

DNS层次结构的顶部和分支以root域“.”开始,向下直至多个下一级别域

 

域是资源记录的集合,这些资源记录以公用名称结尾并且表示DNS名称空间的整个子树

 

顶级域

仅有一个组成部分的域。例如:.com、.net、.edu、.us、.cn等等

 

子域

指作为另一个域的子树的域。aaa.example.com是example.com的子域

 

区域

指特定名称服务器直接负责或对其具有权威的某个域的组成部分

 

DNS查询分析

Linux系统需要使用DNS服务器执行名称解析时,它将首先向/etc/resolv.conf中列出的服务器依次发送查询,直到它获得响应或查询了全部列出的服务器

本地权威数据

    当查询到达DNS服务器时,服务器首先确定正在查询的信息是否驻留在服务器对其有权威的区域中
    
    如果服务器是所查询名称或地址所属区域的权威,那么服务器将以其本地区域文件中包含的信息来响应客户端

    这种类型的响应应称为权威答案(aa),因为提供响应的服务器对提供的数据有权威

    来自名称服务器的权威答案在DNS响应的标题中开启了aa标志

本地缓存非权威数据

    如果DNS服务器不是相关记录的权威,但是最近又获取了该记录以回答之前的查询,那么它任可能在其缓存中具有一份记录副本

    缓存是用于在指定时间内存储查询到的答案,这一时间是由每个资源记录响应中称为生成时间TTL的值来确定的

    如果服务器的缓存中存在答案,则会将该答案提供给客户端。此答案将不会设置aa标志,因为服务器对提供的数据没有权威

通过递归获取的远程非权威数据

    如果DNS服务器对于正在查询的名称没有权威,则DNS服务器不会再其缓存中占有记录,DNS服务器随后将尝试通过称为递归的迭代过程来检索记录

    具有空缓存的DNS服务器将按照从其本地预填充根hints文件中检索的IP地址查询其中一个根名称服务器,从而开启递归过程

    根名称服务器随后可能将以引用响应,这表明名称服务器对于包含所查询名称的TLD具有权威

    在收到引用后,DNS服务器随后将对作为引用的TLD权威名称服务器执行另一个迭代查询

    根据正在查询的名称中是否有更多剩余委派,该权威名称服务器将发送权威答案或者另一个引用。此操作将继续,直到到达权威服务器且权威服务器使用权威答案做出响应

    最终答案以及在最终答案之前获取的所有中间答案都将由DNS服务器进行缓存以提高性能

 

DNS资源记录

资源记录包含以下元素:

    owner-name 该资源记录的名称

    TTL 资源记录的生存时间(秒)。这会指定DNS解析器应缓存此资源记录的时间长度

    class 记录的“类”,几乎总是IN(表示Internet)

    type 类型表示此记录存储的信息的排序

    data 此记录存储的数据。确切格式根据记录类型而不同
记录类型解析 A记录 A资源记录将主机名映射到IPv4地址 example.com. IN A
192.168.1.1 AAAA记录 AAAA资源记录将主机名映射到IPv6地址 CNAME记录 将一个记录别名化为另一个记录,其中应具有A或AAAA记录 ftp IN CNAME www PTR记录 将IPv4或IPv6地址映射到主机名。它们用于反向DNS解析 192.168.1.1 IN PTR www.example.com NS记录 将域名映射到DNS名称服务器,而后者对其DNS区域具有权威 @ IN NS dns.example.com. SOA授权起始记录 提供有关DNS区域工作方式的信息 每个区域正好有一个SOA记录 其指定区域的哪个名称服务是主要名称服务器(主)、有关次要(从)名称服务器应如何更新其信息副本的信息以及区域的管理方式 Master nameserver 名称服务器的主机名,该名称服务是域信息的原始来源,并且可能会接受动态DNS更新 RNAME DNS区域负责人的电子邮件地址 Serial number 区域的版本号,随着对区域记录的任何更改而增加 Refresh 从服务器应检查区域更新的频率(单位:s) Retry 从服务器在重试失败的刷新之前应等待的时间(单位:s) Expiry 如果刷新失败,从服务器在停止使用其旧的区域副本响应查询之前应等待的时间(单位:s) Minimum 如果解析器查找某个名称并且该名称不存在(获得不存在的域(NXDOMAIN)响应),解析器应将“记录不存在”这一新兴进行缓存的持续时间(单位:s)

 

提供域名服务软件

1 bind(以此软件为例)
2 unbound

 

yum安装

1 yum install -y bind bind-libs bind-utils

 

编译安装

# 编译安装

    # 下载 https://www.isc.org/downloads/

    tar -xvzf bind-9.11.3.tar.gz

    cd bind-9.11.3 

    groupadd -g 53 -r named

    useradd -u 53 -g named -r named

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

    make install

# 添加环境变量bind工具

    vim /etc/profile.d/named.sh

        export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH

    . /etc/profile.d/named.sh

# 导出库文件,让库文件能被调用

    vim /etc/ld.so.conf.d/name/conf

        /usr/local/bind9/lib

# 通知系统重读文件,导出bind库文件,并生成库文件

    ldconfig -v

# 导出头文件

    ln -sv /usr/local/bind9/include /usr/include/named

# 添加man文件的搜索路径

    vim /etc/man.config

        MANPATH /usr/local/bind9/share/man

# 添加主配置文件

    vim /etc/named/named.conf

        options {
            directory "/var/named";
        };

        zone "." IN {
            type hint;
            file "name.ca";
        };

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

        zone "0.0.127.in-addr.arpa" IN {
            type master;
            file "named.local";
            allow-update { none; }; 
        };
    
    mkdir /var/named

# 创建file文件

    cd /var/named

    dig -t NS . @192.168.198.2 > /var/named/named.ca

    vim localhost.zone

        $TTL 1d
        @   IN  SOA localhost.  admin.localhost(
            20180407
            1h
            5m
            7d
            1d
        )
        IN  NS  localhost.
        localhost.  IN  A   127.0.0.1

    cp localhost.zone named.local 

    vim named.local

        # 修改最后一条

        1   IN  PTR localhost.

    chmod 640 ./*

    chown :named ./*

    chmod 640 /etc/named/named.conf

    chown :named /etc/named/named.conf

# 启动named服务

    # 使用named用户运行、打开调试功能、运行级别为3

    named -u named -f -g -d 3 

    # 单纯运行在后台

    named -u named

# 使用rndc管理配置文件

    rndc-confgen -r /dev/urandom > /etc/named/rndc.conf

# 编辑named.conf追击rndc指定内容

    vim /etc/named/named.conf

    # Use with the following in named.conf, adjusting the allow list as needed:
    # key "rndc-key" {
    #     algorithm hmac-md5;
    #     secret "DQgSp/8GM9QPiJIOJ1BIsQ==";
    # };
    # 
    # controls {
    #     inet 127.0.0.1 port 953
    #         allow { 127.0.0.1; } keys { "rndc-key"; };
    # };
    # End of named.conf

    :.,$-1s@^#@@g

# named重读配置文件

    killall -SIGHUP named

# 使用rndc管理named

    rndc status

    rndc reload

# bind增强功能

    cd /usr/local/src/bind-9.11.3/contrib

    # 增强功能脚本

        cd ./script

    # 性能测试、压力测试

        cd queryperf/

    # 使用该功能

        ./configure

        make

    # 简单使用 

        cp queryperf /usr/local/bind9/bin/

        # 提供测试文件,指明对哪些域名请求解析

            vim test

                www.example.com A

                exmaple.com NS

                exmaple.com MX

                ftp.example.com A

                imap4.exmaple.com A

                # 复制多几条记录,来个几万、几十万条都不过分

                :1,$y

        queryperf -d test -s 192.168.198.128

# 开启查询日志

    rndc querylog

    rndc status

    # 会极大影响性能
View Code

 

主DNS服务器搭建

编辑主配置文件/etc/named.conf

# 将监听本地修改为监听所有

listen-on port 53 { any; };

# 将只运行本地查询修改为允许所有查询

allow-query     { any; };

# 追加转发DNS服务,当自己没有请求记录时,转发至指定DNS服务器,可指定也可以不指定

# forwarders { 8.8.8.8 }

# 本实验不考虑安全模块相关

recursion no;
dnssec-enable no;
dnssec-validation no;

# 追加域配置信息

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

# 追加反向解析配置信息

zone "198.168.192.in-addr.arpa" IN {
        type master;
        file "reverse";
};

 

编辑域记录文件

cd /var/named

为了方便拷贝配置文件

cp named.localhost example

cp named.localhost reverse

 

编辑example文件

@       IN SOA dns.example.com. root.example.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

@       IN      NS      dns.example.com.
dns     IN      NS      192.168.198.128
@       IN      MX 5    mail.example.com.
mail    IN      A       192.168.198.128
www     IN      A       192.168.198.128
ftp     IN      CNAME   www

 

编辑reverse文件

@       IN SOA  dns.example.com. root.example.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       IN      NS      dns.example.com.
128     IN      PTR     dns.example.com.
@       IN      MX 5    mail.example.com.
128     IN      PTR     mail.example.com.
128     IN      PTR     www.example.com.

 

修改文件权限

chgrp named example reverse

 

重启服务,并添加开机自启(防火墙配置不在此内容,防火墙配置可以参考本人博客)

1 systemctl enable named.service
2 systemctl restart  named.service

 

测试

vim /etc/resolv.conf

    # 指定DNS服务器
    nameserver 192.168.198.128

netstat -ntlp

    tcp        0      0 192.168.198.128:53      0.0.0.0:*               LISTEN      7316/named

nslookup反向解析域名

    > 192.168.198.128
    Server:        192.168.198.128
    Address:    192.168.198.128#53

    128.198.168.192.in-addr.arpa    name = dns.example.com.
    128.198.168.192.in-addr.arpa    name = www.example.com.
    128.198.168.192.in-addr.arpa    name = mail.example.com.

host查询域名信息

    host www.example.com

    www.example.com has address 192.168.198.128

dig查询域名详细

    dig -x 192.168.198.128

    dig -t mx|ns|soa exmaple.com

 

 

从DNS服务器搭建

编辑主配置文件

# 与主DNS服务修改差不多

listen-on port 53 { any; };

allow-query     { any; };

recursion no;

dnssec-enable no;

dnssec-validation no;

zone "example.com" IN {
        type slave;
        file "slaves/example_slave";
        masters { 192.168.198.128 };
};

zone "198.168.192-in-addr.arpa" IN {
        type slave;
        file "slaves/reverse_slave";
        masters { 192.168.198.128 };
};

 

重启服务即可

 

子域DNS服务器搭建

编辑主配置文件

# 与主DNS服务修改差不多

listen-on port 53 { any; };

allow-query     { any; };

recursion no;

dnssec-enable no;

dnssec-validation no;

zone "sub.example.com" IN {
        type master;
        file "example_sub";
};

zone "198.168.192-in-addr.arpa" IN {
        type master;
        file "reverse_sub";
};

 

编辑域记录文件

cd /var/named

为了方便拷贝配置文件

cp named.localhost example_sub

cp named.localhost reverse_sub

 

编辑example_sub文件

@       IN SOA dns.sub.example.com. root.sub.example.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

@       IN      NS      dns.sub.example.com.
dns     IN      NS      192.168.198.129
@       IN      MX 5    mail.sub.example.com.
mail    IN      A       192.168.198.129
www     IN      A       192.168.198.129
ftp     IN      CNAME   www

 

编辑reverse_sub文件

@       IN SOA  dns.sub.example.com. root.sub.example.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       IN      NS      dns.sub.example.com.
129     IN      PTR     dns.sub.example.com.
@       IN      MX 5    mail.sub.example.com.
129     IN      PTR     mail.sub.example.com.
129     IN      PTR     www.sub.example.com.

 

修改文件权限

1 chgrp named example_sub reverse_sub

 

验证方式同主DNS服务验证方式相同

 

DNS服务转发

非本DNS域内的解析全部转发

options{
    ...
    recursion yes;
    forward first;
    # forward (first|only)
    forwards { 114.114.114.114 };
}

 

非本子域DNS内的解析全部转发给父域

  子域DNS服务器中新建一个域,专门用于转发

zone "example.com" IN {
            type forward;
            forward only;
            forward { 192.168.180.129; };
}

 

关闭安全模块

dnssec-enable no;
dnssec-validation no;

 

DNF服务器的安全配置

acl

  把一个或多个地址归并为一个集合,并通过一个统一的名字调用

acl slaves {
    192.168.180.130;
};

 

内置acl

  none    没有一个主机

  any      任意主机

  local     本机

  localnet     与本机IP同一网段的其它IP

 

注意

  acl只能先定义,后使用,因此,其一般定义在配置文件options的前面

 

访问控制指令

allow-query {};     # 允许查询的主机:白名单。    一般 any
allow-transfer {};  # 允许区域传送的主机:白名单。 一般 slave
allow-recursion {}; # 允许递归的主机 。          一般 LAN
allow-update {};    # 允许更新区域数据库中的内容。作用:当dhcp分配给服务器的IP地址更改的,DHCP能通知DNS服务更改记录。一般 none

 

 View使用

背景

  来自外网的用户我们希望能解析到服务器的外网地址

  来自内网的用户我们希望能解析到服务器的内网地址

 

定义

  一个bind服务器可以定义多个view,每个view中可以定义一个或多个zone

  每个view用来匹配一组客户端

  多个view内可能需要对同一个区域进行解析,但使用了不同的区域解析库文件

 

注意

  客户端请求到到达时,是自上而下检查每个view所服务的客户端列表

  一但启用view,所有的zone必须再view中定义

  仅有必要在匹配到允许递归请求的客户端所在的view中定义根区域

 

智能DNS

  dnspod

  dns.la

 

简单实例

  网络情况

    网关有三块网卡

    172.16.0.1

    192.168.1.254

    192.168.0.254

    DNS服务器 172.16.x.x

    本机 192.168.0.13

  目的

    来自 172.16.x.x 访问DNS服务器解析到私网地址
    来自 192.168.0.x 访问DNS服务器解析到公网地址

# 移动根区域到 named.rfc1912.zones 中

# 配置acl

    acl mynet {
        172.16.0.0/16;
        127.0.0.1/8;
    };

# 配置view

    vim named.rfc1912.zones

        view interal {
            match-clients { mynet; };
            allow-recursion { mynet; };

            zone ...
            ...

        };

        view exteral {
            match-clients { any; };
            zone "example.com" IN {
                type master;
                file "example.com.exteral";
                allow-update { none; };
            }
        }

# 编辑example.com.exteral指定专门为外网用户解析的IP地址

    ...

# 检查语法错误

    named-checkconf

# 重启服务验证即可
View Code

 

posted @ 2018-01-21 22:25  前路~  阅读(296)  评论(0编辑  收藏  举报