为什么 nslookup 不使用 mdns 而 ping 却使用?

为什么 nslookup 不使用 mdns 而 ping 却使用?

在 dnsmasq.conf 中:

address=/local/127.0.0.1

在 resolv.conf 中:

# Generated by NetworkManager
domain example.com
search example.com
nameserver 127.0.0.1
nameserver 10.66.127.17
nameserver 10.68.5.26

我可以使用 nslookup:

# nslookup www.local
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   www.local
Address: 127.0.0.1

但我不能使用 ping:

# ping www.local
ping: unknown host www.local

我使用 tcpdump 在 ping www.local 时捕获 lo,没有数据包,而像

# tcpdump -i em1 -n | grep local

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em1, link-type EN10MB (Ethernet), capture size 65535 bytes
20:14:38.189335 IP 10.66.65.188.mdns > 224.0.0.251.mdns: 0 A (QM)? www.local. (27)
20:14:39.190700 IP 10.66.65.188.mdns > 224.0.0.251.mdns: 0 A (QM)? www.local. (27)
20:14:41.192979 IP 10.66.65.188.mdns > 224.0.0.251.mdns: 0 A (QM)? www.local. (27)

从物理接口出现。

这意味着 ping 正在使用 mdns,但是为什么 nslookup 不使用 mdns?当 mdns 没有返回有用的错误时,为什么 ping 不使用正常的 dns?

谢谢。

答案1

ping使用 glibc 的名称解析系统,称为名称服务切换。它使用该/etc/nsswitch.conf文件来了解要查找的位置,以便将名称解析为 IP。hosts:此文件中的行表示每个服务的优先顺序。例如,files表示本地/etc/hosts文件,dns使用该/etc/resolv.conf文件联系 DNS 服务器,并mdns使用 mdns。

但是,nslookup不使用它。它直接与 中指定的 DNS 服务器对话/etc/resolv.conf,因此无法使用mdns

但我无法回答你的最后一个问题。如果你在 中同时有mdns和,即使先有 ,也应该首先尝试用 解析名称,如果没有答案,则使用。dns/etc/nsswitch.confmdnsmdnsdns

答案2

这很简单nslookup-具体来说DNS 工具 - 它是 BIND 工具的一部分。

它根本不知道库调用的其他名称服务,例如gethostbyname可以通过 NSS 访问,因为nslookup它不使用gethostbyname等等。

相关内容