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
以及安装bind软件包默认的二进制可执行文件
/usr/sbin/rndc-confgen:使用此命令可以生成秘钥文件
/usr/sbin/named:DNS服务二进制可执行文件
/usr/sbin/named-checkconf:检查主配置文件是否有语法错误
/usr/sbin/named-checkzone:检查区域配置文件是否有语法错误
/var/log/named.log:DNS服务器的日志文件
/var/named:DNS的区域配置文件保存在此目录中
/var/named/slaves:主辅同步时,辅DNS服务器默认的区域配置文件保存在此目
/var/named/run:运行时会在/var/run/目录下有一个named进程的pid:named.pid
下面列出 /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服务器每次修改序列号时间)
构建主从服务器
主DNS服务器的配置文件
在主配置文件下我们添加一个名为Mozilla.com的区域allow-transfer只允许指定ip传送区域文件
然后再到/var/named/下创建一个与file:Mozilla.com.zone 同名的文件,指定辅助DNS服务器的IP地址
然后再去修改/etc/rc.d/init.d/named 将 -a 后面加上-r /dev/random 叫他默认去/dev/random下读取随机数
启动服务
查看pid
查看系统服务的端口,DNS服务器默认监听在53端口
使用客户端验证, nslookup 命令 set q=A 说明请求的是A记录
然后再到DNS2创建一个名为Mozilla.con的域,type:slave file:slaves/Mozilla.com
检查配置文件是否有语法错误
启动服务之后,查看日志
然后cd到指定目录下查看:区域配置文件是否同步,同步成功
使用nslookup查看辅助服务器是否运行正常,能够正常解析域名
子域授权
如下图所示:在DNS1配置文件中添加,授权子域的ns记录以及对用的A记录,以及将序列号改成6
如下图所示:使用named-checkzone 检查配置文件是否有语法错误
如下图所示:重新加载服务配置文件,查看日志 传送完成没有任何的错误信息
如下图所示:
辅助DNS服务器也要手动重新加载数据库,因为同步时间还没到,我们在这里我们设置的一天, 数据已经成功更新过来了,增量区域传送:传送区域中改变的数据部分,IXFR(
如下图所示:在子域服务器上添加区域“FireFox.Mozilla.com”
如下图所示:同样/var/named/下创建一个与file:FireFox.Mozill.com.zone相同名称的文件
如下图所示:检查配置文件
如下图所示:启动服务
如下图所示:在父DNS服务器上解析子域的A记录www.FireFox.Mozilla.com 解析成功
如下图所示:验证
构建DNS转发器
如下图所示:在option字段设置全局转发,以及区域转发(区域转发,只转发该区域的名称解析)
如下图所示:创建区域配置文件
如下图所示:创建区域名称解析配置文件
如下图所示:验证
#####:如下所示:定义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
如下图所示:使用命令检查区域配置文件
如下图所示:公司内网的用户请求web服务解析到192.168.10.6
如下图所示:互联网的用户去求web服务将被解析到220.22.22.22
编译安装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、提供服务脚本
如下图所示:定义PATH环境变量
如下图所示:rndc: 持有一半密钥,保存于rndc的配置文件中 BIND:持有一半密钥,保存于主配置文件中 rndc的配置文件/etc/rndc.conf CentOS, RHEL: 密钥文件/etc/rndc.key
如下图所示:rndc的配置文件/etc/rndc.conf
如下图所示:BIND:持有一半密钥,保存于主配置文件中
如下图所示:编写服务启动脚本
#!/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服务器做压力测