查询特定名称服务器时,“dig”和“host”有什么区别?

我使用这个命令来验证是否与 DNS 供应商正确设置了一切:

host hostname.example.com ns1.example-nameserver.com
据我所知,这个问题要求 ns1.example-nameserver.com 查找 hostname.example.com 并报告答案。我一开始得到了一个主机未找到的响应,所以我以为自己做错了。然而,如果不指定他们的名称服务器(从而允许我的ISP的名称服务器查找),我得到了正确的响应(如果有关系,hostname 是一个 CNAME)。我无法理解这一点,所以我四处搜索并找到了 dig 命令:
dig @ns1.example-nameserver.com hostname.example.com
据我所知,这个功能与host命令相同 - 请求特定的名称服务器查找主机。因此,我得出结论,它们必须以某种不同的方式进行操作,并且缓存名称服务器必须使用与dig相同的方法。 我的结论要么正确要么错误,如果是正确的: 这两种查找方法有什么区别? 如果是错误的: 关于DNS和hostdig命令,导致我得出这个结论的误解是什么? 示例输出:
$ host cardiff.tzmchapters.org ns1.livedns.co.uk
Using domain server:
Name: ns1.livedns.co.uk
Address: 213.171.192.250#53
Aliases: 

Host cardiff.tzmchapters.org not found: 3(NXDOMAIN)

$ dig @ns1.livedns.co.uk cardiff.tzmchapters.org

; <<>> DiG 9.8.3-P1 <<>> @ns1.livedns.co.uk cardiff.tzmchapters.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 23620
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;cardiff.tzmchapters.org.   IN  A

;; ANSWER SECTION:
cardiff.tzmchapters.org. 3600   IN  CNAME   ghs.google.com.

;; AUTHORITY SECTION:
google.com.     3600    IN  SOA ns1.livedns.co.uk. admin.google.com. 1354213742 10800 3600 604800 3600

;; Query time: 27 msec
;; SERVER: 213.171.192.250#53(213.171.192.250)
;; WHEN: Mon Apr 22 23:47:05 2013
;; MSG SIZE  rcvd: 128

这种情况下,两个命令应该以相同的方式工作。你能展示每个命令的完整输出吗? - Renan
请注意dighost都报告了NXDOMAIN。使用dig,你可以在头部看到它(输出的第5行非空行),而使用host则更明显。NXDOMAIN表示该域名不存在。然而,在回答部分却返回了一个CNAME!我相信这是DNS服务器中的一个错误! - Celada
那么,在这种情况下,dighost是否都发送完全相同的查询数据包,获得完全相同的响应数据包(除了时间戳之外),但是解释方式不同?当host看到NXDOMAIN时,是否会立即退出? - jhabbott
就我个人而言,在一个特定的子域名上,我遇到了完全相反的问题。在这个特定的子域名上使用host命令可以显示预期的记录,表明这个特定的子域名解析到了一个预期的规范主机名。然而,当在这个特定的子域名上使用dig命令时,我收到的回应是该记录不存在。此外,使用浏览器访问这个子域名也不起作用。我已经尝试了多次,检查拼写错误等等。很明显,这些命令的工作方式并不相同。 - user12345
3个回答

hostdignslookup在大部分功能上是相同的。就你所问的情况(向特定的域名服务器询问特定的DNS问题),dighost(以及nslookup)的行为完全一样。 对于DNS故障排除,首选dig,因为它的输出格式更加“原始”:在其输出中直接显示DNS响应中的所有4个字段的内容:问题、答案、授权和附加部分(以及标头中的标志),而且它还有更多的选项。另一方面,host具有更加用户友好的输出格式。 如果你恰好不需要其中一个命令拥有而其他命令没有的选项,或者其中一个命令输出而其他命令没有的信息,那么就取决于个人偏好了。

2如果他们在网络端执行相同的操作(实际查询),那么当使用host时为什么会出现“找不到主机”的错误,而使用dig时却能得到正确的答案呢?即使服务器通过特定设置(无论是故意还是意外)导致了这种情况,它也必须能够区分请求。 - jhabbott
不对!你在问题中给出的两个命令是等价的,它们应该得到相同的答案!你确定dig给出的是一个实际的答案而不是附加部分或授权部分的记录吗?正如Renan所建议的那样,展示输出可能会有所帮助。 - Celada
好的,我添加了一些示例输出。在家和工作时,我得到相同的结果。当我不指定要使用的名称服务器并且我的ISP处理查询时,“host”正常工作。请自己尝试并告诉我结果。 - jhabbott
只是在回顾这个问题 - 最终ISP告诉我,他们的服务器配置为不响应直接客户端查询,只响应其他请求信息转移的域名服务器 - dig命令是否以类似域名服务器的方式进行查询? - jhabbott
1Dig可以处理常规问题(除了AXFR类型的问题)和区域传输(AXFR类型的问题),但DNS运营商通常会限制区域传输只允许授权的从服务器,所以你最好使用常规问题。 - Celada
给非DNS管理员的FYI:dig的输出是基于区域文件格式;表示注释,记录列包括名称TTL记录类记录类型记录数据BINDdig的一部分,它在其他地方记录了区域文件,并且在dig手册页面中省略了这些信息。 - duozmo
我使用 host 获取到更多信息,例如无法通过 dig -6 获取的 IPv6 记录:dig @4.2.2.2 ehow.com; host -v ehow.com 4.2.2.2 - Pablo A
@PabloA:host 默认会查找 A、AAAA 和 MX 记录;请参考 man 手册中的 -t 选项。dig 默认只查找 A 记录;由于此主机还有 MX 记录,可以使用 dig @4.2.2.2 ehow.com MX 来查看它们。目前它没有 AAAA 记录,但如果有的话,可以使用 dig @4.2.2.2 ehow.com AAAA - dave_thompson_085

如果您使用非FQDN主机名,结果可能会有所不同,因为“host”将使用“resolv.conf”中的搜索域,而“dig”默认情况下不会使用。 如果您希望“dig”使用“resolv.conf”(或将其添加到“~/.digrc”),您必须使用“+search”选项。 例如:
$ host foo
foo.myfqdn.com has address 10.1.2.3

$ dig +short foo
# (no result)

$ dig +short +search foo
10.1.2.3

nslookup命令被包含在Windows和BusyBox中,后者用于嵌入式设备,如路由器或电视盒子。这使得它更适合跨平台脚本编写。请参阅https://en.wikipedia.org/wiki/Nslookup。 以下是一些输出示例供比较:
$ nslookup example.com
Server:     127.0.0.53
Address:    127.0.0.53#53

Non-authoritative answer:
Name:   example.com
Address: 93.184.216.34
Name:   example.com
Address: 2606:2800:220:1:248:1893:25c8:1946
dig以BIND区域格式提供了许多详细信息的响应。
$ dig example.com

; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41996
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;example.com.           IN  A

;; ANSWER SECTION:
example.com.        7147    IN  A   93.184.216.34

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Wed Dec 28 23:44:07 EET 2022
;; MSG SIZE  rcvd: 56
主机命令试图给出一个解释:
$ host example.com 
example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
example.com mail is handled by 0 .