分类: LINUX
2010-09-15 08:49:48
一.DNS 介绍
1 域和域名
DNS是一个分布式数据库,命名系统采用层次的逻辑结构,如同一棵倒置的树,这个逻辑的树形结构称为域名空间,由于DNS划分了域名空间,所以各机构可以使用自己的域名空间创建DNS信息。
DNS根域下面是顶级域,也由Internet域名注册授权机构管理。共有3种类型的顶级域。
组织域:采用3个字符的代号,表示DNS域中所包含的组织的主要功能或活动。比如com为商业机构组织,edu为教育机构组织,gov为政府机构组织,mil为军事机构组织,net为网络机构组织,org为非营利机构组织,int为国际机构组织。
地址域:采用两个字符的国家或地区代号。如cn为中国,kr为韩国,us为美国。
反向域:这是个特殊域,名字为in-addr.arpa,用于将IP地址映射到名字(反向查询)。
对于顶级域的下级域,Internet域名注册授权机构授权给Internet的各种组织。当一个组织获得了对域名空间某一部分的授权后,该组织就负责命名所分配的域及其子域,包括域中的计算机和其他设备,并管理分配的域中主机名与IP地址的映射信息。
2. 区(Zone)
区是DNS名称空间的一个连续部分,其包含了一组存储在DNS服务器上的资源记录。每个区都位于一个特殊的域节点,但区并不是域。DNS域是名称空间的一个分支,而区一般是存储在文件中的DNS名称空间的某一部分,可以包括多个域。一个域可以再分成几部分,每个部分或区可以由一台DNS服务器控制。使用区的概念,DNS服务器回答关于自己区中主机的查询,它是哪个区的授权服务器。
3. 主域名服务器与辅助域名服务器
DNS服务器可以不存储任何区的信息或者存储一个或多个区的信息。当DNS服务器接收到DNS查询时,它检索它的本地区以定位所请求的信息。如果因为服务器不是所DNS域的授权服务器,从而没有所请求域的数据而使用检索失败,服务器就检查它的高速缓存并与其他DNS服务器通信以解析该请求,或者把客户机提交给另一个可能知道答案的DNS服务器。
DNS服务器可以管理主区和辅助区。用户可以把服务器配置成管理多个不同的主区和辅助区,以尽量接近实际情况,这意味着服务器可能管理一个区的主拷贝和另一个区的辅助拷贝,或只管理一个区的主拷贝和辅助拷贝。对每个区,管理其主区的计算机是该区的主服务器,管理其辅助区的服务器是该区的辅助服务器。
主区是本地更新的,在区数据改变时,例如把该区的某个部分授权给另一台DNS服务器,或在区中添加资源记录,这些改动必须在该区的主DNS服务器上进行,以便新信息能加进本地区。
相反,辅助区是从其他服务器复制的。在辅助服务器上定义区时,区配置有服务器的IP,辅助区就是从该地址复制信息。复制区文件的服务器可以是该区的主服务器或辅助服务器,有时称为辅助区的主控服务器。
当区的辅助服务器启动时,它与该区的主控服务器进行连接并启动一次区传输,区辅助服务器定期与区主控服务器通信,查看区数据是否改变。如果改变了,它就启动一次区传输。
每个区必须有主服务器,另外每个区至少要有一台辅助服务器,否则如果该区的主服务器崩溃了,就无法解析该区的名称。
4.DNS查询流程
(1)DNS域名解析工作原理
<1> 客户机提交域名解析请求,并将该请求发送给本地的域名服务器。
<2> 当本地的域名服务器收到请求后,就先查询本地的缓存。如果有查询的DNS信息记录,则直接返回查询的结果。如果没有该记录,本地域名服务器就把请求发给根域名服务器。
<3> 根域名服务器再返回给本地域名服务器一个所查询域的顶级域名服务器的地址。
<4> 本地服务器再向返回的域名服务器发送请求。
<5> 接收到该查询请求的域名服务器查询其缓存和记录,如果有相关信息则返回客户机查询结果,否则通知客户机下级的域名服务器的地址。
<6> 本地域名服务器将查询请求发送给返回的DNS服务器。
<7> 域名服务器返回本地服务器查询结果(如果该域名服务器不包含查询的DNS信息,查询过程将重复<6>、<7>步骤,直到返回解析信息或解析失败的回应)。
<8> 本地域名服务器将返回的结果保存到缓存,并且将结果返回给客户机。
(2)域名解析实例
假设客户机使用电信ADSL接入Internet,电信为其分配的DNS服务器地址为219.141.140.10,域名解析过程如下哈~
<1> 客户机向本地的域名服务器219.141.140.10发送解析请求。
<2> 当本地的域名服务器收到请求后,就先查询本地的缓存。如果有查询的DNS信息记录,则直接返回查询的结果。如果没有该记录,本地域名服务器就把解析请求发给根域名服务器。
<3> 根域名服务器收到请求后,根据完全正式域名FQDN,判断该域名属于com域,查询所有的com域DNS服务器的信息,并返回给本地域名服务器。
<4> 本地域名服务器219.141.140.10收到回应后,先保存返回的结果,再选择一台com域的域名服务器,向其提交解析域名的请求。
<5> com域名服务器接收到该查询请求后,判断该域名属于google.com域,通过查询本地的记录,列出管理google域的域名服务器信息,然后将查询结果返回给本地的域名服务器219.141.140.10。
<6> 本地域名服务器219.141.140.10收到回应后,先缓存返回的结果,再向google.com域的服务器发出请求解析域名的数据包。
<7> 域名服务器google.com收到请求后,查询DNS记录中的www主机的信息,并将结果返回给本地服务器219.141.140.10。
<8> 本地域名服务器将返回的查询结果保存到缓存,并且将结果返回给客户机。
(3).正向解析与反向解析
1)正向解析
正向解析是指域名到IP地址的解析过程。
2)反向解析
反向解析是从IP地址到域名的解析过程。反向解析的作用为服务器的身份验证。
5. 资源记录
为了将名字解析为IP地址,服务器查询它们的区(又叫DNS数据库文件或简单数据库文件)。区中包含组成相关DNS域资源信息的资源记录(RR)。例如,某些资源记录把友好名字映射成IP地址,另一些则把IP地址映射到友好名字。
某些资源记录不仅包括DNS域中服务器的信息,还可以用于定义域,即指定每台服务器授权了哪些域,这些资源记录就是SOA和NS资源记录。
1)SOA资源记录
每个区在区的开始处都包含了一个起始授权记录(Start of Authority Record),简称SOA记录。SOA定义了域的全局参数,进行整个域的管理设置。一个区域文件只允许存在唯一的SOA记录。
2)NS资源记录
名称服务器(NS)资源记录表示该区的授权服务器,它们表示SOA资源记录中指定的该区的主和辅助服务器,也表示了任何授权区的服务器。每个区在区根处至少包含一个NS记录。
3)A资源记录
地址(A)资源记录把FQDN映射到IP地址,因而解析器能查询FQDN对应的IP地址。
4)PTR资源记录
相对于A资源记录,指针(PTR)记录把IP地址映射到FQDN。
5)CNAME资源记录
规范名字(CNAME)资源记录创建特定FQDN的别名。用户可以使用CNAME记录来隐藏用户网络的实现细节,使连接的客户机无法知道。
6)MX资源记录
邮件交换(MX)资源记录为DNS域名指定邮件交换服务器。邮件交换服务器是为DNS域名处理或转发邮件的主机。处理邮件指把邮件投递到目的地或转交另一不同类型的邮件传送者。转发邮件指把邮件发送到最终目的服务器,用简单邮件传输协议SMTP把邮件发送给离最终目的地最近的邮件交换服务器,或使邮件经过一定时间的排队。
DNS理论和概念了解得差不多了,下面我们开始DNS安装和配置哈~~~
二. Bind9 主配置文件named.conf
named.conf是BIND的核心配置文件,它包含了BIND的基本配置,但其并不包括区域数据。named.conf文件定义了DNS服务器的工作目录所在位置,所有的区域数据文件都存放在该目录中,该文件还定义了DNS服务器能够管理哪些区域,如果DNS服务器可以管理某个区域,它将完成该区域内的域名解析工作。
如果没有安装caching-nameserver-
目前的 bind 程序已经进行 chroot 了,可以参考 /etc/sysconfig/named
在/etc/named.conf 的文件实际上是链接到 /var/named/chroot/etc/named.conf
建在/var/named/ 下的区域文件基本上都是链接到 /var/named/chroot/var/named/ 目录下的同名相应文件
1. named.conf配置文件分为整体和局部两个部分。
区域名为服务器要管理区域的名称,如果添加了一个区域,并且该区域存在相应资源记录,那么DNS服务器就可以解析该区域的DNS信息。
2.建立主配置文件named.conf
vim /etc/named.conf
options {
director “/var/named”;
dump-file “/var/named/data/cache_dump.db”;
statistics-file “/var/named/data/named_stats.txt”;
pid-file “/var/run/named/named.pid”;
allow-query { any; };
};
zone “.” IN {
type hint;
file “named.ca”;
};
zone “localdomain” IN {
type master;
file “localdomain.zone”;
allow-update { none;};
};
zone “shsfis.com” IN {
type master;
file “shsfis.com.zone”;
allow-update { none; };
};
zone “110.5.10.in-addr.arpa” IN {
type master;
file “
allow-update { none; };
};
type字段指定区域的类型,对于区域的管理至关重要,一共分为六种:
Master:主DNS服务器:拥有区域数据文件,并对此区域提供管理数据
Slave:辅助DNS服务器:拥有主DNS服务器的区域数据文件的副本,辅助DNS服务器会从主DNS服务器同步所有区域数据。
Stub:stub区域和slave类似,但其只复制主DNS服务器上的NS记录而不像辅助DNS服务器会复制所有区域数据。
Forward:一个forward zone是每个域的配置转发的主要部分。一个zone语句中的type forward可以包括一个forward和/或forwarders子句,它会在区域名称给定的域中查询。如果没有forwarders语句或者forwarders是空表,那么这个域就不会有转发,消除了options语句中有关转发的配置。
Hint:根域名服务器的初始化组指定使用线索区域hint zone,当服务器启动时,它使用根线索来查找根域名服务器,并找到最近的根域名服务器列表。如果没有指定class IN的线索区域,服务器使用编译时默认的根服务器线索。不是IN的类别没有内置的默认线索服务器。
Delegation-only:用于强制区域的delegation .ly状态
directory |
这个设定值就是在指定你的 zone file 要放置到哪个目录啦! 非常重要的设定值。与底下 zone 设定项目的 file 配合而成完整档名。 |
dump-file |
我们知道 DNS 服务器会将搜寻到的主机 IP 对应数据放置到高速缓存中, 那如果你想要将目前的快取数据记录下来时,就用这个设定值指定档案 |
statistics-file |
我们 DNS 的一些统计数据,想要列出时就写入这个设定值指定的档名内 |
pid-file |
将 named 这个程序的 PID 记录下来的一个档案,这个档案通常可以在 named 启动、关闭时提供正确的 PID 啦! |
forwarders |
前面谈到 已经谈过了,请前往参考。 |
allow-query |
是否允许客户端的查询。查询的重点就是读取数据库的内容, 既然要架设 DNS ,当然要允许客户端的查询啦。内容可以填写任何来源 (any) 或 IP 或网域 (IP/netmask) 的格式。 |
allow-transfer |
是否允许 slave DNS 的整个领域数据的传送?这个设定值与 master/slave DNS 服务器之间的数据库传送有关。除非你有 slave DNS 服务器,否则这里不要开放喔! |
zone 内的相关参数说明 | |
设定值 |
意义 |
type |
该 zone 的类型,主要的类型有: master, slave 及 hint。 其中需要注意最上层的 DNS (.) 使用的是 hint 的类型,然后 master 主机用 master 啊! slave 主机就用 slave ! |
file |
就是 zone file 啦!那么完整的 zone file 在哪里啊?在这里: [chroot_dir]/[options 内的 directory]/[file 设定值] 所以说,root (.) 设定档就在: |
反解 zone |
正解的 zone 很好理解,反解的 zone 怎么那么奇怪啊?就如同 linux.vbird.org 要追踪时是由 org -> vbird -> linux 一样,至于反解则例如 192.168.1.1: 192 -> 168 -> 1 -> 1。 由于 DNS 的领域名称都是由后往前找,且反解是个特殊的领域,所以必需要 将 IP 反过来写,同时在最后面加上『 .in-addr.arpa 』来表示反解宣告!所以 192.168.1 这个 zone 就得要写成 1.168.192.in-addr.arpa |
3. 建立正向shsfis.com区域文件
vi /var/named/chroot/var/named/shsfis.com.zone
并在/var/named/下建立链接文件
ln –s /var/named/chroot/var/named/shsfis.com.zone
$TTL 3600 ;1 hour
shsfis.com. IN SOA dhcp-svr1.shsfis.com. root.shsfis.com. (
20100825 ;serial
10800 ;refresh(3 hours)
900 ;retry(15)
604800 ;expire(1 week)
86400 ;minimum(1 day)
)
@ NS dhcp-svr1.shsfis.com.
dhcp-svr
time IN A
4. 配置反向解析区域
1) 在/var/named/chroot/var/named下添加反向解析域文件110.5.10.zone,并在/var/named下建立链接文件.
vi /var/named/110.5.10.zone
$TTL 3600 ;1 hour
110.5.10.in-addr.arpa IN SOA 110.5.10.in-addr.arpa. root.110.5.10.in-addr.arpa. (
20100825 ;serial
10800 ;refresh(3 hours)
900 ;retyr(15)
604800 ;expire(1 week)
86400 ;minimum(1 day)
)
@ NS dhcp-svr1.shsfis.com.
关于本领域的一些设定值 | |
设定值 |
说明 |
$TTL |
当有外部 DNS 服务器对你的 DNS 的这个领域进行查询时,这一笔记录会放置在对方 DNS 服务器内几秒钟的意思。 |
$ORIGIN |
这个设定值可以重新指定 zone 的定义。在预设的情况下, 这个正反解数据库档案中的 zone 是由 /etc/named.conf 所指定的,就是 zone 那个参数的功能。 不过,这个 zone 是可以改的,就是用 $ORIGIN 来修订就是了。通常这个设定值不会用到的。 |
关于 master/slave 授权方面的设定值 | |
符號與 RR |
说明 |
@ |
这个符号代表 zone 的意思! 以上面的 named.local 来说, 这个档案由 /etc/named.conf 定义出 zone 为 localhost. ,因此在本档案的 @ 就代表 localhost. 啰! |
. |
这个点 (.) 很重要!因为他代表一个完整主机名称 (FQDN) 而不是仅有 hostname 而已。举例来说,如果你在本设定文件上面规范一个主机名称为 www 时,那部主机的 FQDN 为 如果你写出 时,由于末了没有那个小数点,则 zone 会主动加入该主机名称, 所以最终的 FQDN 会变成 localhost. 喔! |
SOA |
Start of Authority 的意思。 这个标志代表着 master/slave 相关的认证、授权资料。 不论你的 DNS 系统有没有设定 master/slave 的架构,都需要含有这个设定才好。 SOA 后面共带有三个参数,所以该行为: [zone] IN SOA [主机名] [管理员 email] ([五组更新时间参数]) 每个设定项目你可以这样看:
至于那五个数字的意义是这样的:
另外,这几个数字的大小是有限制的!你必需要了解喔:
|
5.BIND 9 日志
BIND 9 的日志是可以灵活配置的,要详细记录服务器的运行状况,要在配置文件 named.conf 中使用 logging 语句来定制自己所需要的日志记录。
在默认情况下,BIND9 把日志消息写到 /var/log/messages 文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息;而将调试日志信息写入 BIND 服务器工作目录中的 named.run 文件。
logging语句为域名服务器设定了一个多样性的logging选项。它的channel短语对应于输出方式、格式选项和分类级别,它的名称可以与category短语一起定义多样的日志信息。
只用一个logging语句就可以用来定义多个channel和category。 在BIND9中,logging的配置只有在整个配置文件被读取后才被执行。
下面是logging的语法:
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/no; ] // 是否在消息中添加消息类别名前缀
[ print-severity yes/no; ] // 是否在消息中添加消息严重性前缀
[ print-time yes/no; ] // 是否在消息中添加时间前缀,仅用于 file 日志
}; ]
[ category category_name {
channel_name; [ channel_name; ... ] //这就是前面自己命名的channel_name
}; ]
…
};
BIND 日志的常用术语
channel 语句
channel(通道)语句用于定义通道,日志输出方式,如:syslog、文本文件、标准错误输出或 /dev/null
指定应该向哪里发送日志数据,需要在以下四种之间则其一:
file : 输出到纯文本文件
log_file: 指定一个文件名
syslog optional_facility :输出到 syslog,其中 optional_facility 是
syslog 的设备名,通常为以下几个daemon:
local0 到 local7
null :输出到空设备
channel_name 是自己命名的一个名字.
versions 指定允许同时存在多少个版本的该文件,比如指定 3 个版本(versions 3),就会保存 query.log、query.log0、query.log1 和query.log2。
size 指定文件大小的上限,如果只设定了size 而没有设定 version,当文件达到指定的文件大小上限时,服务器停止写入该文件。如果设定了version,服务器会进行循环,如把 log_file 变成 log_file.log1,log_file.log1 变成 log_file.log2 等,然后建立一个新的 log_file.log 进行写入。
severity 语句用于指定消息的严重性等级, log_severity 的取值为(按照严重性递减的顺序):
critical
error
warning
notice
info
debug [ level ]
dynamic 是一个特殊的值,它匹配服务器当前的调试级别
定义了某个严重性级别后,系统会记录包括该级别以及比该级别更严重的级别的所有消息。比如定义级别为 error,则会记录 critical 和error 两个级别的信息。
对于系统管理员来说,一般记录到 info 级别就可以了。
category 有:
client 处理客户端请求。
config 配置文件分析和处理。
database 同BIND内部数据库相关的消息,用来存储区数据和缓存记录。
default 匹配所有未明确指定通道的类别。
dnssec 处理 DNSSEC 签名的响应。
general 包括所有未明确分类的 BIND 消息。
lame-servers 发现错误授权,即残缺服务器。
network 网络操作。
notify 区更新通知消息。
queries 查询日志
resolver 名字解析,包括对来自解析器的递归查询信息。
security 批准/非批准的请求。
update 动态更新事件。
xfer-in 从远程名字服务器到本地名字服务器的区传送。
xfer-out 从本地名字服务器到远程名字服务器的区传送。
配置日志时,首先要定义通道,然后将不同的日志类别的数据指派到指定的通道上输出。
BIND9默认的日志配置为:
logging {
category default {default_syslog;default_debug;};
};
default_syslog:用工具守护进程把info和更高严重性的消息发送到syslog;
default_debug:日志记录到文件named.run,严重性设置为dynamic;
default_stderr:把消息发送给named的标准出错输出,严重性为info。
BIND 9 预制了如下四个默认通道;
channel "default_syslog" {
syslog daemon; // 发送给 syslog 的 daemon 设备
severity info; // 只发送此 info 及其更高优先级的信息
};
channel "default_debug" { // 只有当服务器的 debug 级别非 0 时,才产生输出。
file "named.run"; // 写入工作目录下的 named.run 文件
severity dynamic; // 按照服务器当前的debug 级别记录日志
};
channel "default_stderr" {
stderr; // 写到stderr
severity info; // 只发送此 info 及其更高优先级的信息
};
channel "null" {
null; // 丢弃所有发到此通道的信息
};
例如要记录查询消息,可以在 named.conf 中添加如下配置
logging {
channel query_log {
file "query.log" versions 3 size 20m;
severity info;
print-time yes;
print-category yes;
};
category queries {
query_log;
};
};
这样服务器会在工作目录(directory 语句所指定的目录,Ubuntu 为:/var/cache/bind)下创建 query.log 文件,并把运行过程产生的 queries 消息写如到此文件中。
注意新建的日志文件注意给予相应的写权限,切记
一般地,当 BIND 做了重大修改后,应该配置并监视日志,可能还要提高日志消息级别,一旦稳定后便可以还原配置。因为日志会占用大量的磁盘空间,尤其是查询日志。
如果你开启了selinux还要设置相应权限。
logging {
channel default_syslog {
syslog local2;
severity error;
};
channel audit_log {
file "named.log" versions 3 size 20m;
severity info;
print-time yes;
print-category yes;
};
category default { audit_log; };
category general { audit_log; };
category security { audit_log; default_syslog; };
category config { default_syslog; };
category resolver { audit_log; };
category xfer-in { audit_log; };
category xfer-out { audit_log; };
category notify { audit_log; };
category client { audit_log; };
category network { audit_log; };
category update { audit_log; };
category queries { audit_log; };
category lame-servers { audit_log; };
};
重启你的named进程,以后你的dns相关信息就会出现这个文件里!
当DNS运行出错时,我们可以查看系统日志文件syslog以及named.run等,对照有关BIND 错误消息清单。