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

ping me dit qu'il ne peut pas résoudre un nom d'hôte ("ping: unknown host domain.company.local") dans une URL, mais quand j'utilise l' host ou nslookup sur le même ordinateur sur la ligne de commande, les résolutions fonctionnent bien (c.-à-d. Rapide et fiable).

Qu'est-ce qui peut causer cela?

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

OS: Linux (Ubuntu 13.04)

EDIT Mon /etc/resolv.conf lit:

 nameserver 127.0.1.1 search domain.company.local 

netstat rapports:

 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 tant que serveur DNS).

Il n'y a pas de /etc/*inetd.conf , donc je ne sais pas 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 et dossiers de configuration 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 doit interroger?

EDIT2 Désactivant dnsmasq comme suggéré par harrymc n'a pas aidé. Alors j'ai couru strace ping qui m'a donné cette sortie étrange (juste 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 

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

Mais alors, il parle à avahi !?

Ce qui m'a conduit à cette publication du forum: ping ne fait pas une requête dns .

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

 hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 

Si je fais un ping une adresse de travail, je vois que le processus charge également /lib/libnss_mdns4_minimal.so.2 mais alors, il fait une requête DNS via le port 53.

Donc, ma supposition est maintenant que /lib/libnss_mdns4_minimal.so.2 est en quelque sorte remarquant que l'adresse IP se termine par .local et non avec .com et que le [NOTFOUND=return] est déclenché.

Comment puis-je réparer ça?

Comme décrit en détail dans cette publication du blog , vous devez modifier /etc/avahi/avahi-daemon.conf :

 [server] domain-name=.alocal 

Cela lie le démon au domaine .alocal au lieu de .alocal .

Et redémarrez le démon avec:

 sudo service avahi-daemon restart 

Note de la publication du blog:

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

Après cela, ping et nslookup commencé à accepter.

Merci à harrymc de me mettre sur la bonne voie.

Modification de /etc/nsswitch.conf et remplacement:

 hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 

par:

 hosts: files dns 

J'ai travaillé pour moi.

Facile à faire: Éditez /etc/default/avahi-daemon

Changez la ligne:

 AVAHI_DAEMON_DETECT_LOCAL=1 

à

 AVAHI_DAEMON_DETECT_LOCAL=0 

Redémarrez l' avahi-daemon ou tuez-le.

Je n'aime pas Avahi, et je n'utilise aucune de ses fonctionnalités. Si vous souhaitez vraiment désactiver avahi, modifiez /etc/init/avahi-daemon.conf , comme suit:

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

Il semble. L'adresse locale ne peut pas être accessible dans ubuntu.

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

 hosts: files mdns4_minimal [NOTFOUND=return] dns 

par ça :

 hosts: files dns 

Si vous ne faites pas de partage de connexion avec d'autres périphériques ou des machines virtuelles via votre ordinateur, vous pouvez désactiver dnsmasq dans Network Manager.

Modifiez /etc/NetworkManager/NetworkManager.conf et commentez la ligne (mettez un # en face)

 dns=dnsmasq 

Alors fais :

 sudo restart network-manager 

Cela éteindra le résolveur local.

Source: DNS dans Ubuntu 12.04 .

J'ai eu un cas intéressant avec les mêmes symptômes (ping, monture, etc. ne fonctionnant pas, mais hôte, creusage). Vérifiez les autorisations sur le fichier /etc/resolv.conf . Dans mon cas, quelqu'un l'a changé et je n'avais pas le droit de le lire (même si cat /etc/resolv.conf et l'édition du fichier fonctionnaient bien).

Quoi qu'il en soit, strace montrait:

 open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied) 

Et en conséquence, il essayait d'interroger localhost (127.0.0.1) au lieu d'une IP de nameserver à partir du fichier resolv.conf:

 socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4 connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 poll([{fd=4, events=POLLOUT}], 1, 0) = 1 ([{fd=4, revents=POLLOUT}]) 

Et tcpdump n'affiche aucun trafic DNS lors du ping. Tout fonctionne après une correction d'autorisation:

 # chmod 644 /etc/resolv.conf # ls -l /etc/resolv.conf -rw-r--r-- 1 root root 111 Oct 3 09:54 /etc/resolv.conf 

Un autre problème pourrait être des attributs étendus du fichier ou tout autre problème d'accès. Dans ce cas, il suffit de supprimer le fichier /etc/resolv.conf et de le recréer à zéro.

Une autre raison est le format de /etc/hosts . Assurez-vous qu'il n'y ait pas d'espaces entre l'adresse IP et le nom de l'hôte, utilisez un TAB. Après avoir changé pour TAB, le nom d'hôte peut être résolu par ping.

 127.0.0.1 test.local ^^^^^^^^ → Should be a TAB not multiple spaces.