通常Linux初学者会问:Linux 中有没有一个标准的配置文件格式?一句话,没有。不熟悉 Linux 的用户一定会感到沮丧,因为每个配置文件看起来都象是一个要迎接的新挑战。在 Linux 中,每个网管员都可以自由选择自己喜欢的配置文件格式。DNS就是Domain Name System, DNS服务器可以分为三种,高速存服务器(Cache-only server)、主服务器(Primary Name server)、辅助服务器(Second Name Server)。 DNS的详细原理、工作流程、术语、概念,限于篇幅,这里就不说了。

一、Linux 下主要DNS配置文件

Linux 下主要DNS配置文件见表一、二、三:

表-1 DNS主要配置文件

文件名称

中文名称

作用

/etc/hosts

主机的一个列表文件

包含(本地网络中)已知主机的一个列表。如果系统的 IP 不是动态生成,就可以使用它。对于简单的主机名解析(点分表示法),在请求 DNS NIS 网络名称服务器之前,/etc/hosts.conf 通常会告诉解析程序先查看这里。

/etc/host.conf

转化程序控制文件

告诉网络域名服务器如何查找主机名。(通常是 /etc/hosts,然后就是名称服务器;可通过 netconf 对其进行更改)

/etc/resolv.conf

转化程序配置文件

在配置程序请求BIND域名查询服务查询主机名称时必须告诉程序使用那个域名服务器和 IP 地址来完成这个任务。

Linux上的域名服务由named守护进程控制,该进程从主文件:/etc/named.conf中获取信息。它包括一族将主机名称映射为IP地址的各种文件:下面是named配置文件族详细内容。

表-2 named配置文件族

名称

中文名

作用

/etc/named.conf

主文件

设置一般的name参数,指向该服务器使用的域数据库的信息源

/var/named/named.ca

根域名配置服务器指向文件

指向根域名配置服务器,用于唯告诉缓存服务器初始化。

/var/named/localhost.zone

Localhost正向域名解析文件

用于将本地IP地址(127.0.0.1)转化为回送方localhost名字。

/var/named/name.local

Localhost反向域名解析文件

用于将localhost名字转化为本地回送IP地址(127.0.0.1)。

/var/named/name2ip.conf

用户配置区的正向解析文件

将主机名映射为IP地址的区文件。

/var/named/ip2name.conf

用户配置区的反向解析文件

IP地址映射为主机名称的区文件

named.conf时DNS中的核心它的配置 见表三:

表-3 named.conf文件的配置

命令 

语法

acl  

定义IP地址的访问控制清单 

control

定义rndc使用的控制通道

include

把其他文件包含到配置文件中 

key 

定义授权的安全密钥 

logging

定义日志内容和位置 

opitons 

定义全局配置选项和缺省值

server 

定义远程服务器的特征 

zone 

定义一个区

二、DNS 配置文件检查工具

可以看出Linux下DNS配置文件比较复杂,不过我们可以通过一些工具来帮助你检查DNS文件错误。

ping命令

检 查DNS配置最简单的方法是使用Ping命令,直接Ping主机名称。PING是一种很好的方法,它能够决定当特定主机处于开机运行状态时,网络是否正常 运行。遇到DNS问题时检查的第一项是系统和网络的状态,而且首先检查并判断存在问题的DNS服务器是否有响应。如果能够PING到DNS服务器,则能确 保与DNS服务器的连接无误。如果无法PING到DNS服务器,那么很有可能系统死机了。为了证实这是系统问题而非网络问题,再来检测DNS连接的路由器 是否正常运行。为DNS排错时,应尽量使用IP地址替代DNS名称以减少由DNS服务器而不是主机产生问题的可能性。

#ping 
PING ) 56(84) bytes of data
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.420 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.374 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.372 ms
……

nslookup命令

在 Linux下配置好DNS服务器,添加了相应的记录之后,只要IP地址保持不变,一般情况下我们就不再需要去维护DNS的数据文件了。不过在确认域名解释 正常之前我们最好是测试一下所有的配置是否正常。许多人会简单地使用ping命令检查一下就算了。不过Ping指令只是一个检查网络联通情况的命令,虽然 在输入的参数是域名的情况下会通过DNS进行查询,但是它只能查询A类型和CNAME类型的记录,而且只会告诉你域名是否存在,其他的信息一概欠奉。所以 如果你需要对DNS的故障进行排错就必须熟练另一个更强大的工具nslookup。

nslookup即名称服务器查找(Name Server Lookup),用来查找DNS服务器上的DNS记录。这个命令可以指定查询的类型,可以查到DNS记录的生存时间还可以指定使用那个DNS服务器进行解释。

运行nslookup需要安装bind-utils,可以使用命令查询:

#rpm –qa|grep bind-utils

nslookup有两种运行模式:交互式和非交互式运行模式。交互式运行模式允许用户通过域名服务器检索各种主机,并可以打印出主机名称列表。非交互式运行模式用来打印所请求的某个主机或域的特定的信息。进入“nslookup”交互式运行模式,运行下面的命令:

#nslookup

在使用交互模式。此时会出现提示符"<",nslookup提供了许多可用命令。下面列举其中一些常用的详细说明。

help命令:显示帮助信息,及一些简单的命令的作用。

exit 命令:退出nslookup命令。

lserver命令:查找指定的域名服务器并将其设置为默认的域名服务器。

server命令:和lserver相似,解析另一台域名服务器并将其设置为默认的服务器,不同在于本命令使用当前的默认服务器来解析。

set命令:修改工作参数,它也是nslookup中最常用的命令。它可以包含下面的几种:

set class:设置查询的类型,一般情况下为Internet。

set debug:设置调试模式。

set nodebug:设置为非调试模式。

set d2:设置详细调试模式。

set nod2:设置为非详细调试模式。

set [no]defname:设置为defname,会在所有没有加"o"的名字后,自动加上默认的域名。它是默认的方式。

set domain:设置默认的域名。

set port:DNS的默认端口为53,用本命令可以设置其他端口,一般用于调试。

set q(querytype):改变查询的信息的类型。默认的类型为A纪录。

set recurse:设置查询类型为递归;若为set norecurse,查询类型为跌代;缺省为前者。

set retry:设置重试的次数。默认的值为4。

set root:设置默认的根服务器。

set timeout:设置等待应答的限制时间(单位为秒),超出即为超时,如果还可以重试,就会将长超时值加倍,重新查询。默认的超时值为5秒。

如果要进入nslookup非交互式运行模式,运行下面的命令:

#nslookup 

错误实例:

#nslookup
*** Can't find server name for address 192.168.2.1: Timed out 
*** Default servers are not available 
Default Server: UnKnown 
Address: 192.168.2.1

错误原因:如果出现错误,该命令将不能启动。一般的错误都是数据 库文件或配置文件笔误所至。比如少个“.”或者文件明不正确等等。另外一个主要的原因是执行 nslookup 的系统所使用的 server(如 192.168.2.1) 不能查询其反解(1.2.168.192.in-addr.arpa)。
解决方法:

增加 server ip 所在的 reverse zone (如 2.168.192.in-addr.arpa),确定其中有 server 本身的反解项目。

3、 使用dlint软件检查DNS故障

dlint是一个专门检查DNS配置文件开放源代码软件,运行它系统要求安装Perl语言和DiG命令(BIND中一个软件包):

#rpm –qa|grep perl
#dig hostname any
Perl 5.8.0
; <<>> DiG 9.2.1 <<>>
;; global options:  printcmd

软件下载:dlint软件主页是http://www.domtools.com/dns/dlint.shtml 下载链接:http://www.domtools.com/pub/dlint1.4.0.tar.gz 文件大小:22KB。

软件安装:

#gunzip dlint1.4.0.tar.gz
#tar vxf dlint1.4.0.tar
#cd dlint1.4.0
#make install

系统会将dlint安装在/usr/bin/目录下。

dlint首先检查拼写错误。

有A记录的主机名称必须有PTR(称 pointer, PTR反向解析)记录。如果有A记录的主机名称没有PTR,配置文件不能通过。Dlint可以在用户配置文件中为A建立查找丢失的PTR记录。

dint会检查in-addr.arpa区带(Zone)的每一条PTR记录是否有对应的A记录存在。

dint会以递归的方式检查子区带(Zone),查找配置问题。

应用实例:

[root@www dlint1.4.0]# dlint 
;;  dlint version 1.4.0, Copyright (C)
;; 1998 Paul A. Balyoz <>
;;  Dlint comes with ABSOLUTELY NO WARRANTY.
;;  This is free software, and you are welcome to redistribute it
;;  under certain conditions.  Type 'man dlint' for details.
;; command line: /usr/local/bin/dlint 
;; flags: normal-domain recursive.
;; using dig version 9.2.1
;; run starting: 五  6月 18 12:02:29 CST 2004
;; ============================================================
;;  Now linting 
Checking serial numbers per nameserver
;;      2002063000 NS1.cao.com.
;;     2002063000 NS2.cao.com.
;; All nameservers agree on the serial number.
;; Now caching whole zone (this could take a minute)
;; trying nameserver NS1.cao.com.
;; 12 A records found.
;; ============================================================
;;  dlint of  run ending with errors.
;;  run ending: 五  6月 18 12:02:40 CST 2004

;; 后边是程序版本和解释语句,ERROR后边是Dlint对DNS配置文件的检查结果。如果没有ERROR字段表示配置正确。Dlint能检查的DNS配置文件主要错误:

1. 没有增加 SOA (start of authority) RR 的 serial 值

这 是最主要的 DNS 出错的原因. 因为, serial 值没有增加, secondary server 就不会在 primary server 的配置文件改变后随之改变。 包括改变 SOA 里面其它的值, seconrary server 自己并不会发觉. 即使是修改 SOA RR 里面的资料, 也都要记得去改 SOA RR 的 serial 值. 改了 serial 后,secondary 到时后查出有增加, 就会从 primary 作一次 zone transfer. 改了 SOA RR 后, 最好去测试一下 secondary server 是不是有更新. 目前有dlint软件可以分析任何DNS区带。

2. 在 BIND 中的配置文件, 少写了一个点 (.)

少写了一个点, 看起来差不多. 但是却造成了很大的问题. BIND 的设定档案一定要小心的设定. 要不然很可能产生很多错误。

3、错误的 resolv.conf 设定

resolv.conf 里面包含了 local domain, 当你没有把全部的 domain name 设定好时, 就会自动加上去这个东西. 然后机器就不会去查 DNS 而直接用这个 domain name 连出去了. 要是 resolv.conf 有不正确的 domain name entry, 那就有可能连到一堆不存在的地方. (然后得到 error.)

4. rndc命令

rndc指令是系统管理员用来管理域名服务器的操作的命令。rndc主要命令:

rndc  reload用来装入新的数据库。
rndc status 查看目前DNS服务器状态。
rndc stop  停止DNS服务器。
rndc restart 从新启动DNS服务器。
rndc stats 生成DNS统计报表。
rndc dumpdb 将所有缓存输入文件named_dump.db。

5 、DNS状态检测工具-DNSTOP

在 维护DNS服务器时,网管员希望知道到底是哪些用户在使用DNS服务器,同时也希望能对DNS状态查询做一个统计。通常想到是tcpdump –i eth0 port 53来查看DNS查询包,Tcpdump是一个命令行方式的嗅探器。它可以根据需要显示出经过一个网络接口的所有数据包,供网络管理员对网络进行检测。但 由于采用的是命令行方式,对这些数据包的分析可能会比较困难。这里我们可以使用DNSTOP查询DNS服务器状态:

软件安装:

DNSTOP依赖Tcpdump和pcap库(libpcap)对网络上传输的数据包进行截获和过滤,所以你需要检查系统是否安装相应软件,可以使用命令:结果见图-1。

#rpm –qa|grep Tcpdump; rpm –qa|grep libpcap

 

图-1 运行DNSTOP必需软件和库函数

软件主页:http://dns.measurement-factory.com/tools/dnstop 下载链接:http://dns.measurement-factory.com/tools/dnstop/src/dnstop-20040309.tar.gz

软件安装:

#tar vxfz dnstop-20040309.tar.gz
cd dnstop-20040309
make

运行软件:

如果想查看通过eth0的DNS网络流量可以使用命令

#./dnstop -s eth0
0 new queries, 6 total queries             Mon Jul  6 09:54:35 2004 
Sources              count      % 
---------------- --------- ------ 
192.168.0.117            4   66.7 
192.168.0.143            1   16.7 
192.168.0.42             1   16.7

在运行DNSTOP的过程中,可以敲入如下命令: S,D,T,1,2,ctrl+R,ctrl+X,以交互方式来显示不同的信息。更详细信息可以查看dnstop –help。

总 结:在Linux下新手第一次配置DNS都会错,请留意出错信息。DNS是一个很复杂的系统。用户可能会做错很多事,并且会使系统不能正常运行。伴随 DNS建立出现的许多问题都会引起相同的结果,但起因却不同。但大多数问题是由于配置文件中的语法错误而导致的。关于如何配置DNS笔者不作赘述了,另外 网络上有大量的文档、FAQ和其他的资源。这些大量的文档对于很好的利用DNS的各种功能是非常重要的。这里介绍的工具如:ping、 nslookup、dlint 、rndc、 dnstop都是一些检查工具,如果你希望作为一名合格Unix/Linux的网络管理员就应该从需求方案出发,以客户的需求为导向,配置出我们自己需要 的DNS服务器,这样不但可以满足需要,还能大大减少我们的工作量,以上这些都是你应当掌握的工具,但并不是说你可以忽略对DNS本身的了解。