Chinaunix首页 | 论坛 | 博客
  • 博客访问: 162204
  • 博文数量: 126
  • 博客积分: 1073
  • 博客等级: 上尉
  • 技术积分: 1175
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 00:32
文章分类

全部博文(126)

文章存档

2018年(56)

2013年(1)

2012年(8)

2011年(61)

分类: LINUX

2011-01-24 21:10:28

连载

RHEL5.4配置DNS服务(1)

http://blog.chinaunix.net/space.php?uid=14762370&do=blog&id=100699

RHEL5.4配置DNS服务(2)

http://blog.chinaunix.net/space.php?uid=14762370&do=blog&id=100701

 

DNS中怎么去查询

在查询之前,首先要了解/etc/nsswitch这个文件,这个文件就定义了解析的顺序,

我们现在打开这个文件来看一下

#hosts:     db files nisplus nis dns

hosts:      files dns

在这个文件中就定义解析顺序为先查询hosts文件,然后在查询DNS

下面再来介绍查询的三种方式

1.      host

host的方式来查询是不会去读取/etc/nsswitch.conf,那么它在查询的时候是不会读取/etc/hsots文件的。只会在/etc/resolv.conf文件查找nameserversearch这这两行。也就是说它只会解析到在/etc/resolv.conf文件中定义的。

现在我们来做一个试验,在/etc/hosts中定义几条记录。

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1               localhost.localdomain localhost

::1                          localhost6.localdomain6 localhost6

192.168.0.254      www

~

现在我们用host的命令来查询一下

[root@localhost ~]# host

;; connection timed out; no servers could be reached

[root@localhost ~]#

可以看到,host命令的确查询不到

现在我们在用host命令来查询一下www,看下能否查询的到。

[root@localhost ~]# host www

has address 192.168.0.254

[root@localhost ~]#

可是用host命令来查询www却查询出来了,这个是因为hsot文件虽然读取不到/etc/hsots文件,但是可以读取到/etc/reslov这个文件中的search example.com这一行,当我们用host命令来解析www的时候,search这一行的意义就在于它会帮我们补齐后面的example.com。而我们的. 这个在我们的DNS中是可以被解析出来的,这也就是为什么我们可以查询到的原因。

现在我们ping程序来尝试一下,

[root@localhost ~]# ping

PING .example.com (192.168.0.254) 56(84) bytes of data.

64 bytes from (192.168.0.254): icmp_seq=1 ttl=64 time=0.767 ms

64 bytes from (192.168.0.254): icmp_seq=2 ttl=64 time=0.122 ms

64 bytes from (192.168.0.254): icmp_seq=3 ttl=64 time=0.050 ms

64 bytes from (192.168.0.254): icmp_seq=4 ttl=64 time=0.060 ms

可以看到,ping是可以读取到这个文件。

默认情况下,用host命令来查询的时候仅有少量的输出。

关于hsot命令的一些其他用法

Host  -rf   ns   example.com

这条命令是用来授权的

[root@localhost ~]# host -rf ns example.com

 

Host  -r   example.com

这条命令是用来强制迭代的

[root@localhost ~]# host -r example.com

 

Host   192.168.0.254

这条命令是用来反向查询的

[root@localhost ~]# host 192.168.0.254

 

Host  -t  mx   example.com

这条命令是用来查询MX资源记录的

[root@localhost ~]# host -t mx example.com

 

Host  -t  soa   example.com

这条命令是用来查询SOA记录的

[root@localhost ~]# host -t soa example.com

 

Host  -t  axfr  example.com  192.168.0.254

DNS和辅助DNS有那些数据可以同步

[root@localhost ~]# host -t axfr example.com 192.168.0.254

 

2.      dig

dig这个命令和host一样,它也不会读取/etc/nsswitch文件。同样也不会读取/etc/hosts文件。它与host的区别在于,host命令可以读取到/etc/reslov里面的search nameserver这两行。而dig命令只能够读取/etc/reslov文件中的nameserver这一行。也就是说dig命令只能够查询DNS Server里面的定义的记录。

同样是刚才在/etc/hosts文件中定义的内容,现在使用dig命令来查询一下。

[root@localhost ~]#

[root@localhost ~]# host

;; connection timed out; no servers could be reached

[root@localhost ~]#

可以看到,dig命令也查询不到

在来查询一下www

 

[root@localhost ~]# dig www

 

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> www

;; global options:  printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 46106

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

 

;; QUESTION SECTION:

;www.                           IN      A

 

;; Query time: 57 msec

;; SERVER: 192.168.0.254#53(192.168.0.254)

;; WHEN: Mon Feb 22 14:08:30 2010

;; MSG SIZE  rcvd: 21

 

[root@localhost ~]#

可以看到,用dig这条命令来查询www,是查询不到的。

Dig命令的输出是标准的RFC的区块文件中格式,

关于dig命令的一下其他用法

Dig  +trace   example.com

这条命令是用来进行DNS的跟踪查询。

[root@localhost ~]# dig +trace example.com

 

Dig  . 

正向查询

[root@localhost ~]# dig

Dig  –x  192.168.0.10

反向查询

[root@localhost ~]# dig -x 192.168.0.10

 

Dig  -t  mx  example.com

查询邮件交换记录

[root@localhost ~]# dig -t mx example.com

 

Dig  -t  soa  example.com

查询SOA记录

[root@localhost ~]# dig -t soa example.com.

 

Dig –t axfr  example.com @192.168.0.254

DNS和辅助DNS有那些数据可以同步

[root@localhost ~]# dig -t axfr example.com @192.168.0.254

 

下面再来讲解DNS下面的语法检查工具

Service named configtest

[root@localhost ~]#

[root@localhost ~]# service named configtest

zone localdomain/IN: loaded serial 42

zone localhost/IN: loaded serial 42

zone 0.0.127.in-addr.arpa/IN: loaded serial 1997022700

zone 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: loaded serial 1997022700

zone 255.in-addr.arpa/IN: loaded serial 42

zone 0.in-addr.arpa/IN: loaded serial 42

zone example.com/IN: loaded serial 2010022102

zone 0.168.192.in-addr.arpa/IN: loaded serial 2010022102

[root@localhost ~]#

如果我们的配置文件有问题,那么利用这个工具可以来查看,用这个工具可以提示那些配置文件的哪里有问题,很强大。

当然也可以使用这条命令重启服务

Service  named  restart

[root@localhost ~]#

[root@localhost ~]# service named restart

Stopping named:                                            [  OK  ]

Starting named:                                              [  OK  ]

[root@localhost ~]#

当我们的DNS的配置有问题的时候,重启启动服务,也会提示报错。

还有当DNS的配置有问题的时候,查看日志也是一个非常的方法。

[root@localhost ~]# tail /var/log/messages

DNS下次启动的时候生效,使用下面这条命令。

Chkconfig named on

以上的所以内容只是将DNS配置出来了,并没有设计到DNS安全的控制,DNS这个服务可以通过防火墙来控制,还有Selinux,但是TCP WrapperPAMDNS服务不适用,我们的DNS也有自己的访问控制的方法。

 

下面就来讨论DNS自己的访问控制方法,

可以在/etc/named.conf这个文件中进行访问控制

我们可以在/etc/named.conf文件中定义访问控制列表

在系统已经预定义了四个ACL

None         不匹配任何IP地址

Any           匹配任何IP地址

Localhost   匹配名称服务器的IP地址

Localnets   直连的网络(本网络)

最好的办法是在/etc/named.conf文件的开始处定义ACL

// caching-nameserver package upgrade.

//

acl " acl1" { 192.168.0.10};

acl "acl2" { 192.168.0.20};

acl "acl3" {192.168.0.30 };

options {

我们定义了三个ACL,分别是acl1,acl2,acl3,这些名字可以随意定义。

如何去引用ACL

可以在下面来引用ACL

options {

        listen-on port 53 { any; };          

        listen-on-v6 port 53 { ::1; };

        allow-query     { acl1};

        allow-query-cache { any; };

我们在全局部分配置了允许查询是acl1,也就是说只有192.168.0.10够在DNS Server上面进行解析,其他的客户端均无法解析,测试下。

首先重启下服务

[root@localhost ~]#

[root@localhost ~]# service named restart

Stopping named:                                            [  OK  ]

Starting named:                                              [  OK  ]

[root@localhost ~]#

服务启动成功,

[root@localhost ~]# ssh 192.168.0.10

root@192.168.0.10 password:

Last login: Mon Feb 22 15:44:44 2010 from

[root@localhost ~]#

[root@localhost ~]# nslookup

> .

Server:           192.168.0.254

Address:        192.168.0.254#53

Name:  

Address: 192.168.0.254

> exit

192.168.0.10解析正常。

我们在到192.168.0.20去测试解析一下,

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20s password:

Last login: Mon Feb 22 15:51:16 2010 from 192.168.0.254

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

** server can't find .example.com: REFUSED

192.168.0.20明显不可以解析,我们刚才定义的允许查询没有192.168.0.20

 

还有一个关于在全局配置部分监听端口的问题

options {

        listen-on port 53 { any; };          

        listen-on-v6 port 53 { ::1; };

any 代表监听在所有的接口

如果我们的DNS Servernameserver指向127.0.0.1,而我们的全局配置部分没有开启127.0.0.1的接口,那么DNS Server将不能够解析,但是客户端却可以解析成功。

我们做个试验来验证一下

首先将DNS Servernameserver指向127.0.0.1

search example.com

nameserver 127.0.0.1

~ 

然后在named.conf文件的全局配置文件不开启127.0.0.1

options {

        listen-on port 53 { 192.168.0.254 ; };

重启一下DNS服务

[root@localhost ~]#

[root@localhost ~]# service named restart

Stopping named:                                            [  OK  ]

Starting named:                                              [  OK  ]

[root@localhost ~]#

服务启动成功,

DNS Server来解析测试一下

[root@localhost ~]# nslookup

>

;; connection timed out; no servers could be reached

我们的在DNS Server上面也不可以解析

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 16:12:14 2010 from station10.example.com

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Name:  

Address: 192.168.0.254

相反的,我们的客户端还可以解析成功,这个就是因为没有named,conf文件中没有把监听接口指向本地回环接口。如果用any来表示就包含了本地回环接口。

当然,我们在监听接口后面加上127.0.0.1也是可以的。

 

还有一条很重要的命令,可以来查看监听端口的

[root@localhost ~]#

[root@localhost ~]# netstat -tulpn | grep named

tcp        0      0 192.168.0.10:53       0.0.0.0:*          LISTEN      15936/named        

tcp        0      0 127.0.0.1:53             0.0.0.0:*          LISTEN      15936/named        

tcp        0      0 127.0.0.1:953           0.0.0.0:*          LISTEN      15936/named        

tcp        0      0 ::1:53                      :::*                      LISTEN      15936/named        

tcp        0      0 ::1:953                     :::*                     LISTEN      15936/named        

udp        0     0 192.168.0.10:53     0.0.0.0:*                               15936/named        

udp        0     0 127.0.0.1:53           0.0.0.0:*                               15936/named        

udp        0     0 ::1:53                      :::*                                         15936/named        

[root@localhost ~]#

这条命令可以查询到我们的DNS服务都监听在那些端口上面。

 

刚才我们讲解了allows-query(允许查询),现在再来看看allow-recursion(允许递归查询),以及它们之间有什么区别。

Allow-query    

允许查询是指查询权威的记录和缓存的记录

当允许查询的客户端来查询的时候,DNS Server中权威记录和缓存记录有客户端需要的记录,那么DNS Server就直接给你,如果没有客户端要查询的记录,那么DNS Server就会告诉客户端解析不到。

Allow-recursion 

和允许查询一样,如果有客户端需要的记录,我就直接给你,如果没有这条记录,我就帮你去其他的DNS Server上面去查询。

下面就在named.conf文件中去定义允许递归

};

view localhost_resolver {

        match-clients      { 192.168.0.0/24; };

        match-destinations { any; };

        recursion yes;

        include "/etc/named.rfc1912.zones";

};

可以看到,在我们视图中有个recursion yes,就代表这个视图已经默认的开启的允许递归查询,当然,我们可以将它写在全局部分。

下面我们来做一个试验理解允许递归的意思。

现在我有两台DNS Server ,一台DNS Server192.168.0.254负责解析example.com的域名。还有一台DNS Server192.168.0.10负责解析Google.com这个域名。

现在我们找一台客户端192.168.0.20。将这台客户端的DNS指向192.168.0.254

search example.com

nameserver 192.168.0.254

~   

然后在到192.168.0.254这台DNS Server中进行配置

开启允许递归的功能和转发DNS的功能

        allow-query     { 192.168.0.0/24; };

        allow-query-cache { any; };

        forwarders      { 192.168.0.254; };  

};

view example.com {

        match-clients      { 192.168.0.0/24; };

        match-destinations { any; };

        recursion yes;

        include "/etc/named.rfc1912.zones";

forwarders   { 192.168.0.9; };   这个就是开启的DNS转发功能,稍后讲到。

recursion yes;         这个就是开启了example,com这个视图的允许递归功能。

重启一下DNS服务

[root@localhost ~]#

[root@localhost ~]# service named restart

Stopping named:                                            [  OK  ]

Starting named:                                              [  OK  ]

[root@localhost ~]#

服务启动成功,

现在我们到192.168.0.20这台客户端上面去解析

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 16:12:39 2010 from station10.example.com

[root@localhost ~]# nslookup

>  

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Name:  

Address: 192.168.0.254

可以看到,我们在客户端上面解析example,com这个域名没有问题,因为我们开启了允许192.168.0.0/24这个网段来查询,并没有对它做控制。

[root@localhost ~]#

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 21:42:33 2010 from mail.example.com

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Non-authoritative answer:

Name:  

Address: 192.168.0.10

可以看到,现在我们在客户端上面解析这个域名也没有问题,这个是怎么回事,我们明明将DNS指向了192.168.0.254.Google.com做解析的是192.168.0.10这台DNS Server。这个就是因为我们在192.168.0.254这台DNS Server上面开启了转发DNS并且开启了允许递归的功能。也就是说客户端想解析 这个域名,但是客户端所指向的DNS Server并不能够解析出来,从而将请求丢给了我们的转发DNS。而我们的转发DNS就可以解析出  这个域名。而且提示这个解析是非权威应答。并不是我自己帮你解析出来的,而是我将请求给别的DNS。是由它帮我解析出来的,所以是非权威应答,当然,如果我们不开启allow- recursion,就算开启了转发DNS也没有用。下面我们试一下

我们现在将allow- recursion的功能给关闭,

view example.com {

        match-clients      { 192.168.0.0/24; };

        match-destinations { any; };

        recursion no;

        include "/etc/named.rfc1912.zones";

};

recursion no    关闭允许递归的功能

我们现在将allow- recursion的功能给关闭了,在来测试下。

重启一下DNS服务

[root@localhost ~]#

[root@localhost ~]# service named restart

Stopping named:                                            [  OK  ]

Starting named:                                              [  OK  ]

[root@localhost ~]#

服务启动成功,

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 21:50:21 2010 from mail.example.com

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Non-authoritative answer:

*** Can't find : No answer

现在就可以清楚的看到,由于关闭了允许递归的功能,现在的就解析不到了,而我们的转发DNS也同样开启了。

现在有一个问题,如果我们关闭了allow-query, 打开了allow-recursion功能,那么我们将什么也解析不到

这个就是allow-query allow-recursion之间的区别,当这两句话在DNS的配置文件里面都没有现在,默认是允许查询一切。

allow-query allow-recursion可以写在全局部分,也可以写在视图里面。

如果我们在全局里面定义了allow-query { none; };

在视图里面定义了allow-query { any; };

如果是这样子,那么只有视图里面定义匹配的客户端可以查询,其他的任何客户端就不可以查询了。

下面在来介绍allow-transfer

allow-transfer就是意思是定义那些辅助DNS可以和主DNS来同步

        allow-query       { 192.168.0.254; };

        allow-query-cache  { any; };

        allow-transfer      { 192.168.0.10; };

如果没有在DNS配置里面没有这条,默认是允许所有辅助DNS来同步。

 

下面来学习转发DNS和缓存DNS

转发DNS (forward  only)            

缓存DNS(forward   first)

关于转发DNS和缓存DNS之间的区别

Forward first  当客户端来查询时,先看自己的缓存里面是否有该记录,如果有,则直接回应,如果没有,则将请求给上一级DNS Server .如果上一级DNS Server也没有,则去根节点查询

Forward  only   如果没有,则停止,返回客户端无结果。

关于转发DNS和缓存DNS的配置

        allow-query     { 192.168.0.254; };

        allow-query-cache { any; };

        allow-transfer   { 192.168.0.20; };

        forwarders       {192.168.0.10; };

        forward  first;

        forward  only;

如果在DNS的配置中没有定义forward,那么默认就是缓存DNS

Forward  first forward only都有转发和缓存的功能。

我们做个试验,来证明这点。

现在我有两台DNS Server ,一台DNS Server192.168.0.254负责解析example.com的域名。还有一台DNS Server192.168.0.10负责解析Google.com这个域名。

首先我们来做转发DNS

现在我们找一台客户端192.168.0.20。将这台客户端的DNS指向192.168.0.254

search example.com

nameserver 192.168.0.254

~   

然后在到192.168.0.254这台DNS Server中进行配置转发DNS

        allow-query     { 192.168.0.254; };

        forwarders       {192.168.0.10; };

        forward  only;

重启一下DNS服务

[root@localhost ~]#

[root@localhost ~]# service named restart

Stopping named:                                            [  OK  ]

Starting named:                                              [  OK  ]

[root@localhost ~]#

服务启动成功,

然后在客户端测试解析

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 23:00:40 2010 from 192.168.0.254

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Name:  

Address: 192.168.0.254

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Non-authoritative answer:

Name:  

Address: 192.168.0.10

现在我们可以查询到example.comgoogle.com。这些都是正常的。接下来我们要做的事情就是关闭192.168.0.10这台DNS Server

[root@localhost ~]# service named stop

Stopping named:                                            [  OK  ]

[root@localhost ~]#

我们已经关闭了192.168.0.10这台DNS Server,也就是说我们应该查询不到google.com。我们来看一下

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 23:04:00 2010 from mail.example.com

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Non-authoritative answer:

Name:  

Address: 192.168.0.10

>

可以看到, 这个域名一样的解析到了,这个就是因为我们的转发DNS也是有缓存的。

现在我们清除192.168.0.254这台DNS Server的缓存,

[root@localhost ~]# rndc flush

[root@localhost ~]#

Rndc flush这条命令是用来清除缓存的。

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 23:08:52 2010 from station10.example.com

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

** server can't find : NXDOMAIN

现在我们可以看到,清除缓存以后,客户端就查询不到了。

 

现在我再来做缓存DNS

在到192.168.0.254这台DNS Server中进行配置缓存DNS

        allow-query     { 192.168.0.254; };

        forwarders       {192.168.0.10; };

        forward  first;

重启一下DNS服务

[root@localhost ~]#

[root@localhost ~]# service named restart

Stopping named:                                            [  OK  ]

Starting named:                                              [  OK  ]

[root@localhost ~]#

服务启动成功,

然后在客户端测试解析

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 23:00:40 2010 from 192.168.0.254

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Name:  

Address: 192.168.0.254

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Non-authoritative answer:

Name:  

Address: 192.168.0.10

现在我们可以查询到example.comgoogle.com。这些都是正常的。接下来我们要做的事情就是关闭192.168.0.10这台DNS Server

[root@localhost ~]# service named stop

Stopping named:                                            [  OK  ]

[root@localhost ~]#

我们已经关闭了192.168.0.10这台DNS Server,也就是说我们应该查询不到google.com。我们来看一下

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 23:04:00 2010 from mail.example.com

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

Non-authoritative answer:

Name:  

Address: 192.168.0.10

>

可以看到, 这个域名一样的解析到了,这个就是因为我们的缓存DNS也是有缓存的。

现在我们清除192.168.0.254这台DNS Server的缓存,

[root@localhost ~]# rndc flush

[root@localhost ~]#

Rndc flush这条命令是用来清除缓存的。

[root@localhost ~]# ssh 192.168.0.20

root@192.168.0.20's password:

Last login: Mon Feb 22 23:08:52 2010 from station10.example.com

[root@localhost ~]# nslookup

>

Server:           192.168.0.254

Address:        192.168.0.254#53

 

** server can't find : NXDOMAIN

现在我们可以看到,清除缓存以后,客户端就查询不到了。

试验证明,不管是转发DNS还是缓存DNS都是有转发和缓存的功能的。

 

linux下面配置DNS服务的讨论就到这里了。

阅读(1236) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~