44 votes

Avahi: le ping ne peut pas résoudre le nom d'hôte, mais nslookup peut

ping me dit qu'il ne peut pas résoudre certains noms d'hôte ("ping: unknown host domain.company.local") dans une URL mais lorsque j'utilise host ou nslookup sur le même ordinateur en ligne de commande, la résolution fonctionne bien (c'est-à-dire que c'est rapide et fiable).

Qu'est-ce qui pourrait causer cela ?

Plus de tests : Firefox, wget et ping ont le même problème. Pinger l'adresse IP fonctionne.

Système d'exploitation : Linux (Ubuntu 13.04)

MODIFICATION Mon /etc/resolv.conf indique :

nameserver 127.0.1.1
search domain.company.local

netstat rapporte :

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      -               

donc quelque chose fonctionne sur ce port (nslookup indique également qu'il utilise 127.0.1.1 comme serveur DNS).

Il n'y a pas de /etc/*inetd.conf, donc je ne suis pas sûr de quelle application sert ce port.

Il semble que dnsmasq soit utilisé :

/usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces
   --pid-file=/var/run/NetworkManager/dnsmasq.pid --listen-address=127.0.1.1
   --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec
   --enable-dbus=org.freedesktop.NetworkManager.dnsmasq
   --conf-dir=/etc/NetworkManager/dnsmasq.d

Tous les fichiers de configuration et dossiers sont vides. Comme nslookup dit qu'il utilise 127.0.1.1#53, je suppose que dnsmasq fonctionne même sans configuration. Mais comment sait-il quel DNS parent interroger ?

MODIFICATION2 Désactiver dnsmasq comme le suggère harrymc n'a pas aidé. J'ai donc exécuté strace ping qui m'a donné cette sortie étrange (seulement les parties intéressantes) :

open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 4
read(4, "127.0.0.1\tlocalhost\n#127.0.1.1\ta"..., 4096) = 613
...
open("/lib/libnss_mdns4_minimal.so.2", O_RDONLY|O_CLOEXEC) = 4
read(4, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\f\0\0\0\0\0\0"..., 832) = 832
...
mmap(NULL, 2105560, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x7f7829b00000
...
socket(PF_FILE, SOCK_STREAM, 0)         = 4
fcntl(4, F_GETFD)                       = 0
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
connect(4, {sa_family=AF_FILE, path="/var/run/avahi-daemon/socket"}, 110) = 0
fcntl(4, F_GETFL)                       = 0x2 (flags O_RDWR)
fstat(4, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f782a4f8000
lseek(4, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(4, "RESOLVE-HOSTNAME-IPV4 domain.com"..., 44) = 44
read(4, "-15 Timeout reached\n", 4096)  = 20

Ainsi, ping regarde dans /etc/hosts ce qui est logique. Ensuite, il charge et mmap() /lib/libnss_mdns4_minimal.so.2 ce qui est également logique.

Mais ensuite, il parle à avahi !?

Cela m'a conduit à ce post de forum : ping doesn't make a dns request.

Mon /etc/nsswitch.conf contient également cette ligne :

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

Si je ping une adresse qui fonctionne, je vois que le processus charge également /lib/libnss_mdns4_minimal.so.2 mais ensuite, il effectue une requête DNS via le port 53.

Donc, je suppose maintenant que /lib/libnss_mdns4_minimal.so.2 remarque d'une manière ou d'une autre que l'adresse IP se termine par .local et non par .com et alors le [NOTFOUND=return] est déclenché.

Comment puis-je réparer cela ?

34voto

Aaron Digulla Points 6565

Comme décrit en détail dans cet article de blog, vous devez modifier /etc/avahi/avahi-daemon.conf:

[serveur]
nom-de-domaine=.alocal

Cela lie le démon au domaine .alocal au lieu du .local par défaut.

et redémarrez le démon avec :

sudo service avahi-daemon restart

Note de l'article de blog:

Vous devrez peut-être vider le cache DNS, mDNS et du resolveur, ainsi que redémarrer vos navigateurs Web pour effacer leur cache interne.

Après cela, ping et nslookup ont commencé à être d'accord.

Merci à harrymc de m'avoir mis sur la bonne voie.

11voto

doep Points 219

Modifier /etc/nsswitch.conf et remplacer :

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

par :

hosts:          files dns

a fonctionné pour moi.

7voto

Headcrab Points 101

Chose facile à faire: Éditer /etc/default/avahi-daemon

Changer la ligne:

AVAHI_DAEMON_DETECT_LOCAL=1

à

AVAHI_DAEMON_DETECT_LOCAL=0

Redémarrez le avahi-daemon, ou tuez-le.

Je n'aime pas Avahi, et je n'utilise aucune de ses fonctionnalités. Si vous voulez vraiment désactiver avahi, modifiez /etc/init/avahi-daemon.conf, de manière similaire à ce qui suit:

start on (never 
          and filesystem
      and started dbus)
stop on stopping dbus

6voto

pawelglow Points 163

Il semble que l'adresse .local ne puisse pas être accédée dans Ubuntu.

Une solution consiste à modifier /etc/nsswitch.conf et à changer cette ligne :

hosts:          files mdns4_minimal [NOTFOUND=return] dns

par ceci :

hosts : files dns

2voto

harrymc Points 394411

Si vous ne partagez pas la connexion avec d'autres appareils ou machines virtuelles via votre ordinateur, vous pouvez désactiver dnsmasq dans le Gestionnaire de réseau.

Modifier /etc/NetworkManager/NetworkManager.conf et commenter la ligne (mettre un # devant) :

dns=dnsmasq

Ensuite, exécutez :

sudo restart network-manager

Cela désactivera le résolveur local.

Source : DNS in Ubuntu 12.04.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X