Pourquoi nslookup n'utilise pas mdns pendant le ping?

9

Dans dnsmasq.conf:

address=/local/127.0.0.1

Dans 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

Je peux utiliser nslookup:

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

Name:   www.local
Address: 127.0.0.1

Mais je ne peux pas utiliser ping:

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

J'utilise tcpdump pour capturer lo pendant le ping sur www.local, pas de paquets, tandis que des paquets comme

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

est apparu à partir de l'interface physique.

Ce qui signifie que ping utilise mdns, mais pourquoi nslookup n'utilise pas mdns? Pourquoi ping n'utilisera pas de DNS normal lorsque mdns ne renvoie pas de valeur utile?

Merci.

dspjm
la source

Réponses:

8

pingutilisez le système de résolution de noms de glibc, appelé Name Service Switch. Cela utilise le /etc/nsswitch.conffichier pour savoir où chercher afin de résoudre un nom en IP. La hosts:ligne de ce fichier représente un ordre de préférence pour chaque service. Par exemple, filesreprésenter le /etc/hostsfichier local , dnsutilise le /etc/resolv.conffichier pour contacter un serveur DNS et mdnsutilise mdns.

Cependant, nslookupne l'utilise pas. Il parle directement au serveur DNS spécifié dans /etc/resolv.confet ne peut donc pas être utilisé mdns.

Mais je ne peux pas répondre à votre dernière question. Si vous avez les deux mdnset dnsen /etc/nsswitch.conf, même avec le mdnspremier, il doit d'abord essayer de résoudre le nom avec mdns, puis si aucune réponse, utilisez dns.

piernov
la source
Merci @priernov, j'ai aussi trouvé la réponse de ma dernière réponse, qui est la ligne "hosts: files mdns4_minimal [NOTFOUND = return] dns myhostname" dans nsswitch.conf, elle sera renvoyée si aucune ip mdns n'a été trouvée.
dspjm
1
En fait, nslookup peut être persuadé de résoudre une adresse .local en spécifiant le serveur 224.0.0.251 et le port 5353: entrez en mode interactif nslookup, lancez 'server 224.0.0.251', 'set port = 5353', puis le nom d'hôte à résoudre, par exemple ' Microknoppix.local '. (testé sur 2 systèmes Debian. Sur Windows 10, nslookup.exe fourni par Microsoft ne fonctionne pas, celui téléchargé depuis isc.org/downloads/bind fonctionne)
NameOfTheRose
Soit dit en passant, utilisez getent hosts foo.localsi vous souhaitez simplement rechercher une adresse IP, qu'il s'agisse de mDNS ou de DNS. Contrairement à nslookupla getentcommande, elle utilise le nsswitch de la bibliothèque GNU C, donc cela fonctionne toujours.
hackerb9
3

C'est très simple - nslookupc'est spécifiquement un outil DNS - cela fait partie des outils BIND.

Il ne connaît tout simplement pas les autres services de noms auxquels les appels de bibliothèque gethostbynamepeuvent accéder via NSS parce qu'ils nslookupn'utilisent pas gethostbyname, etc.

Alnitak
la source