Por que o nslookup não usa mdns enquanto o ping faz?

9

No dnsmasq.conf:

address=/local/127.0.0.1

No 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

Eu posso usar o nslookup:

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

Name:   www.local
Address: 127.0.0.1

Mas não posso usar ping:

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

Eu uso o tcpdump para capturar lo durante o ping em www.local, sem pacotes, enquanto pacotes como

# 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)

apareceu da interface física.

O que significa que o ping está usando mdns, mas por que o nslookup não usa mdns? Por que o ping não usa o DNS normal quando o mdns não retorna um valor útil?

Obrigado.

dspjm
fonte

Respostas:

8

pinguse o sistema de resolução de nomes da glibc, chamado Name Service Switch. Isso usa o /etc/nsswitch.confarquivo para saber onde procurar para resolver um nome para um IP. A hosts:linha neste arquivo representa uma ordem de preferência para cada serviço. Por exemplo, filesrepresente o /etc/hostsarquivo local , dnsuse o /etc/resolv.confarquivo para entrar em contato com um servidor DNS e mdnsuse mdns.

No entanto, nslookupnão o usa. Ele fala diretamente com o servidor DNS especificado em /etc/resolv.confe, portanto, não pode ser usado mdns.

Mas não posso responder à sua última pergunta. Se você tem tanto mdnse dnsem /etc/nsswitch.conf, mesmo com mdnsprimeiro, ele deve primeiro tentar resolver o nome com mdns, em seguida, se nenhum uso resposta dns.

piernov
fonte
Obrigado @priernov, também encontrei a resposta da minha última resposta, que é a linha "hosts: arquivos mdns4_minimal [NOTFOUND = return] dns myhostname" no nsswitch.conf, ele retornará se nenhum ip mdns encontrado.
Dspjm 5/03/14
1
Na verdade, o nslookup pode ser persuadido a resolver um endereço local especificando o servidor 224.0.0.251 e a porta 5353: entre no modo interativo nslookup, emita 'server 224.0.0.251', 'set port = 5353' e, em seguida, o nome do host a ser resolvido, por exemplo ' Microknoppix.local '. (. testado em 2 sistemas Debian em Windows 10 nslookup.exe fornecido pela Microsoft não trabalho, o que baixado isc.org/downloads/bind faz)
NameOfTheRose
A propósito, use getent hosts foo.localse você apenas deseja procurar um endereço IP, independentemente de ser mDNS ou DNS. Ao contrário nslookup, o getentcomando usa o nsswitch da GNU C Library, portanto, ele sempre funciona.
precisa saber é o seguinte
3

É muito simples - nslookupé especificamente uma ferramenta DNS - faz parte das ferramentas BIND.

Ele simplesmente não conhece os outros serviços de nomes que as chamadas de biblioteca gethostbynamepodem acessar via NSS porque nslookupnão usam gethostbynameetc.

Alnitak
fonte