¿Por qué nslookup no usa mdns mientras que ping lo hace?

9

En dnsmasq.conf:

address=/local/127.0.0.1

En 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

Puedo usar nslookup:

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

Name:   www.local
Address: 127.0.0.1

Pero no puedo usar ping:

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

Utilizo tcpdump para capturar lo mientras hago ping a www.local, sin paquetes, mientras que los paquetes 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)

apareció desde la interfaz física.

Lo que significa que ping está usando mdns, pero ¿por qué nslookup no usa mdns? ¿Por qué ping no usará dns normales cuando mdns no devuelve falue útil?

Gracias.

dspjm
fuente

Respuestas:

8

pinguse el sistema de resolución de nombres de glibc, llamado Name Service Switch. Esto utiliza el /etc/nsswitch.confarchivo para saber dónde buscar para resolver un nombre a una IP. La hosts:línea en este archivo representa un orden de preferencia para cada servicio. Por ejemplo, filesrepresenta el /etc/hostsarchivo local , dnsusa el /etc/resolv.confarchivo para contactar a un servidor DNS y mdnsusa mdns.

Sin embargo, nslookupno lo usa. Se comunica directamente con el servidor DNS especificado /etc/resolv.confy, por lo tanto, no se puede usar mdns.

Pero no puedo responder tu última pregunta. Si tiene ambos mdnsy dnsadentro /etc/nsswitch.conf, incluso con mdnsprimero, primero debe intentar resolver el nombre con mdns, luego, si no responde, use dns.

piernov
fuente
Gracias @priernov, también encontré la respuesta de mi última respuesta, que es la línea "hosts: archivos mdns4_minimal [NOTFOUND = return] dns myhostname" en nsswitch.conf, volverá si no se encuentra mdns ip.
dspjm
1
En realidad, se puede persuadir a nslookup para que resuelva una dirección .local especificando el servidor 224.0.0.251 y el puerto 5353: ingrese al modo interactivo nslookup, emita 'server 224.0.0.251', 'set port = 5353' y luego el nombre de host a resolver, por ejemplo ' Microknoppix.local '. (probado en 2 sistemas debian. En Windows 10, nslookup.exe suministrado por Microsoft no funciona, el descargado de isc.org/downloads/bind sí)
NameOfTheRose
Por cierto, úselo getent hosts foo.localsi solo desea buscar una dirección IP independientemente de si es mDNS o DNS. A diferencia nslookup, el getentcomando usa el nsswitch de la Biblioteca GNU C, por lo que siempre funciona.
hackerb9
3

Es muy simple, nslookupes específicamente una herramienta DNS, es parte de las herramientas BIND.

Simplemente no conoce los otros servicios de nombres a los que las llamadas de la biblioteca gethostbynamepueden acceder a través de NSS porque nslookupno usan gethostbyname, etc.

Alnitak
fuente