分类: 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文件查找nameserver和search这这两行。也就是说它只会解析到在/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 Wrapper和PAM对DNS服务不适用,我们的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 Server将nameserver指向127.0.0.1,而我们的全局配置部分没有开启127.0.0.1的接口,那么DNS Server将不能够解析,但是客户端却可以解析成功。
我们做个试验来验证一下
首先将DNS Server的nameserver指向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 Server是192.168.0.254负责解析example.com的域名。还有一台DNS Server是192.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 Server是192.168.0.254负责解析example.com的域名。还有一台DNS Server是192.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.com和google.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.com和google.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服务的讨论就到这里了。