dns查询测试工具之nslookup
2010-08-28 17:29:39 阿炯

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

nslookup最简单的用法就是查询域名对应的IP地址,包括A记录和CNAME记录,如果查到的是CNAME记录还会返回别名记录的设置情况。其用法是:

nslookup 域名
以下是A记录的返回情况。
D:\>nslookup www.freeoa.net
*** Can't find server name for address 192.168.0.1: Non-existent domain
*** Default servers are not available
Server:  UnKnown
Address:  192.168.0.1

Non-authoritative answer:
Name:    www.freeoa.net
Address:  222.73.57.77

nslookup命令会采用先反向解释获得使用的DNS服务器的名称,由于我这里使用的是一个内部的DNS服务器所以没有正确的反向记录,导致结果的前面几行出错,大家可以不必理会。重点看的是最后的两行这里看到的是www.freeoa.net的IP地址是222.73.57.77,注意即使 www.freeoa.net的主机没有在线同样能够返回结果。

如果目标域名是一个别名记录(CNAME),nslookup就开始显示出和ping命令不同的地方了,请看查询CNAME记录的结果。由于CNAME和A记录最后都是活的IP地址,所以一般情况下两者是等同看待的,命令的格式相同。

注意:这次nslookup返回了三行信息,前两行显示这是一个CNAME记录,对应的域名和IP地址。最后显示的就是目标域名,并注明Alias(别名)。如果域名不存在会怎样呢?看得懂最后以行的英文吗,不懂没关系记住形状就可以了。如果一个指定类型的域名不存在对应的记录同样也是这种结果。

查询其他类型的域名
前面两个命令我们没有加任何参数,所以默认情况下nslookup查询的是A类型的记录,如果我们配置了其他类型的记录希望看到解释是否正常,这时候 ping就无能为力了。比如我们配置了MX记录,但是邮件服务器只能发信不能收信,到底是域名解释问题还是其他的问题Ping命令的检查只能让你误入歧途。nslookup这时候可以模拟你的其他遇见服务器进行域名解释的情况。我们需要在nslookup上加上适当的参数。指定查询记录类型的指令格式如下:

nslookup -qt=类型 目标域名
注意qt必须小写。
类型可以是一下字符,不区分大小写:
A 地址记录(Ipv4)
AAAA 地址记录(Ipv6)
AFSDB Andrew文件系统数据库服务器记录(不懂)
ATMA ATM地址记录(不是自动提款机)
CNAME 别名记录
HINFO 硬件配置记录,包括CPU、操作系统信息
ISDN 域名对应的ISDN号码
MB 存放指定邮箱的服务器
MG 邮件组记录
MINFO 邮件组和邮箱的信息记录
MR 改名的邮箱记录
MX 邮件服务器记录
NS 名字服务器记录
PTR 反向记录(从IP地址解释域名)
RP 负责人记录
RT 路由穿透记录(不懂)
SRV TCP服务器信息记录(将有大用处)
TXT 域名对应的文本信息
X25 域名对应的X.25地址记录

看看freeoa.net的邮件服务器记录吧。
nslookup -qt=mx freeoa.net

nslookup把服务器的名称和地址都给出来了,注意preference就是前面所说的优先级,该数值越小则优先级越高,一般情况下服务器会同时返回对应的地址,不过也有不返回的情况。

这里希望大家注意一行显示“Non-suthoritativeanswer:”,这一行在前面的例子中都没有显示过。它的出现代表这个结果是从服务器的缓存中得到的,所以提醒这不是一个授权的答案。前面我们进行的几次查询过程中192.168.1.104这台机器就采用了我们第一篇文章中描述的过程查询了freeoa.net的域名,在这个过程中不但缓存了www.freeoa.net、test.freeoa.net以及 freeoa.net的MX记录等最终结果。也包括获取的名字服务器等中间结果,隐含的查询了freeoa.net的NS记录,后面我们还会介绍这个过程。

指定使用的名字服务器
在默认情况下nslookup使用的是我们在本机TCP/IP配置中的DNS服务器进行查询,但有时候我们需要指定一个特定的服务器进行查询试验。这时候我们不需要更改本机的TCP/IP配置,只要在命令后面加上指定的服务器IP或者域名就可以了。这个参数在我们对一台指定服务器排错是非常必要的,另外我们可以通过指定服务器直接查询授权服务器的结果避免其他服务器缓存的结果。命令格式如下:

nslookup [-qt=类型] 目标域名

指定的DNS服务器IP或域名这个命令直接从顶级域名服务器查询freeoa.net的NS记录。所有的二级域名的NS记录都存放在顶级域名服务器中,这是最权威的解释,注意这次没有非授权结果的提示。对于二级域名的NS记录查询来说这肯定是授权结果。顶级域名服务器的名称是a到j.gtld- servers.net共十台服务器。(gtld是Global Top Level Domain的缩写)。当我们修改域名的NS记录的时候可以通过上述查询知道修改的结果是不是已经在顶级域名服务器上生效。不过即使已经生效也可能不能正常解释,注意我在上一篇文章中提到的缓存时间的问题。

那么到底缓存多久呢?

检查域名的缓存时间
检查域名的缓存时间需要我们使用一个新的参数:-d
格式如下:nslookup -d [其他的参数] 目标域名 [指定的服务器地址]

我们忽略其他的看看Got answer后面几行,包括了一个ttl数值。这个数值就是域名记录的生存时间。这种查询将整个DNS数据包的所有部分都揭示出来,大家可以看到DNS实际上并不是想象中那么简单的东西。具体的各部分解释大家可以去看看相关的标准文档,需要提醒大家的是一定要找到ANSWER:的内容,其他的东西都不是描述最终的结果。上面就不止一个地方又TTL数值。

域名解释过程的模拟
我们现在来模拟一下一台DNS服务器接到一个不是自己管理的域的域名解释过程。回忆一下第一篇文章的过程:
首先我们会询问根服务器,然后根服务器会让我们去找对应的顶级服务器。如果查询的是unixaid.net,就会要求我们去找net的服务器。这里我们让 21cn.com的服务器解释www.oicp.net的域名,很显然这台服务器不用有这个域,需要询问根服务器。一般情况下DNS服务器会帮我们完成全部的过程。这种解释方式我们称之为递归解析,为了让大家看到这个过程我家了一个参数让21cn.com的服务器不要这样做。这个参数是 -norecurse。这样理论上21cn.com会让我们去问根服务器,不过由于它已经缓存了顶级服务器的记录,所以直接返回了管理net的顶级服务器记录。实际上大部分的查询都不需要从根服务器开始。大家看到了所有的顶级域名服务器的地址都被返回。

我们随便选择一个在进行查询。这次顶级服务器就返回了oicp.net的服务器地址记录的。然后我们就向这些记录之一进行查询,一定能够得到答案。可能是一个地址、一个CNAME记录或者告诉你不存在。

nslookup的命令就介绍到这里,其实nslookup还有许多其他参数。不过常用的就俄这么几个,另外如果大家不喜欢命令行方式的话,还有几个图形界面的nslookup功能的工具,不过大家还是需要了解域名解释都有些什么才能够正确使用这些工具。

---------------
Nslookup命令详解
Nslookup显示可用来诊断域名系统 (DNS) 基础结构的信息。只有在已安装 TCP/IP 协议的情况下才可以使用 Nslookup 命令行工具。

语法:nslookup [-SubCommand ...] [{ComputerToFind| [-Server]}]

参数
-SubCommand ...
将一个或多个 nslookup 子命令指定为命令行选项。

ComputerToFind
如果未指定其它服务器,就使用当前默认 DNS 名称服务器查阅 ComputerToFind 的信息。要查找不在当前 DNS 域的计算机,请在名称上附加句点。

-Server
指定将该服务器作为 DNS 名称服务器使用。如果省略了 -Server,将使用默认的 DNS 名称服务器。
{help|?}

显示 nslookup 子命令的简短总结。

注释:如果 ComputerToFind 是 IP 地址,并且查询类型为 A 或 PTR 资源记录类型,则返回计算机的名称。如果 ComputerToFind 是一个名称,并且没有跟踪期,则向该名称添加默认 DNS 域名。此行为取决于下面 set 子命令的状态:domain、srchlist、defname 和 search。

如果键入连字符 (-) 代替 ComputerToFind,命令提示符更改为 nslookup 交互式模式,命令行长度必须少于 256 个字符。

Nslookup 有两种模式:交互式和非交互式。
如果仅需要查找一块数据,请使用非交互式模式,对于第一个参数,键入要查找的计算机的名称或 IP 地址。对于第二个参数,键入 DNS 名称服务器的名称或 IP 地址。如果省略第二个参数,nslookup 使用默认 DNS 名称服务器。

如果需要查找多块数据,可以使用交互式模式。为第一个参数键入连字符 (-),为第二个参数键入 DNS 名称服务器的名称或 IP 地址。或者,省略两个参数,则 nslookup 使用默认 DNS 名称服务器。下面是一些有关在交互式模式下工作的提示:
要随时中断交互式命令,请按 CTRL+B。
要退出,请键入 exit。
要将内置命令当作计算机名,请在该命令前面放置转义字符 (\)。
将无法识别的命令解释为计算机名。
如果查找请求失败,nslookup 将打印错误消息,下表列出可能的错误消息。

错误消息 说明
Timed out 重试一定时间和一定次数之后,服务器没有响应请求,可以通过 set timeout 子命令设置超时期,而利用 set retry 子命令设置重试次数。

No response from server 服务器上没有运行 DNS 名称服务器。

No records 尽管计算机名有效,但是 DNS 名称服务器没有计算机当前查询类型的资源记录。查询类型使用 set querytype 命令指定。

Nonexistent domain 计算机或 DNS 域名不存在。
Connection refused
or
Network is unreachable
无法与 DNS 名称服务器或指针服务器建立连接。该错误通常发生在 ls 和 finger 请求中。

Server failure DNS 名称服务器发现在其数据库中内部不一致而无法返回有效应答。

Refused DNS 名称服务器拒绝为请求服务。

Format error DNS 名称服务器发现请求数据包的格式不正确。可能表明 nslookup 中存在错误。

示例:每个命令行选项均由连字符 (-) 后紧跟命令名组成,有时是等号 (=) 后跟一个数值。例如,要将默认的查询类型更改为主机(计算机)信息,并将初始超时更改为 10 秒,请键入:
nslookup -querytype=hinfo -timeout=10

概要:Nslookup.exe 是命令行管理工具,用于测试或解决 DNS 服务器问题,此工具是通过“控制面板”与 TCP/IP 协议一起安装的,本文包含使用 Nslookup.exe 的若干提示。

更多信息:要使用 Nslookup.exe,请注意以下方面: • TCP/IP 协议必须安装在运行 Nslookup.exe 的计算机上。

• 在 Microsoft TCP/IP 属性页的 DNS 选项卡的“DNS 服务搜索顺序”字段中必须至少指定一个 DNS 服务器。

• Nslookup 一直从当前上下文中的名称中抽去后缀。如果无法进行完全合格的名称查询(即,使用尾随点),那么查询将被附加到当前上下文中。例如,当前 DNS 设置是 att.com,并且在 www.microsoft.com 中执行查询,那么第一个查询将作为 www.microsoft.com.att.com 而失败,因为查询是不合格的。这种方式与其他供应商的 Nslookup 方式可能不一致,本文的目的在于阐明 Microsoft Windows NT Nslookup.exe 的处理方式。

• 如果已经使用 Microsoft TCP/IP 属性页 DNS 选项卡上定义的“域后缀搜索顺序 ”(Domain Suffix Search Order )中的搜索列表,将不会发生抽取操作。查询将被附加到列表中指定的域后缀中。要避免使用搜索列表,请始终使用“完全合格的域名称”(即,在名称中添加尾随点)。

Nslookup.exe 可以在两种模式下运行:交互式和非交互式。当需要返回单块数据时,请使用非交互式模式。非交互模式的语法如下:
nslookup [-option] [hostname] [server]
要在交互模式下启动 Nslookup.exe,只需在命令提示符下输入 nslookup:
C:\> nslookup
Default Server: nameserver1.domain.com
Address: 10.0.0.1
>

在命令提示符下输入 help 或 ? 将生成可用的命令列表。在命令提示符下输入的任何内容,如果它不是有效命令,则假设它是主机名,尝试使用默认服务器来解析它。要中断交互命令,请按 CTRL+C。要退出交互模式并返回到命令提示符下,并在命令提示符下输入 exit。以下是帮助输出,其中包含选项的完整列表:
Commands: (identifiers are shown in uppercase, [] means optional)
NAME - print info about the host/domain NAME using default
server
NAME1 NAME2 - as above, but use NAME2 as server
help or ? - print info on common commands

set OPTION - set an option
all - print options, current server and host
[no]debug - print debugging information
[no]d2 - print exhaustive debugging information
[no]defname - append domain name to each query
[no]recurse - ask for recursive answer to query
[no]search - use domain search list
[no]vc - always use a virtual circuit
domain=NAME - set default domain name to NAME
srchlist=N1[/N2/.../N6] - set domain to N1 and search list to N1, N2,
and so on
root=NAME - set root server to NAME
retry=X - set number of retries to X
timeout=X - set initial time-out interval to X seconds
type=X - set query type (for example, A, ANY, CNAME, MX,
NS, PTR, SOA, SRV)
querytype=X - same as type
class=X - set query class (for example, IN (Internet), ANY)
[no]msxfr - use MS fast zone transfer
ixfrver=X - current version to use in IXFR transfer request

server NAME - set default server to NAME, using current default server
lserver NAME - set default server to NAME, using initial server
finger [USER] - finger the optional NAME at the current default host
root - set current default server to the root

ls [opt] DOMAIN [> FILE] - list addresses in DOMAIN (optional: output to
FILE)
-a - list canonical names and aliases
-d - list all records
-t TYPE - list records of the given type (for example, A, CNAME,
MX, NS, PTR, and so on)

view FILE - sort an 'ls' output file and view it with pg
exit - exit the program


> help
命令:   (标识符以大写表示,[] 表示可选)
NAME            - 打印有关使用默认服务器的主机/域 NAME 的信息
NAME1 NAME2     - 同上,但将 NAME2 用作服务器
help or ?       - 打印有关常用命令的信息
set OPTION      - 设置选项
    all                 - 打印选项、当前服务器和主机
    [no]debug           - 打印调试信息
    [no]d2              - 打印详细的调试信息
    [no]defname         - 将域名附加到每个查询
    [no]recurse         - 询问查询的递归应答
    [no]search          - 使用域搜索列表
    [no]vc              - 始终使用虚拟电路
    domain=NAME         - 将默认域名设置为 NAME
    srchlist=N1[/N2/.../N6] - 将域设置为 N1,并将搜索列表设置为 N1、N2 等
    root=NAME           - 将根服务器设置为 NAME
    retry=X             - 将重试次数设置为 X
    timeout=X           - 将初始超时间隔设置为 X 秒
    type=X              - 设置查询类型(如 A、AAAA、A+AAAA、ANY、CNAME、MX、NS、PTR、SOA 和 SRV)
    querytype=X         - 与类型相同
    class="X"             - 设置查询类(如 IN (Internet)和 ANY)
    [no]msxfr           - 使用 MS 快速区域传送
    ixfrver=X           - 用于 IXFR 传送请求的当前版本
server NAME     - 将默认服务器设置为 NAME,使用当前默认服务器
lserver NAME    - 将默认服务器设置为 NAME,使用初始服务器
root            - 将当前默认服务器设置为根服务器
ls [opt] DOMAIN [> FILE] - 列出 DOMAIN 中的地址(可选: 输出到文件 FILE)
    -a          -  列出规范名称和别名
    -d          -  列出所有记录
    -t TYPE     -  列出给定 RFC 记录类型(例如 A、CNAME、MX、NS 和 PTR 等)的记录
view FILE           - 对 'ls' 输出文件排序,并使用 pg 查看
exit            - 退出程序


---------------
查找dns的各类数据
通过在命令提示符下运行 set 命令,可以在 Nslookup.exe 中设置许多不同的选项。要得到这些选项的完整列表,只需输入 set all。请参见以上内容,在 set 命令下,得到可用选项的打印输出。

查找不同的数据类型
要在域名空间中查找不同的数据类型,请在命令提示符下使用 set type 或 set q[uerytype] 命令。例如,要查询邮件交换器数据,请输入:
C:\> nslookup
Default Server: ns1.domain.com
Address: 10.0.0.1
> set q=mx
> mailhost
Server: ns1.domain.com
Address: 10.0.0.1
mailhost.domain.com MX preference = 0, mail exchanger =
mailhost.domain.com
mailhost.domain.com internet address = 10.0.0.5
>
第一次查询是查找远程名称,答案是权威的,但随后的查询是非权威的。第一次查询远程主机时,本地 DNS 服务器与作为该域权威的 DNS 服务器取得联系。然后本地 DNS服务器缓存该信息,以便从本地服务器缓存中非权威地回答随后的查询。

如果想查询域名较全的信息,可以使用 'set q=any'来实现。

直接从另一个名称服务器中进行查询
要直接查询另一个名称服务器,请使用 server 或 lserver 命令切换到该名称服务器。lserver 命令使用本地服务器得到要切换的服务器地址,而 server 命令使用当前默认服务器得到该地址。
例如:
C:\> nslookup
Default Server: nameserver1.domain.com
Address: 10.0.0.1
> server 10.0.0.2
Default Server: nameserver2.domain.com
Address: 10.0.0.2
>

使用 Nslookup.exe 转移整个区域
使用 ls 命令,Nslookup 可以用于转移整个区域。查看远程域中的所有主机,这是有用的。ls 命令的语法如下:
ls [- a | d | t type] domain [> filename]
不带参数使用 ls 命令将返回所有地址和名称服务器数据的列表。-a 参数将返回别名和正式名称,-d 将返回所有数据,而 -t 将按类型进行筛选。
例如:
>ls domain.com
[nameserver1.domain.com]
nameserver1.domain.com. NS server = ns1.domain.com
nameserver2.domain.com NS server = ns2.domain.com
nameserver1 A 10.0.0.1
nameserver2 A 10.0.0.2
>
在 DNS 服务器中可以按块转移区域,以便只有授权的地址和网络才可以执行此操作。如果设置了区域安全,将返回以下错误消息:
*** Can't list domain example.com .: Query refused

---------------
nslookup.exe 的疑难解答
默认服务器超时
当启动 Nslookup.exe 工具时,以下错误可能出现:
*** Can't find server name for address w.x.y.z : Timed out
备注: w.x.y.z 是在“DNS 服务搜索顺序”列表中列出的第一个 DNS 服务器。
*** Can't find server name for address 127.0.0.1: Timed out

第一个错误指出不能连接 DNS 服务器,或者该计算机上的服务没有运行。要解决此问题,启动该服务器上的 DNS 服务,或检查可能存在的连接问题。

第二个错误指出在“DNS 服务搜索顺序”列表中还没有定义服务器。要解决此问题,请将有效 DNS 服务器的 IP 地址添加到此列表中。

启动 Nslookup.exe 时找不到服务器名
启动 Nslookup.exe 工具时,可能出现以下错误:
*** Can't find server name for address w.x.y.z: Non-existent domain
当没有名称服务器 IP 地址的 PTR 记录时,会出现此错误。当 Nslookup.exe 启动时,它执行反向搜索,以得到默认服务器的名称。如果没有 PTR 数据,则返回此错误消息。要解决此问题,请确保反向搜索区域存在,并包含名称服务器的 PTR 记录。

Nslookup 在子域上无法执行
当在子域上执行查询或进行区域转移时,Nslookup 可能返回以下错误:
*** ns.domain.com can't find child.domain.com.: Non-existent domain
*** Can't list domain child.domain.com.: Non-existent domain
在 DNS Manager 中,可以在主区域下添加一个新域,这样就创建了一个子域。用这种方法创建子域并不为该域创建一个单独的 db 文件,这样在该域进行查询或在该域进行区域转移时将会产生以上错误。在父域上进行区域转移时将同时列出父域数据和子域数据。要解决此问题,请在 DNS 服务器上为该子域创建一个新主域。

Nslookup 是一个监测网络中DNS服务器是否能正确实现域名解析的命令行工具。它在 Windows NT/2000/XP 中均可使用,但在Windows 98中却没有集成这一个工具。Nslookup 必须要安装了TCP/IP 协议的网络环境之后才能使用。

现在网络中已经架设好了一台 DNS 服务器,主机名称为 pridns ,它可以把域名 www.freeoa.net 解析为 192.168.0.1 的IP地址,这是我们平时用得比较多的正向解析功能。检测步骤如下:
在 Windows 2000 中单击“开始”->“程序”->“附件”->“命令提示符”,在 C:\> 的后面键入 Nslookup www.freeoa.net ,“回车”之后即可看到如下结果:
Server: pridns
Address: 192.168.0.5
Name: www.freeoa.net
Address: 192.168.0.1

以上结果显示,正在工作的 DNS 服务器的主机名为 pridns ,它的 IP 地址是192.168.0.5 ,而域名www.freeoa.net 所对应的 IP 地址为 192.168.0.1 。那么,在检测到 DNS 服务器 pridns 已经能顺利实现正向解析的情况下,它的反向解析是否正常呢? 也就是说,能否把IP地址192.168.0.1反向解析为域名www.freeoa.net ?我们在命令提示符C:\>的后面键入 Nslookup 192.168.0.1 ,得到结果如下:
Server: pridns
Address: 192.168.0.5
Name: www.freeoa.net
Address: 192.168.0.1
这说明,DNS 服务器 pridns 的反向解析功能也正常。

然而,有的时候,我们键入Nslookup www.freeoa.net ,却出现如下结果:
Server: pridns
Address: 192.168.0.5
*** pridns can't find www.freeoa.net: Non-existent domain

这种情况说明网络中DNS服务器 pridns 在工作,却不能实现域名 www.freeoa.net的正确解析。此时,要分析DNS服务器的配置情况,看是否 www.freeoa.net 这一条域名对应的 IP 地址记录已经添加到了DNS的数据库中。

还有的时候,我们键入Nslookup www.freeoa.net ,会出现如下结果:
*** Can't find server name for domain: No response from server
*** Can't find www.freeoa.net : Non-existent domain

这时,说明测试主机在目前的网络中,根本没有找到可以使用的 DNS 服务器。此时,我们要对整个网络的连通性作全面的检测,并检查DNS服务器是否处于正常工作状态,采用逐步排错的方法,找出 DNS 服务不能启动的根源。

nslookup 提示Default Server: UnKnown

D:\>nslookup
*** Can't find server name for address 192.168.18.100: Non-existent domain
*** Default servers are not available
Default Server:  UnKnown
Address:  192.168.18.100

此问题是没有设置反向解析所导致,我们需要在反向解析中添加一条反向解析的记录。

100 IN PTR pridns.freeoa.net.
 
保存退出并重置服务。
rndc reload

D:\>nslookup
Default Server:  pridns.freeoa.net
Address:  192.168.18.100


该文章最后由 阿炯 于 2019-10-20 21:12:18 更新,目前是第 2 版。