我转载的评价:
本书是介绍bind和dns的权威书籍,由于市面上介绍bind和dns的书比较少,所以本书的
份量也就更重了。本书从dns的基本概念到dns的实现程序bind都作了详细的介绍。如果
你是dns的维护人员,应该通读这本书。如果你想了解一下dns的概念和bind程序的基本
应用,这本书也提供的大量的相关知识。不同层次的人员可根据自已的实际情况选读相关章
节。由于我应用dns只是在局域网内做一下名字解析,应用较浅,所以我只挑了个别章节看
了一下,没有深入dns的高级部份,所以读书笔记也就只包含这部分的内容了。
第一章 背景
dns是针对ARPnet的特殊问题发展起来的,在整个20世纪70年代,ARPnet还是一个
有几百台主机的很小很友好的网络。仅仅需要一个名为HOSTS.TXT的文件就能容纳所有需
要了解的主机信息。该文件由SRI(Stanford Research Institute的前身)的网络信息中心
(Network Information Center NIC)负责维护,并从一台主机SRI-NIC上分发到整个网络。
ARPnet的管理员通常定期通过电子邮件的方式将他们的变更通知SRI,同时还定期ftp到
sri-nic,以获取最新的HOSTS文件。但随着ARPnet的增长,这种方法行不通了。流量和负
载使SRI的线路不堪重负;名字冲突,造成网络混乱;在不断扩张的网络上要维护文件的
一致性变得越来越难。关键问题是HOSTS文件的结构不是很好,最终导至了hosts文件的
失败和落伍。
ARPnet的管理者们开始投入研究,为HOSTS.TXT文件寻求继任者。Paul Mockapetris,
当时在南加州大学的信息科学所,负责设计新系统的体系架构。1984年,他发布了描述DNS
的RFC882和RFC883。后来它们被RFC1034和RFC1035所取代,也就是目前的DNS规范。
目前,还有很其它RFC补充RFC1034和RFC1035的内容,它们描述了DNS的安全问题,
实现问题,管理问题等。
DNS 简述
实际上,DNS是一个分布式数据库,它允许对整个数据库的各个部份进行本地控制;同时
整个网络也能通过客户-服务器方式访问每个部份的数据。借助备份和缓存机制,DNS将具
有强壮性和足够的性能。DNS的数据库结构同unix文件系统的结构非常相似,就像一棵倒
着的树。
第二章 DNS是如何工作的
介绍了DNS的工作原理,一些功能和名词。
第三章 如何开始工作
获是bind软件
选择一个域名
第四章 建立BIND
建立区数据,包括正向解析文件(名字到地址的映射),反向解析文件(地址到名字的映射)。
每个网络都有包含它自已的反向映射数据文件。名字服务器用named.conf配置文件把所有
的区数据文件绑定在一起。
区数据文件
区数据文件中的大部份条目被称为DNS资源记录。DNS查找是不区分大小写的,但大写是
被系统保留的,建议用小写。资源记录必须从一行的第一列开始。在DNS RFC中,表示资
源的记录是按特定顺序排列的,但这不是必须的。顺序如下:
SOA记录 指示该区的权威
NS记录 列出该区的一个名字服务器
A 名字到地址的映射
PTR 地址到名字的映射
CNAME 规范名字(相对于别名而言)
注释是以“;”号开始的
设置区默认的TTL值。
在8.2版本前,SOA记录中最后一个字段设置区默认的TTL值。在8.2版出来前,公布了
RFC2308,将SOA记录中最后一个字段的含义改为了“否定缓存TTL”,它的意思是一个远
程名字服务器能将区的否定响应缓存多长时间,否定响应是报告某个域名或某个域名的某个
数据类型不存。8.2版及后继版中用$TTL控制语句。名字服务器在查询响应中提供这个值,
允许其它服务器将数据在缓存中存放TTL所指定的时间。如果数据不是经常变动的,可以
考虑把它的值设为几天,1周大概是使之有意义的最大值。1小时会引起不必要的DNS流量。
如:$TTL 3h
SOA记录
表示对于该区数据而言,这个名字服务器是最好的信息来源。根据这个SOA记录,我们的
名字服务器就享有对该区的权威。
movie.edu IN SOA terminator.movie.edu. al.robocop.movie.edu. (
1 ;序列号
3h ;3小时后刷新
1h ;1小时后重试
1w ;1周后期满
1h) ;否定缓存TTL为1小时
IN 代表Internet类
terminator.movie.edu. 代表主名字服务器
al.robocop.movie.edu. 把第一个点号换成@,代表邮件地址,对电脑没意义,只对人有意义
在反解文件的头几行也添加类似的SOA记录。在这些文件中把movie.edu改为
249.249.192.in-addr.arpa
NS记录
在文件中添加的下一条记录是NS记录。这些记录表明区movie.edu有两个名字服务器。这
些名字服务器运行在主机terminator.movie.edu and wormhole.movie.edu上。
movie.edu IN NS terminator.movie.edu
movie.edu IN NS wormhole.movie.edu
同SOA记录一样,也在反解文件中添加记录
地址和别名记录
接下来创建名字到地址的映射
;主机地址
localhost.movie.edu. IN A 127.0.0.1
robocop.movie.edu. IN A 192.249.249.2
terminator.movie.edu. IN A 192.249.249.3
misery.movie.edu. IN A 192.249.253.2
;
;多宿主主机
wormhole.movie.edu. IN A 192.249.249.1
wormhole.movie.edu. IN A 192.249.253.1
;
;别名
bigt.movie.edu. IN CNAME terminator.movie.edu.
wh.movie.edu. IN CNAME wormhole.movie.edu.
wh249.movie.edu IN A 192.249.249.1
wh253.movie.edu IN A 192.249.253.1
像bigt.movie.edu这样的别名不能出现在资源记录的右边。换名话说,在资源记录的数据部
份总是要使用规范名(terminator.movie.edu)。
如果一台主机是多宿主的(具表不止一个网络接口),让每个接口对应一个唯一的别名,再
为这个别名创建一个地址(A)记录,为每个对所有地址都通用的别名创建一个CNAME记
录。能否在所有情况下都使用地址记录而不用CNAME记录呢?大部份程序是可以的,但
sendmail会有问题。sendmail通常用规范名替换邮件首部中所有使用的别名,只有当邮件首
部中的名字有相关的CNAME记录时才进行这种规范化。如果你的别名没有对应的CNAME
记录,你的SENDMAIL就必须知道你的主机所有可能为外界所知的别名,这就要求你对
SENDMAIL进行一些额外的调整。
PTR记录
创建地址到名字的映射,使用PTR资源记录
1.249.249.192.in-addr.arpa. IN PTR wormhole.movie.edu.
2.249.249.192.in-addr.arpa. IN PTR robocop.movie.edu.
3.249.249.192.in-addr.arpa. IN PTR terminator.movie.edu.
对于192.249.253/24也创建类似的数据。
需要设置回送网络的正反解文件。如果没有则查找127.0.0.1就会失败。
根线索(root hint)数据。从ftp.rs.internic.net里上载。
建立BIND配置文件
从版本4到版本8,BIND配置文件的语法变化非常大,版本8到版本9没有变化。可以通
过运行named-bootconf程序把版本4的配置文件转换成版本8的文件。这个程序随BIND源
码一起发布。
h2n工具是一个PERL脚本,用来把HOSTS文件转换成区数据文件。
运行名字服务器
#named
设置本地域名,这样可以直接查找主机名而不用加上域名。有两种方法设置:hostname or
/etc/resolv.conf。在resolv.conf的第一行加入domain movie.edu。或者在terminator主机上
把hostname设置为terminator.movie.edu。不要在名字后加点号。
用远程的名字服务器来查找你的区中的域名,把本地域名作为第一个参数,远程名字服务器
作为第二个参数。如果失败,可能是你的区还没有向你的父名字服务器注册。需与父域管理
员联系,检查区授权。
# nslookup carrie getekeeper.dec.com
运行辅名字服务器
需要再建立一个名字服务器以增强DNS的健壮性。以便分担负荷和容错。在named.conf文
件中定义是主还是辅服务器。主要区别是主名字服务器从区数据文件中读取数据,辅服务器
是通过网络从其它的名字服务器装载数据的,这个过程称为“区传送”(zone transfer)。
建立
在辅名字服务器建立区数据文件目录(/etc/named),并把named.conf,named.root,db.127.0.0
这三个文件拷贝过来。修改配置文件,把域的master改为slave,然后添加一个带主服务器ip
地址的masters行。例如:
zone “movie.edu” in {
type master;
file “db.movie.edu”;
};
改为
zone “movie.edu” in {
type slave;
file”bak.movie.edu”; 如果不想在辅名字服务器上保存区数据文件的备份,可以删除这
行。
masters {192.249.249.3};
};
SOA值
序列号:格式为yyyymmddnn,nn代表这一天是第几次修改。在每次更新了你的区数据后
不要忘了增加序列号的值。辅名字服务器通过比较这个序列号是否加载一份新的区数据拷
贝。
refresh(刷新):告诉该区的辅名字服务器相隔多久检查该区的数据是否是最新的。
retry(重试):如果辅名字服务器超过刷新间隔时间后无法访问主服务器,那么它就开始隔
一段时间重试连接一次。这个时间通常比刷新时间短,但也不一定非要这样。
expire(过期或期满):如果在期满时间内辅名字服务器还不能和主服务器连接上,辅名字服
务器就使用这个我失效。这就意味着辅名字服务器将停止关于该区的回答,因为这些区数据
太旧了,没有用了。设置时间要比刷新和重试时间长很多,以周为单位是较合理的。
否定缓存TTL(生存期):这个值对来自这个区的权威名字服务器的否定响应都适用。
新版的bind的时间设置灵活了很多,以前只接收以秒为单位(一周有608400秒)。现在可
以用h(小时),d(天),w(周)表示。
RFC1537建议顶级名字服务器采用以下值:
refresh 24h
retry 2h
expire 30d
否定缓存ttl 4d
新版8,9改变了区数据传播的方式,轮询的特性还在,但增加了当区数据改变后进行通知
的功能,在15分钟之内通知辅名字服务器,要加载该区的一份新的拷贝了。
多个主服务器
可配置最多十个主名字服务器,以分号分隔。辅名字服务器会依序尝试每个IP地址对应的
主服务器。一直到收到回答为止。但从8.2以后,辅服务器会查询所有的主服务器,从具有
最高序列号的服务器那里传送区数据。
第五章 DNS与电子邮件
DNS与主机表相比的一个优势在于支持高级邮件路由。当邮件收发器只用HOSTS文件工作
时,所能做的最多也就是试着把邮件直接发送到主机的IP地址,如果失败,要么延迟发送,
过一会再重试,要么就将邮件退回给发送者。dns提供一种机制,能为邮件的发送者指定备
份主机,它还允许一台主机为别的主机承担邮件处理任务。
DNS用一种资源类型来实现增强的邮件路由,那就是MX记录。它为一个域名指定一个邮
件交换器。它是一台主机,负责处理或转发该域名的邮件。还定义了一个优先级值,它决定
了邮件收发器使用它们顺序,优值小的先使用。
peets.mpk.ca.us. IN MX 10 relay.hp.com 指定relay.hp.com是peets.mpk.ca.us的邮件交
换器,优先级是10
第六章 配置主机
reslov.conf中有五个命令可你使用,domain,search,nameserver,sortlist,options。
domain定义本地域名,从第一行开始,后跟一个空格,然后是本地域名,本地域名后面不
要有点号。
例如:domain movie.ecu
LOCALDOMAIN环境变量也可以设置每个用户的本地域名。
建议使用hostname设置。
search指令
search corp.hp.com paloalto.hp.com hp.com
解析器会首先搜索corp.hp.com,然后是paloalto.hp.com,再是这两个域的父域hp.com。
nameserver指令
默认地,解析器首先查找本地上的名字服务器,也可以通过该指令指示解析器去使用其它主
机的域名服务器。
nameserver 15.32.17.2
nameserver 15.32.17.3 (可指定多个服务器)
注意:在多个nameserver的情况下不要使用回送地址。
sortlist指令
当查询收到的响应包括多个地址时,该设置允许你选择更希望使用的子网和网络。
sortlist 128.32.42.0/255.255.255.0 最多可指定十个优先的子网和网络。
options指令
options debug 设置RES_DEBUG,在标准输出上产生大量调试数据。前提是在编译BIND时
定义了DEBUG参数。
options ndots:2 如果域名参数中的点号大于或等于这个值,那么解析器会在使用搜索列表
之前,先查找这个域名。如果你相信你的用户更有可能输入部份域名而需要使用搜索列表时,
你可以增加这个值。
8.2版引入以下选项
options attempts:2 允许你指定在放弃之前向resolv.conf文件中每个名字服务器发送查询的
次数。
options timeout:2 指定每个对resolv.conf文件中名字服务器的查询的初始超时时间。默认为
5,最大为30。对第二轮以及接下来的几轮查询,解析器会把初始超时时间加倍。再除以
resolv.conf中文件服务器的数量。
options rotate 使你的解析器能使用resolv.conf文件中所有的名字服务器。从而分散负载。默
认只要第一台服务器正常,解析器是不会去查询其它服务器。
options no-check-names 关掉解析器的名字检查功能,默认是打开的。它检查响应的域名是
否合法。
如果你想指定多个选项,可以把它们写成一行:
options attempts:4 timeout:2 ndots:2
第七章 维护BIND
BIND9与8一样,也用controls来决定服务器如何监听控制信息的。
controls {
inet * allow {any;} keys {“rndc-key”}
};
这决定了rndc用户要用什么加密密钥来验证身份才能给服务器发送控制信息。如果没有指
定keys,服务器启动时会出错
key “rndc-key” {
algorithm hmac-md5;
secret “xxxxx”;
};
为安全起见,使用包括文件:
include “/etc/rndc.key”。唯一支持的算法是HMAC-MD5。
要使用rndc,你需要创建一个rndc.conf文件告诉rndc要用哪个认证密钥。而哪些名字服务
器要使用它们。
options {
default-server localhost;
default-key “rndc-key”;
};
key “rndc-key” {
algrithm hmac-md5;
secert “xxxxx”;
};
更新区数据文件,两种方法,手工 或 h2n。
重新开始一个SOA序列号。改变主服务器序列号,重启,停止辅服务器,删除所有备份区
数据文件。因为备份文件被删除,所以辅服务器就会加载一个新的区数据文件,这个区数据
文件就是最新的。
TXT
xxx IN TXT “this is a test” 限制2K字符串数据
RP 负责人邮件地址
robocop IN RP root.movie.edu
组织文件
当域大的时候,区数据文件就会越来越多,有两个命令可以帮助我们组这些文件:
$ORIGIN 改变一个区数据文件的起点
$INCLUDE 在当前区数据文件中插入一个新文件
改变系统文件的位置,主要是从安全角度考虑。
options {pid-file “server1.pid”;} 改变PID的文件名,可以在一台主机上运行两个名字服务
器。
options {named-xfer “/HOME/….”;} 在9版中没有这个文件。
options {dump-file “/home/yangjing/named/named_dump.db”;} 服务器转储数据库
options {statistics-file “/home/yangjing/named/named.stats”;} 服务器统计数据
日志
有七个级别,允许存在文件中或伸用syslog日志系统。
critical
error
warning
notice
info
debug [level] dns服务器特有
dynamic dns服务器特有
语法如下:
logging {
[ channel channel_name {
( file path_name
[ versions ( number | unlimited ]
[ size size_spec ]
| syslog ( kern | user | mail | daemon | auth | syslog | lpr |
news | uucp | cron | authpriv | ftp |
local0 | local1 | local2 | local3 |
local4 | local5 | local6 | local7
| null ;
[ severity ( critical | error | warning | notice |
info | debug [ level ] | dynamic ; ]
[ print-category yes_or_no; ]
[ print-severity yes_or_no; ]
[ print-time yes_or_no; ]
}; ]
[ category category_name {
channel_name; [ channel_name; … ]
}; ]
…
};
example:
logging {
channel my_syslog {
syslog daemon;
severity info;
};
channel my_file {
file “my_named.log” versions 3 size 10k;
severity dynamic;
print-category yes; 在日志中输出附加信息:消息类别,严重性,时间。
print-severity yes;
print-time yes;
};
category default {unll;}; 如果对于某个类别你没有指定任何通道,那么就会把这些消息发
送到default类所分配的通道中。
category statistics {my_syslog;my_file;};
category queries {my_file;};
};
要记录这些日志,还要再打开名字服务器的调试功能。
#rndc trace
versions 3 文件版本,会保存file,file.0,file.1,file.2,如果不设置将有99个版本。在服务
器启动和重新加载时将file.1-file.2,file.0-file.1,file-file.0。
size 10k 文件的大小限制。
default_stderr通道可把信息写到服务器的stderr中。
null通道可以用来丢弃不想要的信息。
bind9类别
general 包括所有未明确分类的信息。
client 处理客户端请求
config 配置文件分析和处理
database 数据库相关信息
dnssec 处理DNSSEC签名响应
lame-servers 发现错误授权
network 网络操作
notify 异步区变动通知
queries 查询日志
resolver 名字解析,包括对来自解析器的递归查询的处理
security 认可/非认可的请求
update 动态更新事件
xfer-in 从远程名字服务器到本地服务器的区传送
xfer-out 从本地到远程的区传送
第八章 扩展你的域
第九章 担当父域
第十章 高级特性
新版BIND8.1.2 9.10有大量的新特性,其中最突出的是支持DNS动态更新,异步区变动通
知(NOTIFY),以及增量区传送。
地址匹配列表和ACL
acl name {address_match_list;}; 定义一个列表,以后可用name引用
acl “hp-net” {192.168.1.192/26;};
有四个预定义的列表:none,没有任何IP地址;any,所有IP地址;localhost,本地主机的
任一IP地址;localnets,本地主机任一网络接口所在的网络。
第十一章 安全
限制查询 allow-query{}
防止未授权的区传送 allow-transfer{}
以最小权限运行bind,-u 以该用户运行, -g 以该组运行,-t 使用chroot()转到的目录。
使用chroot步骤见书例子。
第十二章 nslookup and dig