六、掌握DNS故障排除工具使用方法
第一次配置DNS对于Linux新手是一个挑战。DNS是一个很复杂的系统,一不小心就有可能使系统不能正常运行。伴随DNS建立出现的许多问题都会引起相同的结果,但大多数问题是由于配置文件中的语法错误而导致的。DNS是一组文件构成的,所以需要不同的工具检查对应的文件。
1、dlint
除了系统安装产生的工具(nslookup, dig, host, named-checkzone, named-checkconf, rndc)外,这里介绍一个开放源代码的工具:dlint。一个配置不完善的DNS服务器存在很大的安全漏洞。dlint可以帮助分析DNS配置文件中的问题,它是一个专门检查DNS配置文件的开放源代码的软件,要运行它系统须安装Perl语言和dig命令。
#rpm –qa|grep perl
#dig hostname any
Perl 5.8.0
; <<>> DiG 9.2.1 <<>>
;; global options: printcmd
软件下载和安装:
#wget http://www.domtools.com/pub/dlint1.4.0.tar.gz
#gunzip dlint1.4.0.tar.gz
#tar vxf dlint1.4.0.tar;#cd dlint1.4.0
#make install
系统会将dlint安装在/usr/bin/目录下。
dlint首先检查配置文件的拼写错误。
有A(Address)记录的主机名称必须有PTR(也称pointer,中文名称PTR反向解析,负责定义逆向的IP地址到主机名的映射)记录。如果有A记录的主机名称没有PTR记录,那么配置文件不能通过。dlint可以在用户配置文件中为A记录查找丢失的PTR记录。
dlint会记录in-addr.arpa区带的每一条PTR记录是否有对应的A记录存在。
dlint会以递归的方式检查子区带,查找它们的配置问题。dlint软件可以分析任何DNS区带。
dlint软件包的主要脚本是dlint,使用方法是:
#/usr/bin/dlint domain 2、DNS服务器的工作状态检查
1.使用dnstop
在维护DNS服务器时,网管员希望知道哪些用户在使用DNS服务器,同时也希望能对DNS状态做一个统计。这里我们可以使用dnstop查询DNS服务器的工作状态。
软件下载和安装:
#wegt http://www.stearns.org/dnstop/dnstop-20040309-1.i386.rpm
#rpm –ivh dnstop-20040309-1.i386.rpm
运行dnstop软件,如果想查看通过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, 3, ctrl+r, ctrl+x,以交互方式来显示不同的信息。
1:(TLD)记录查询的优异域名。
2:(SLD)记录查询的二级域名。
3:(SLD)记录查询的三级域名。
s:(Source)记录发送DNS查询的客户端的IP地址表。
d:(Destinations)记录DNS查询的目的服务器的IP地址表。
t:(Query Type)记录查询的详细类型。
ctrl+r:重新记录。
ctrl+x:退出。
更详细信息可以查看man dnstop。
2.nslookup
nslookup即域名服务器查找(Name Server Lookup),用来查找DNS服务器上的DNS记录。这个命令可以指定查询的类型,可以查到DNS记录的生存时间,还可以指定使用哪个DNS服务器进行解析。运行nslookup需要安装bind-untils,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)。如果出现错误,该命令将不能启动。
解决方法:增加服务器IP 所在的 reverse zone (如1.2.168.192.in-addr.arpa),确定其中有 server 本身的反解功能。
如果dns没有错误nslookup会输出相关信息:
# nslookup www.it168.com
Server: 202.106.195.68
Address: 202.106.195.68#53
Non-authoritative answer:
www.it168.com canonical name = cache.it168.com.
Name: cache.it168.com
Address: 202.106.124.50
Name: cache.it168.com
Address: 202.106.124.52
包括DNS服务器ip地址和端口。
3.dig
dig工具向DNS服务器发送named查询。dig可以查询单一或多个域名服务器。dig的功能比 nslookup 强大很多,而且使用简单,不像nslookup需要设置set选项。下面是 dig 的一些比较常用的命令:
dig @server tom.com.cn. #dig 最基本的用法
dig @server zx.xmgd.com. AXFR #用 dig 查看 zone 数据传输
dig @server zx.xmgd.com. IXFR=N #用 dig 查看 zone 数据的增量传输
dig -x 210.52.83.228 @server #用 dig 查看反向解析
dig xmgd.com. +nssearch #查找一个域的授权DNS服务器
dig xmgd.com +trace #从根服务器开始追踪一个域名的解析过程
4.named-checkzone
named-checkzone通过检查句法的正确性来检查区带(zone)文件的正确性。named-checkzone如果没有检查到错误,会返回一个简单的“OK”字符。下面是一个例子:
#named-checkzone -q /var/named/localhost.zone
dns_zone_load: couldnot find NS and/or SOA records or bad datted quad
上面信息说明可能是没有定义SOA记录或A记录设定了一个错误IP地址。查看/var/named/localhost. zone文件后发现一行:
1D IN A 127.0.0.l
显然是一个拼写错误,“I”错误拼写为“1”,如果找到错误文件,就可以很快排除故障。
5.named-checkconf
named-checkconf通过检查named.conf句法的正确性来检查named文件的正确性。对于配置正确的named.conf文件,named-checkconf不会显示任何信息。下面是一个检查的例子。
# named-checkconf /etc/named.conf
/etc/named.conf:23: unknown option ''fi1e''
上面信息说明在第23行有一个错误语句,原来是把“file”错误拼写为“fi1e”。找到错误原因,用vi修改配置文件,就可以很快排除故障。
另外,建议不要使用Red Hat Linux提供的一个图形化的配置工具(它可能带来许多严重的问题,因此从RHEL 4开始就取消了这个工具)redhat-config-bind,Linux网络管理员还是应当使用命令行配置DNS服务器管理工作。Linux命令行和redhat-config-bind 相比具有许多优点:
命令行更加灵活,使用命令行通常比使用redhat-config-bind时具有更多选项。
命令行运行更快,不必等待Linux处理图形。
redhat-config-bind工具不能显示所有错误信息,而命令行提供的错误信息都可以在命令行下看到。
redhat-config-bind工具是一个单独软件,也是一个出错源。
6.whois
whois命令会去查找并显示指定帐号的用户相关信息,因为它是到network solutions的whois数据库去查找,所以该帐号名称必须在上面注册方能寻获,且名称没有大小写的差别。图2 是whois命令实例输出,由于whois输出的内容比较多我们主要关注最后的界面:
![]() |
图2 whois命令对it168.com的解析
可以看到whois功能非常强大,除了可以查询DNS服务器的IP地址外还可以查询到其具体物理位置、电话传真。需要说明的是whois对于TLD(记录查询的优异域名)的.com 和.net以及 .edu域名查询比较可靠。为了工具精确查询可以使用下面三个whios服务器:
# whois domain-name@whois.internic.net
# whois domain-name@whois.register.com
# whois domain-name@whois.geektools.com
7. traceroute
traceroute命令用来显示数据包到主机间的路径。traceroute让你追踪网络数据包的路由途径,预设数据包大小是38bytes,用户可另行设置。traceroute 命令实例:
# traceroute www.it168.com -m 4
traceroute: Warning: www.it168.com has multiple addresses; using 202.106.124.50
traceroute to cache.it168.com (202.106.124.50), 8 hops max, 38 byte packets
1 192.168.149.2 (192.168.149.2) 6.591 ms 1.966 ms 1.144 ms
2 * * *
3 * * *
4 * * *
traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其ip地址。traceroute最早是由van jacobson在1988写出的小程序。当时主要是解决他自己碰到的一些网络的问题。
8.host
host命令能够用来查询域名,然而它可以得到更多的信息。host -t mx linux.com可以查询出linux.com的mx记录,以及处理mail的host的名字。host -l linux.com会返回所有注册在linux.com下的域名。host -a linux.com则会显示这个主机的所有域名信息。如果要测试 DNS,可以使用host命令。有以下两种格式:
host standard-address
host IP-address
如果你从一个标准地址入手:
host ucsd.edu
DNS将显示IP地址:
host 128.54.16.1
反之如果你从一个IP地址入手,DNS将显示标准地址。 只有Internet主机才有IP地址(仿真终端是没有的)。因此,可以使用host命令检查计算机是否与Internet直接连接。如使用host能测试出IP地址,说明该计算机是与Internet连接的。 如果指定的地址是未与Internet直接连接的计算机的。将看到:
host not found
9.GUI工具
VisualRoute是一个 Liunx集成化、可视的连接分析软件,它集成了PING、TRACETOUTE 、WHOIS等功能。VisualRoute能直观的回答:“我为什么不能访问到那里?”这样的问题,它能把IP数据包所经历路径显示在世界地图上,它还能分析出网络故障的发生地点,并分析所经历节点采用的WEB SERVER软件,还能报告ICMP和TTL错误。图3是VisualRoute集成的WHOIS工作界面。
![]() |
注意防火墙以及Selinux对DNS服务器的影响
Iptables
如果使用Iptables防火墙注意打开53端口:
# iptables -A FORWARD -i eth0 -p tcp --dport 53 -j ACCEPT
#iptables -A FORWARD -i eth0 -p udp --dport 53 -j ACCEPT
Selinux
增强安全性的Linux(SELinux)是美国安全部的一个研发项目,它的目的在于增强开发代码的Linux内核,以提供更强的保护措施,防止一些关于安全方面的应用程序走弯路,减轻恶意软件带来的灾难。SELinux是一种严格细分程序和文件的访问权限、防止非法访问的OS安全功能。设定了监视并保护容易受到攻击的功能(服务)的策略。具体而言,主要目标是Web服务器httpd、DNS服务器named,以及dhcpd、nscd、ntpd、portmap、snmpd、squid、syslogd。SElinux把所有的拒绝信息输出到:/var/log/messages 位置。如果某个服务比如bind不能正常启动,请查询messages文件来确认是否是SELinux造成服务不能运行。安装配置Bind DNS服务器时候请先关闭Selinux 。
方法1:
使用命令行方式,编辑配置文件修改/etc/sysconfig/selinux文件:
#SELINUX=enforcing
SELINUX=disabled
重新启动配置生效。
方法2:
使用图形界面,选择安全工具设置Selinux 关闭如图4.。
![]() |
指定DNS服务器管理端口
BIND是最著名的DNS服务器之一。由于DNS查询通常由系统自动完成,所以其53端口不方便更改,但可以指定在哪个IP地址进行监听。在配置文件named.conf中有一个全局配置项目options,包含了监听特定网络的命令。例如,如果想让named仅在192.168.0.254地址上提供DNS查询,可以使用以下代码:
options{ ... ...
listen-on {192.168.0.254, 127.0.0.1;};
allow-query{192.168.0/24; 127.0.0/8;};
... ...}
由于DNS服务的特殊性,必须允许本机回路127.0.0.1的连接。
关注DNS服务器日志信息
对于排除Linux的系统故障来说,日志文件是极其重要的工具。DNS日志可以记录服务器CPU的占用时间、查询的统计信息及配置中存在的问题,经常分析日志可以了解服务器的负载、性能、安全性,从而及时地采取措施,纠正错误。BIND软件默认情况下把DNS日志写到/var/log/messages文件中。由于这个文件中的日志信息是由syslog生成的,所以并不全是关于BIND的日志信息,要详细分类地记录DNS服务器的运行状况,我们应修改配置文件named.conf,使用logging命令:
logging{
channel default_log {
file “/var/adm/dns-default.log” versions 3 size 10m;
severity info;
print-severity yes;
print-time yes;
print-category yes;
};
:
:
channel security_log {
file “/var/adm/dns-security.log” versions 3 size 10m;
severity warning;
print-severity yes;
print-time yes;
print-category yes;
};
category default {default_log;};
:
:
category security {security_log;};
};
其中channel定义了通道的名称,按自己需要可以定义多个通道,每个通道指定了存放日志的文件名、文件个数及大小,还定义了要记录消息的等级(如critical, error, warning, notice, info, debug, dynamic),并指定日志内容是否包括时间和消息的类别。Category定义消息的类别(如default, general, client, config, database, dnssec, lame-servers, network, notify, queries, resolver, security, update, xfer-in, xfer-out),并指明这类消息按照哪个通道的定义来进行记录。上例中的第一个channel, default_log是自己定义的channel名称,/var/adm/dns-default.log是日志文件,可依次产生记录该类消息的4个文件(update_log, update_log0, update_log1, update_log2),依次更替,每个文件最大为10M。该日志记录的是除severity信息以外的告警信息。消息记录格式包括时间、消息等级和种类。
总结:
由于DNS服务器负责域名的解析工作,其重要性不言而喻。一旦DNS服务器出现问题或部分数据信息丢失,就无法正常完成域名解析。另外每个互联网服务(FTP、WEB、Email)都需要一个DNS服务请求,大多数Linux和Unix、BSD操作系统运行都是BIND(Berkeley Internet Name Domain)服务器。所以这里介绍如何排除常见的BIND故障。
