详细讲解DNS服务器Bind基本配置

2012-7-4 13:12:32 来源:网络转载 浏览:2366
BIND是一种开源的DNS(Domain Name System)协议的实现,包含对域名的查询和响应所需的所有软件。它是互联网上最广泛使用的一种DNS服务器,主要应用与linux和unix系统下。

DNS 简介

DNS(Domain Name System)

作用:管理主机的“户籍”---主机名:IP,是一个分布市数据库系统

起源:最早的主机解析,依靠hosts文件,又NIC(Network Information Center)维护,后来主机数量变得非常庞大,网络越来越复杂,就产生了DNS服务器。

DNS系统的结构(倒挂的属性结构):

域名注册:

注册.com下面的域名,比如redhat.com,需要找.com的域的管理者(通常为国际域名管理组织www.webnic.cc)

注册.redhat.com下面的域名,比如mydomain.redhat.com 需要找到redhat.com域的管理者。

常用术语:

DNS服务器:提供域名解析服务的主机

DNS客户机:需要查询主机域名信息的主机,任何联网的主机都需要查询域名,所以任意主机都是DNS客户机。DNS客户机需要知道DNS服务器在哪里,liinux靠/etc/resolv.conf指定。

正向解析:根据主机名解析IP地址。

反向解析:根据IP地址解析主机名称。

DNS解析的过程:常用的是递归解析,如果你要解析mail.sohu.com这个域名,主机就会向/etc/reslv.conf中指定的DNS服务器发送解析请求,如果其上有对应的缓存,就直接反馈给,如果没有就进行递归查询,其先向根(.)请求,跟就会把.com的DNS服务器地址返回给请求者,然后本地的DNS就会向.com的DNS发送解析请求,.com返回sohu.com的DNS地址,原因同上,然后本地向.sohu.com的DNS发送解析请求,sohu.com的DNS将mail.sohu.com对应IP地址返回给本地的DNS,本地的DNS再将对应的信息返回给客户机。这就是递归查询的过程,实际应用中会有一些差别。具体可以从网上搜索相关资料。

安装配置BIND

1.下载bind http://www.isc.org

   ftp://ftp.isc.org/isc/bind9/ 该FTP中可以找到最新版本的bind文件。根据自己需要下载。

2.编译安装

  [root@happyboy soft]# tar xvzf bind-9.4.0.tar.gz

  [root@happyboy soft]# cd bind-9.4.0

  [root@happyboy bind-9.4.0]# ./configure --sysconfdir=/etc --disable-openssl-version-check

(因为测试在AS 3环境下进行,安装新版本9.4.0,提示"It is recommended that you upgrade to OpenSSL version 0.9.8d/0.9.7l (or greater).You can disable this warning by specifying:--disable-openssl-version-check,所以添加了个个参数)

  [root@happyboy bind-9.4.0]# make

  [root@happyboy bind-9.4.0]# make install

安装程序默认将应用程序安装在/usr/local/bin下,如DNS调式工具dig,解析DNS工具nslookup;服务器程序放在/usr/local/sbin目录下,DNS管理工具rndc,named。

  [root@happyboy bind-9.4.0]# vi /etc/named.conf               手动创建配置文件,内容如下:

options {

         directory "/var/named";

};

zone "." {

         type hint;

         file "named.ca";

};

zone "localhost" {

        type master;

        file "named.local";

};

注意文件格式,括号内外都有分号,如果一句结束后没有回车用大括号结束,那大括号与之前的分号之间必须要有空格。

根服务器,在配置文件named.conf中定义根服务器。

zone "." {

         type hint;

         file "named.ca";

};

产生named.ca文件:

# echo "nameserver 203.196.1.6" > /etc/resolv.conf      //在本机配置文件中加入任何一个可用的DNS服务器

# dig -t NS . > /var/named/named.ca                     //查询根域服务器及其对应的IP地址并写入到named.ca

[root@happyboy named]# more /etc/resolv.conf 

nameserver 127.0.0.1      //完成后将本机DNS配置为自身

  [root@happyboy bind-9.4.0]# vi /var/named/domain.com.zone

  [root@happyboy bind-9.4.0]# named

[root@happyboy named]# tail /var/log/messages           //启动服务后,可以在该日志文件中看到如下信息:

Sep 23 21:59:19 happyboy named[22396]: none:0: open: /etc/rndc.key: file not found

Sep 23 21:59:19 happyboy named[22396]: couldn't add command channel 127.0.0.1#953: file not found

Sep 23 21:59:19 happyboy named[22396]: zone localhost/IN: loading from master file named.local failed: file not found

Sep 23 21:59:19 happyboy named[22396]: running

最后的running表明服务已经启动了(只是我们定义了localhost域,但是没有配置named.local区文件,所以报"file not find")

用# host www.sohu.com可以验证相关信息。

[root@happyboy named]# ps -aux |grep named

root     22396  0.3  2.6  9280 7092 ?        S    21:59   0:00 named

root     22405  0.0  0.2  4916  668 pts/1    S    22:00   0:00 grep named

服务还是不完整的,我们需要配置一个RNDC服务器,来控制DNS服务器

1.产生rndc控制文件

[root@happyboy named]# rndc-confgen > /etc/rndc.conf               //用该命令生成rndc的配置文件。

[root@happyboy named]# cat -n /etc/rndc.conf           //查看该文件,只有前面几行是起作用的,#号注释部分有说明:Use with the following in named.conf, 

adjusting the allow list as needed: 即下面内容加入到named.conf

[root@happyboy named]# tail +13 /etc/rndc.conf >> /etc/named.conf //按照要求将后面内容假如到named.conf

千万注意:这样copy过去还要把对应注释符号#取消才可以启作用,说明的两行

# Use with the following in named.conf, adjusting the allow list as needed:

# End of named.conf

就不要取消注释了……

可以用正则表达式来实现即vi命令(:.,$-1s/^#\ //)即将当前行(.)到倒数第二行($-1,$代表最后一行),s表示替换内容为/^后的内容(# )后面的空格要用转移字符\ //表示删除

[root@happyboy etc]# killall -9 named

杀死进程后重启

[root@happyboy etc]# rndc status   //可以查看到服务器状态,说明服务启动成功。

日志也正常

[root@happyboy root]# more /var/log/messages

Sep 23 22:14:04 happyboy named[22466]: listening on IPv4 interface lo, 127.0.0.1#53

Sep 23 22:14:04 happyboy named[22466]: listening on IPv4 interface eth0, 192.168.0.200#53  //在53端口守护

Sep 23 22:14:04 happyboy named[22466]: command channel listening on 127.0.0.1#953   //rndc守护端口

在确定resolve.conf中定义的DNS服务器为本身,可以正常解析出域名了

增加localhost域,开始就已经定义好了

named.conf 中

zone "localhost" {

        type master;             //类型为master,对应slave ,这个域的数据库需要自己维护

        file "named.local";     //指定该域的区文件

};

创建/var/named/named.local内容如下

@   IN  SOA    localhost.             root (

               2004081201            ;serial

               1H                    ;refresh

               15M                   ;retry

               1W                    ;expire

               1D )                  ;TTL

    IN  NS    @

    IN  A     127.0.0.1

第一个字段一般为一个域名或者一个主机名,这里的@表示当前的local区区名"localhost"

第二个字段指类型 IN(Internet互联网类型)

第三字段指记录类型,是服务器NS、地址、或者是文件交换记录。每个区都有一个SOA(起始授权机构)这样的记录记录,内容包括:该区文件是为哪个区(localhost.)定义的;后面

是该区域的管理者root是缩写,完整的应该以点结尾,没有以点结尾都会加上该区域的后缀,即完整的为root@localhost.,也以点结尾,但是@有定义为本区域,所以转意为

root.localhost.缩写为root,从小括号(与前面的root之间要有空格)开始是定义本域信息

后面两行完整应该为

localhost.     IN  NS   localhost.

localhost.     IN   A   127.0.0.1

因为localhost.同@,可以用其代替,有因为这几条记录都是基于同一个域名@的,所以前面省略了,最终同上述模式,这些记录的其他属性,如生存周期ttl同SOA记录

测试

[root@happyboy root]# host localhost

localhost has address 127.0.0.1

已经可以解析localhost这个在named.conf中定义的域了。

[root@happyboy root]# dig localhost  //也可以用dig来查询,信息比host丰富,具体。

named服务器有缓存功能,第一次解析会比较慢,后续会比较快!

如果有在named.conf中添加新的区域,配置好对应的区域文件后需要执行

# rndc reload                //重新载入配置文件  使其生效

测试:增加一个正向解析区域.

在nemd.conf中定义区域以及区域文件

zone "v1.com" {

        type master

        file "v1.com.zone";

};

定义v1.com.zone区域文件

@   IN  SOA    v1.com.            root (

               2004081201            ;serial

               36000                 ;refresh

               7200                  ;retry

               1W                    ;expire

               1D )                  ;TTL

     IN  NS    ns.v1.com.                    //ns.v1.com.可以简写为ns

     IN  MX 10 mail.v1.com.                   //mail.v1.com.可以简写为mail                  

     IN  A     192.168.0.100

ns   IN  A     192.168.0.200

www  IN  A     192.168.0.100

mail IN  A     192.168.0.100

news IN  CNAME www.v1.com.                  //www.v1.com.可以简写为www

[root@happyboy named]# rndc reload

rndc: 'reload' failed: failure

[root@happyboy named]# more /var/log/messages 

Sep 26 21:47:46 happyboy named[1452]: loading configuration from '/etc/named.conf'

Sep 26 21:47:46 happyboy named[1452]: /etc/named.conf:16: missing ';' before 'file'

Sep 26 21:47:46 happyboy named[1452]: reloading configuration failed: failure

在named.conf中定义新域时掉了一个分号(上面的master后),导致重新加载配置文件失败,修改好后正常

[root@happyboy named]# rndc reload

server reload successful

[root@happyboy named]# host v1.com

v1.com has address 192.168.0.100

v1.com mail is handled by 10 mail.v1.com.

注意上面的一行     IN  NS    ns.v1.com. 也可以更改为两行

     IN  NS    @

     IN  A     192.168.0.200  //这样表示该域名的ns记录同其@记录,然后在后面再定义其对应@记录即可,但是要注意由于@同上面的最开始省略,故该条记录不要错位到后面

前面有主机名的记录后面,如果在www  IN  A     192.168.0.200 在表示前面省略的是www了。

[root@happyboy named]# host -t NS v1.com

v1.com name server ns.v1.com.

[root@happyboy named]# host -t A v1.com

v1.com has address 192.168.0.100

[root@happyboy named]# host -t SOA v1.com

v1.com has SOA record v1.com. root.v1.com. 2004081201 36000 7200 604800 86400

[root@happyboy named]# host news.v1.com

news.v1.com is an alias for www.v1.com.

www.v1.com has address 192.168.0.100

可以看到如上的测试结果,为了在一个本地域中可以省略形式来访问,如只输入news来访问news.v1.com,实现方法如下:

[root@happyboy named]# echo "search v1.com" >> /etc/resolv.conf 

[root@happyboy named]# more /etc/resolv.conf 

nameserver 127.0.0.1 

search v1.com

[root@happyboy named]# host news

news.v1.com is an alias for www.v1.com.

www.v1.com has address 192.168.0.200

在区域文件开头部分可以写入全局配置参数

$TTL 1D            //指定全局的生存周期

$orignal v1.com。    //指定默认的域,不加也是

============================================================================

127.0.0 反向区域

/etc/named.conf 追加

zone "0.0.127.in-addr.arpa" {        //注意区名网段的反向地址+后缀.in-addr.arpa

    type master;

    file "127.0.0.zone";

};

编译/var/named/127.0.0.zone;

@       IN SOA     @   root.localhost. ( 2004051201 1H 14M 1W 1D )      //注意这里的@是代表反向区名0.0.127.in-addr.arpa.,root后面不能省略。

        IN NS      localhost.

1       IN  PTR    localhost.                //PTR反向解析  IP放在前面,主机名放在后面,数字1完整写法为1.0.0.127.in-addr.arpa.

测试

[root@happyboy root]# rndc reload

[root@happyboy root]# host 127.0.0.1

1.0.0.127.in-addr.arpa domain name pointer localhost.

[root@happyboy root]# dig -x 127.0.0.1           //该命令等同dig -t PTR 1.0.0.127.in-addr.arpa 

; <<>> DiG 9.4.0 <<>> -t PTR 1.0.0.127.in-addr.arpa

;; global options:  printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45631

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:

;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:

1.0.0.127.in-addr.arpa. 86400   IN      PTR     localhost.

;; AUTHORITY SECTION:

0.0.127.in-addr.arpa.   86400   IN      NS      localhost.

;; ADDITIONAL SECTION:

localhost.              86400   IN      A       127.0.0.1

;; Query time: 9 msec

;; SERVER: 127.0.0.1#53(127.0.0.1)

;; WHEN: Mon Oct  1 14:12:42 2007

;; MSG SIZE  rcvd: 93

增加一个反向区/etc/named.conf

zone "0.168.192.in-addr.arpa" {

        type master;

        file "192.168.0.zone";

};

/var/named/192.168.0.zone文件内容:

[root@happyboy named]# more 192.168.0.zone 

@   IN    SOA    v1.com.   root.v1.com.  (

                    2004081201

                    36000

                    7200

                    3600000

                    86400 )

    IN    NS      ns.v1.com.

100   IN    PTR     www.v1.com.

100   IN    PTR     ftp.v1.com.

3.0.168.192.in-addr.arpa.   IN PTR  mail.v1.com.

测试:

[root@happyboy named]# host 192.168.0.100

100.0.168.192.in-addr.arpa domain name pointer www.v1.com.

100.0.168.192.in-addr.arpa domain name pointer ftp.v1.com.

[root@happyboy named]# host 192.168.0.3

3.0.168.192.in-addr.arpa domain name pointer mail.v1.com.

注意:在做反向解析时尽量不要使用ns记录与其反向记录在同一个IP上,这样可能出现未知的错误,不会出错,但是就是查询不出来的现象。

==========================================================================

子域授权(就是常用的DNS解析中的NS记录)

主服务器的/var/named/v1.com.zone 增加两行

domain     IN      NS    ns.domain     (完整写法为:domain.v1.com.     IN      NS    ns.domain.v1.com.) 

ns.domain  IN      A     192.168.2.1

(domain    IN      NS    domain

           IN      A     192.168.2.1   //也可以简单地写成这样两行,domain为自己的NS记录,IP指向为……)

在192.168.2.1 上配置bind服务器,如下:

增加一个子域:domain.v1.com,named.conf配置文件增加:

zone "domain.v1.com" {

    type maser;    

    file "domain.v1.com.zone";

};

子域服务器的区文件 domain.v1.com.zone如下:

@   IN   SOA   domain.v1.com.     root.domain.v1.com.

         (2004081201   36000 7200    3600000   86400 )

        IN     NS    ns.domain.v1.com.

ns      IN     A     192.168.2.1

www     IN     A     192.168.2.100

完成后测试方法同主服务器,即将本地/etc/resolve.conf中的DNS更改为127.0.0.1。# host www.domain.v1.com即可看到结果。

注意:这样正确配置完成后在主服务器192.168.0.200上也可以查到授权给子域服务器192.168.2.1解析的domain.v1.com的内容。但是子域名如果查找父域还是要从根(.)域开始查

找。实际上实现的是一个递归查询的过程,整个DNS系统本来就是一个授权过程。具体请参考网络上相关文档。

==========================================================================================

辅助域名服务器

作用:备份主域名服务器的数据,当主服务器出现故障时可以暂时代替主服务器工作。

eg:在辅域上配置v1.com

主配置文件/etc/named.conf上增加该域

zone "v1.com" {

    type slave;                    //指定为辅域

    file "v1.com.zone";

    masters { 192.168.0.200; };   //注意主域名服务器地址用大括号括起来,括号前后都有空格。

};

# rndc reload            //重新载入配置文件

注意:这个更新过程需要对named的directory "/var/named"写入从主服务器上获取的数据,所以named进程用户必须对该目录有写入权限,否则,上述reload过程会失败。

如果是以root用户运行named则不存在这个问题,如果是以named用户named组运行named则执行# chmod g+w  /var/named即可。

主服服务器之间数据的同步主要靠

@   IN  SOA    localhost.             root (

               2004081201            ;serial      //序列号:服务器版本管理信息,时间越新,数字月大。有变化时通知其他DNS更新数据。

               1H                    ;refresh     //辅服务器每间隔这个时间向主服务器发送请求,时间由该值决定。如果上述编号变化,则发送请求,数据同步

               15M                   ;retry       //辅与主通信如果由于网络等原因失败,再次通信前的间隔时间。

               1W                    ;expire      //过期时间:主辅服务器如果在这个定义时间内不停重试还是无法通信,则表示该记录过期。

               1D )                  ;TTL         //最小生存期限,即该区记录的生存期限,一般写在SOA前面,表示该SOA记录缓存时间,默认一天(1D)

这些来实现

===============================================================================

以普通用户身份执行named服务,确保服务器安全。

普通用户在执行时需要写/var/run目录,该目录包含了每个进程的pid文件。

[root@happyboy root]# ls -ld /var/run

drwxr-xr-x    6 root     root         4096 10月  1 13:06 /var/run

可以看到其他用户对该目录是不具备写入权限的。为了安全,不更改/var/run 目录,给named建立一个独立pid目录,修改该目录权限,如下:

首先修改named.conf,设置pid-file选项值:

options {

……

pid-file  "/var/run/named/named.pid";                  //指定named.pid目录

};

[root@happyboy root]# useradd -s /bin/false -d /dev/null named

[root@happyboy root]# id named

uid=515(named) gid=515(named) groups=515(named)

[root@happyboy root]# mkdir /var/run/named

[root@happyboy run]# chown named.named named

[root@happyboy run]# chmod 700 named

[root@happyboy run]# ls -ld named

drwx------    2 named    named        4096 10月  1 13:17 named

[root@happyboy run]# killall -9 named

[root@happyboy run]# named -u named            //更改好权限后以named身份运行named

[root@happyboy run]# more /var/log/messages    //查看日志信息可以看到named已经启动成功。

[root@happyboy run]# ps -uax |grep named

named     1427  0.1  1.9  7248 5088 ?        S    13:27   0:00 named -u named

[root@happyboy run]# which named

/usr/local/sbin/named

[root@happyboy run]# echo "/usr/local/sbin/named -u named" >> /etc/rc.local  //让named服务在系统启动时以named身份执行

同时注意,如果是作为辅服务器运行,需要使named用户对named的工作目录/var/named有写入权限。作为主服务器的话无所谓了。

DNS服务器配置常用选项:

options {

    directory "/var/named";                    //服务器工作目录,即数据库文件存放位置。

    forwarders { 192.168.2.1: };           //如果本身无法对某个域名无法解析,将请求转发给的服务器,一般为外部DNS服务器,当该服务器也无法解析就查找根

    allow-transfer { 192.168.1.1; };           //是否允许某一个网段或某一个地址同步该服务器上的数据,一般指定辅服务器地址

    allow-query { 192.168.0/24; };             //允许查询的客户机地址或者范围。非该范围内的DNS查询请求会被拒绝,具体体现日志中。

};

zone  "v1.com" {

    type master;                              

    file "v1.com.zone";

    allow-transfer { 192.168.1.1; };         //意义同options,只是这个是对这个域有效

};

注意:bind的配置文件格式是非常严格的,大括号前后的空格

(0)
(0)