DNS服务器是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写,它是由解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。域名服务器为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。


在linux中将这种协议实现的app叫做bind,我们适应rpm -ql 查看bind软件安装时都给我们安装了些什么目录和文件:

/etc/named:DNS的配置文件

/etc/named:DNS的主配置文件

/etc/rc.d/init.d/named:服务启动脚本

/etc/rndc.conf:远程管理DNS服务器的工具

/etc/rndc.key:远程管理DNS服务器的秘钥

/etc/sysconfig/named:DNS系统配置文件

注释:rndc: Remote Name Domain Controller 远程管理BIND的工具 rndc: 密钥 rndc: 持有一半密钥,保存于rndc的配置文件中 BIND:持有一半密钥,保存于主配置文件中
rndc的配置文件/etc/rndc.conf CentOS, RHEL: 密钥文件/etc/rndc.key

linux DNS_linux

以及安装bind软件包默认的二进制可执行文件

/usr/sbin/rndc-confgen使用此命令可以生成秘钥文件

/usr/sbin/named:DNS服务二进制可执行文件

/usr/sbin/named-checkconf:检查主配置文件是否有语法错误

/usr/sbin/named-checkzone:检查区域配置文件是否有语法错误

linux DNS_计算机_02

/var/log/named.log:DNS服务器的日志文件

/var/named:DNS的区域配置文件保存在此目录中

/var/named/slaves:主辅同步时,辅DNS服务器默认的区域配置文件保存在此目

/var/named/run:运行时会在/var/run/目录下有一个named进程的pid:named.pid

linux DNS_配置文件_03

下面列出 /etc/named.conf 中使用的常用配置语句。

named.conf 中使用的常用配置语

下面对常用的语句作进一步的说明。

include

include 语句的功能为:将指定的文件引入 named.conf 主配置文件。语法为:

include "path";
  • 建议使用绝对路径

  • 若使用相对路径,则相对于 directory 选项指定的目录

options

options 用于定义全局配置选项,语法为:

options { 配置子句; 配置子句;};

下面列出一些常用的全局配置子句。

子句说明
directory “path”定义服务器区数据库文件的工作目录,配置文件中所有使用的相对路径,指的都是在这里配置的目录下。Ubuntu 默认为 /var/cache/bind
notify yes/no若 named 是主服务器,当区数据库变化时将自动通知相应区的从服务器,默认为 yes
recursion yes/no是否使用递归式 DNS 服务器,默认为 yes
transfer-format one-answer/many-anser设置从主服务器向从服务器复制数据的方式,使用在主域名服务器上,是否允许在一条消息中放入多条应答信息,默认值为 many-answer
forwarders {IPaddrs}设置全局转发器,列出要用作转发器的服务器 IP 地址
forward only/first若值为 only,则服务器缓存数据并查询转发器,但从不查询其他的任何服务器,若转发器不能响应查询则查询失败;若值为 first,则在转发查询失败或没有查到结果时,会在本地发起正常查询。默认为 first
zone

zone 区声明是配置文件中最重要的部分。Zone 语句的格式为:

zone  “zone-name” IN { type  子句; file 子句; 其他子句;};

下面列出一些常用的 zone 配置子句。

子句说明
type master/slave/hint/forward说明一个区的类型。master:说明一个区为主域名服务器;slave说明一个区为辅助域名服务器;hint:说明一个区为根服务器的线索;forward:说明一个区为转发区
file “filename”说明一个区的域信息源数据库信息文件名

DNS 数据库

一个域的 DNS 数据库是由这个域的主域名服务器的管理员所维护的文本文件的集合。这些文件经常被称为区文件,区文件定义了一个区的域名信息。Ubuntu 默认将区文件存放在 /var/cache/bind 目录下。

每个区文件都是由若干个资源记录(RR,resource records)和分析器指令所组成。

资源记录简介

标准资源记录的基本格式是:

[name]  [ttl]  [class]  type  data

各个字段之间由空格或制表符分隔,字段可以包含如下的特殊字符:

  • ; — 引出注释

  • @ — 表示当前域

  • () — 允许数据跨行,通常用于 SOA 记录

  • * — 仅用于 name 字段的通配符

name 字段
name 字段说明资源记录引用的对象名,可以是一台单独的主机也可以是个域名。
  • 对象名可以是相对域名或全域名,全域名应该以“.”结束

  • 若几条连续的 RR 记录涉及同一个对象名,则第一条 RR 记录后的 RR 记录可以省略对象名

  • 若出现字段名字段,则必须出现在第一个字段

ttl 字段

ttl(time to live) 字段是一个寿命字段。它以秒为单位定义该资源记录中的信息存放在高速缓存中的时间长度。通常省略该字段,而使用位于文件开始处的 $TTL 语句所指定值。

class 字段

class 字段用于指定网络类型,可选的值有:IN、CH 和 HS,其中 IN (Internet)是广泛使用的一种。虽然 IN 是该字段的默认值,但通常我们会显示地指出。

type 字段

type 字段用于说明 RR 的类型。常用的 RR 类型如下:


类型说明
区记录SOA (Start Of Authority)SOA 记录标示一个授权区定义的开始。SOA 记录后的所有信息是控制这个区的

NS (Name Server)标识区的域名服务器以及授权子域
基本记录A (Address)用于将主机名转换为 IP 地址,任何一个主机都只能有一个 A记录

PTR (PoinTeR)将地址转换为主机名

MX (Mail eXchanger)邮件交换记录。控制邮件的路由
安全记录KEY (Public Key)储存一个关于DNS 名称的公钥

NXT (Next)与 DNSSEC 一起使用,用于指出一个特定名称不在域中

SIG (Signatrue)指出带签名和身份认证的区信息,细节见 RFC 2535
可选记录CNAME (Canonical NAME)给定主机的别名,主机的规范名在A记录中给出

SRV (Services)指出知名网络服务的信息

TXT (Text)注释或非关键的信息

关于RR 的书写顺序

  • SOA RR 应该放在最前面

  • 通常 NS RR 紧跟在 SOA RR 之后

  • 其他记录的顺序无关紧要

data 字段

data 字段的内容取决于 RR 的类型字段。

常用的资源记录
SOA 资源记录

SOA RR 用于标示一个区的开始,其格式如下:

zone      IN      SOA   Hostname  Contact (                        SerialNumber                        Refresh                        Retry                        Expire                        Minimum )

zone      IN      SOA   Hostname  Contact (                        SerialNumber                        Refresh                        Retry                        Expire                        Minimum )

SOA 记录的数据说明

Hostname
存放本 Zone 的域名服务器的主机名
Contact
管理域的管理员的邮件地址
SerialNumber
本区配置数据的序列号,用于从服务器判断何时获取最新的区数据
Refresh
辅助域名服务器多长时间更新数据库
Retry
若辅助域名服务器更新数据失败,多长时间再试
Expire
若辅助域名服务器无法从主服务器上更新数据,原有的数据何时失效
Minimum

设置被缓存的否定回答的存活时间

列如:

               SOA:
               name: 区域名称, 通常可以简写为@,例如:Mozilla.com.
               value: 主DNS服务器的FQDN
               注意:SOA必须是区域数据库文件第一条记录

               例子:@      600        IN  SOA  ns.magedu.com.  dnsadmin.magedu.com.  (
                       serial number ;序列号,十进制数字,不能超过10位,通常使用日期,例如2014031001
                       refresh time  ;刷新时间,即每隔多久到主服务器检查一次
                       retry time    ;重试时间,应该小于refresh time
                       expire time   ;过期时间
                       negative answer ttl  ;否定答案的ttl
               )  

NS:name: 区域名称,通常可以简写为@  value: DNS服务器的FQDN(可以使用相对名称)
例子:@     600     IN  NS  ns
A: 只能定义在正向区域数据库文件中 name: FQDN(可以使用相对名称) value: IP
例子:
                   www        600        IN         A             1.2.3.4
                   www        600        IN         A             1.2.3.5
                   www        600        IN         A             1.2.3.4
                   ftp        600        IN         A             1.2.3.4            
MX: 可以有多个 name: 区域名称,用于标识smtp服务器 value: 包含优先级和FQDN 优先级:0-99, 数字越小,级别越高; 例子:
                   @     600     IN     MX   10   mail
                   @     600     IN     MX   20   mail2

CNAME: name: FQDN value: FQDN 例子:
                   ftp     IN     CNAME  www
                   mail      IN  CNAME  www
PTR: IP-->FQDN, 只能定义在反向区域数据文件中,反向区域名称为逆向网络地址加.in-addr.arpa.后缀组成   name: IP, 逆向的主机地址,例如172.16.100.7的name为7.100,完全格式为7.100.16.172.in-addr.arpa. value: FQDN
                   例子:
                   4.3.2         600      IN      PTR      www.Mozilla.com
.


区域传送:
       辅助DNS服务器从主DNS服务器或其它的辅助DNS服务器请求传输数据的过程;完全区域传送:传送区域的所有数据, AXFR(主辅第一次同步更新传送区域时) 增量区域传送:传送区域中改变的数据部分,IXFR(当主DNS服务器每次修改序列号时间)


linux DNS_计算机_04

构建主从服务器

主DNS服务器的配置文件

linux DNS_计算机_05

在主配置文件下我们添加一个名为Mozilla.com的区域allow-transfer只允许指定ip传送区域文件

linux DNS_IP地址_06

然后再到/var/named/下创建一个与file:Mozilla.com.zone 同名的文件,指定辅助DNS服务器的IP地址

linux DNS_配置文件_07

然后再去修改/etc/rc.d/init.d/named 将 -a 后面加上-r /dev/random 叫他默认去/dev/random下读取随机数

linux DNS_配置文件_08

启动服务

linux DNS_域名服务器_09

查看pid

linux DNS_IP地址_10

查看系统服务的端口,DNS服务器默认监听在53端口

linux DNS_域名服务器_11

使用客户端验证, nslookup 命令 set q=A  说明请求的是A记录

linux DNS_配置文件_12

然后再到DNS2创建一个名为Mozilla.con的域,type:slave file:slaves/Mozilla.com

linux DNS_IP地址_13

检查配置文件是否有语法错误

linux DNS_linux_14

启动服务之后,查看日志

linux DNS_linux_15

然后cd到指定目录下查看:区域配置文件是否同步,同步成功

linux DNS_IP地址_16

使用nslookup查看辅助服务器是否运行正常,能够正常解析域名

linux DNS_linux_17

linux DNS_IP地址_18

linux DNS_IP地址_19

子域授权

如下图所示:在DNS1配置文件中添加,授权子域的ns记录以及对用的A记录,以及将序列号改成6

linux DNS_配置文件_20

如下图所示:使用named-checkzone 检查配置文件是否有语法错误

linux DNS_计算机_21

如下图所示:重新加载服务配置文件,查看日志 传送完成没有任何的错误信息

linux DNS_配置文件_22

如下图所示:

辅助DNS服务器也要手动重新加载数据库,因为同步时间还没到,我们在这里我们设置的一天 数据已经成功更新过来了,增量区域传送:传送区域中改变的数据部分,IXFR(

linux DNS_配置文件_23

如下图所示:在子域服务器上添加区域“FireFox.Mozilla.com”

linux DNS_linux_24

如下图所示:同样/var/named/下创建一个与file:FireFox.Mozill.com.zone相同名称的文件

linux DNS_配置文件_25

如下图所示:检查配置文件

linux DNS_linux_26

如下图所示:启动服务

linux DNS_IP地址_27

如下图所示:在父DNS服务器上解析子域的A记录www.FireFox.Mozilla.com  解析成功

linux DNS_域名服务器_28

如下图所示:验证

linux DNS_计算机_29

linux DNS_IP地址_30

构建DNS转发器

如下图所示:在option字段设置全局转发,以及区域转发(区域转发,只转发该区域的名称解析)

linux DNS_计算机_31

如下图所示:创建区域配置文件

linux DNS_配置文件_32

如下图所示:创建区域名称解析配置文件

linux DNS_域名服务器_33

如下图所示:验证

linux DNS_linux_34

linux DNS_域名服务器_35

#####:如下所示:定义acl创建视图区域

// named.conf
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
// See /usr/share/doc/bind*/sample/ for example named configuration files.
acl    in_net {
   192.168.1.0/24;
   192.168.10.0/24;
};

acl    ex_net {
   220.220.1.0/24;
};
options {
   directory     "/var/named";
   forward     only;
   forwarders { 192.168.1.4; };
#    dump-file     "/var/named/data/cache_dump.db";
#        statistics-file "/var/named/data/named_stats.txt";
#        memstatistics-file "/var/named/data/named_mem_stats.txt";
#    allow-query     { localhost; };
   recursion yes;

#    dnssec-enable yes;
#    dnssec-validation yes;
#    dnssec-lookaside auto;

   /* Path to ISC DLV key */
};

logging {
       channel default_debug {
               file "data/named.run";
               severity dynamic;
       };
};

view  in_net {
match-clients { in_net; };
zone "." IN {
   type hint;
   file "named.ca";
};
zone "localhost.localdomain" IN {
       type master;
       file "named.localhost";
       allow-update { none; };
};
zone "localhost" IN {
       type master;
       file "named.localhost";
       allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
       type master;
       file "named.loopback";
       allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
       type master;
       file "named.loopback";
       allow-update { none; };
};
zone "0.in-addr.arpa" IN {
       type master;
       file "named.empty";
       allow-update { none; };
};
zone "Mozilla.com" IN {
       type master;
       file "Mozilla.com.in_net";
};
zone "Google.com" IN {
       type forward;
       forwarders { 192.168.1.4; };
};

};

view ex_net {
zone "Mozilla.com" IN {
       type master;
       file "Mozilla.com.ex_net";
};
zone "Google.com" IN {
       type forward;
       forwarders { 192.168.1.4; };
};

};


泛域名解析
       *    IN         A          172.16.100.7

如下图所示:使用命令检查区域配置文件

linux DNS_linux_36

如下图所示:公司内网的用户请求web服务解析到192.168.10.6

linux DNS_配置文件_37

如下图所示:互联网的用户去求web服务将被解析到220.22.22.22

linux DNS_linux_38



编译安装named: 前提:配置好开发环境,安装包组

1、下载源代码,编译安装 # tar xf bind-9.9.5.tar.gz  # cd bind-9.9.5  # ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --enable-threads --enable-epoll --disable-chroot # make && make install
2、创建主配置文件 # vim /etc/named/named.conf
3、创建区域数据文件

4、创建用户,并测试启动
               # groupadd -g 53 -r named
               # useradd -g named -r named
               # chown root:named /etc/named/* /var/named/*
               # chmod 640 /etc/named/named.conf /var/named/*

               # echo 'export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH' > /etc/profile.d/named.sh
               # source /etc/profile.d/named.sh

测试启动:
               # named -u named

5、rndc
               # rndc-confgen -r /dev/urandom > /etc/named/rndc.conf
               # chown root:named /etc/named/rndc.conf
               # chmod 640 /etc/named/rndc.conf

               把rndc.conf文件的后半部分复制到named.conf中并按指示启用;

6、提供服务脚本

linux DNS_域名服务器_39

linux DNS_计算机_40

如下图所示:定义PATH环境变量

linux DNS_配置文件_41

如下图所示:rndc: 持有一半密钥,保存于rndc的配置文件中 BIND:持有一半密钥,保存于主配置文件中 rndc的配置文件/etc/rndc.conf CentOS, RHEL: 密钥文件/etc/rndc.key

linux DNS_计算机_42

如下图所示:rndc的配置文件/etc/rndc.conf

linux DNS_linux_43

如下图所示:BIND:持有一半密钥,保存于主配置文件中

linux DNS_计算机_44

如下图所示:编写服务启动脚本

#!/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


如下图所示:编辑测试文件,使用queryperf工具对我们的DNS服务器做压力测

linux DNS_linux_45

linux DNS_配置文件_46