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

41

pingme dit qu'il ne peut pas résoudre un nom d'hôte ("ping: hôte inconnu: domain.company.local") dans une URL, mais lorsque j'utilise hostou nslookupsur le même ordinateur sur la ligne de commande, les résolutions fonctionnent correctement (c'est-à-dire que c'est rapide et fiable ).

Qu'est-ce qui peut causer cela?

Plus de tests: Firefox, wgetet pingont le même problème. Faire un ping sur l'adresse IP fonctionne.

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

ÉDITER Mes /etc/resolv.conflectures:

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 tourne sur ce port ( nslookupindique également qu'il utilise 127.0.1.1le serveur DNS).

Il n'y en a pas /etc/*inetd.conf, donc je ne sais pas quelle application sert ce port.

Il semble que dnsmasqsoit 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. Depuis nslookupdit, il utilise 127.0.1.1#53mon hypothèse est que cela dnsmasqfonctionne même sans configuration. Mais comment sait-il quel DNS parent interroger?

EDIT2 Désactiver dnsmasqcomme suggéré par harrymc n'a pas aidé. Alors j'ai couru strace pingqui 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

Alors pingregarde dans /etc/hostsce qui a du sens. Ensuite, il charge et mmap()s /lib/libnss_mdns4_minimal.so.2ce qui est logique aussi.

Mais alors il parle à avahi!?

Ce qui m'a amené à ce post sur le forum: ping ne fait pas de demande DNS .

Mon /etc/nsswitch.confcontient également cette ligne:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

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

Donc, je suppose que maintenant, c'est en /lib/libnss_mdns4_minimal.so.2quelque sorte de remarquer que l'adresse IP se termine par .localet non par .com, puis [NOTFOUND=return]est déclenchée.

Comment puis-je réparer ça?

Aaron Digulla
la source
Ce qui est dans votre /etc/resolv.conf?
Joseph R.
Lequel est correct et lequel est incorrect? Si la détermination du nom d'hôte ou devrait - il pas? Vous ne nous avez pas dit lequel de deux problèmes complètement différents vous avez. (Et si cela devait résoudre, expliquez avec autant de détails que possible comment et pourquoi, cela pourrait probablement expliquer pourquoi.)
David Schwartz
... et quels sont vos paramètres de proxy HTTP pour Chrome, Firefox et wget.
JdeBP
@ DavidSchwartz: Je m'attends à ce que la résolution fonctionne. Ce que je ne comprends pas comment nslookupou hostpeut résoudre le nom et toute autre chose sur le système ne peut pas.
Aaron Digulla
1
Si vous ne partagez pas de connexion avec d'autres périphériques ou machines virtuelles via votre ordinateur, vous pouvez désactiver Dnsmasq dans Network Manager. Modifiez /etc/NetworkManager/NetworkManager.confet commentez la dns=dnsmasqligne (mettez un # devant) puis faites un sudo restart network-manager. Cela désactive le résolveur local. ( source )
harrymc

Réponses:

33

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

[server]
domain-name=.alocal

Cela lie le démon au domaine .alocalau lieu de celui par défaut .local.

et redémarrez le démon avec:

sudo service avahi-daemon restart

Note du billet de blog:

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

Après cela, pinget a nslookupcommencé à être d'accord.

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

Aaron Digulla
la source
1
Notez également que pingnss nslookupne sera pas utilisé . (il utilise lwres et, bien, bind, pour parler directement à un résolveur)
Ricky Beam le
Pour moi, il est plus judicieux de le configurer correctement au lieu de le désactiver pour local.
keiki
@ otakun85: Et comment ferais-je cela?
Aaron Digulla
@AaronDigulla Vous l'avez configuré et la réponse la plus votée actuelle l'a désactivé pour local.
keiki
2
Ceci est incroyable. Merci beaucoup. Lutté avec cela pendant des heures avant de trouver ce post.
fpghost le
11

Modifier /etc/nsswitch.conf et remplacer:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

par:

hosts:          files dns

a travaillé pour moi.

doep
la source
2
Cela fonctionne au prix des services AVAHI
Aaron Digulla le
8

Chose facile à faire: Modifier /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-le comme suit:

start on (never 
          and filesystem
      and started dbus)
stop on stopping dbus
Mike Dawg
la source
2
Je me fiche de savoir si vous n'êtes pas censé mettre des "remerciements" ici, je voulais simplement exprimer mes remerciements et combien de temps et d'énergie vous m'avez sauvé. Merci beaucoup! J'utilise un VPN d'entreprise pour effectuer des travaux d'urgence dans un centre commercial et je ne parviens pas à faire fonctionner certains de nos sites malgré tout ce que j'ai pensé essayer. Je n'aurais pas été capable de comprendre cela moi-même, c'est sûr ...
eresonance
7

il semble que l'adresse locale ne soit pas accessible à Ubuntu.

une solution consiste à modifier /etc/nsswitch.confet à modifier cette ligne:

hosts:          files mdns4_minimal [NOTFOUND=return] dns

par ça :

hosts:          files dns
Dragouf
la source
Ce genre de travail pour moi. Dans mon cas, la ligne hosts avait "les fichiers résolus [! UNAVAIL = return] mdns4_minimal [NOTFOUND = return] dns" et changés en "fichiers mdns4_minimal [NOTFOUND = return] dns" fonctionnaient. Merci pour le pointeur dans la bonne direction.
Andorbal
Essayé les autres réponses ci-dessus, avahi handicapé (qui est un soulagement) et avait toujours le problème. Cette réponse l'a résolu pour moi. Merci
Adam Plocher
3

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

Editez /etc/NetworkManager/NetworkManager.confet commentez la ligne (mettez un # devant elle):

dns=dnsmasq

Alors fais :

sudo restart network-manager

Cela désactive le résolveur local.

Source: DNS dans Ubuntu 12.04 .

harrymc
la source
2

Donc, je suppose que /lib/libnss_mdns4_minimal.so.2 est en quelque sorte en train de remarquer que l’adresse IP se termine par .local et non par .com, puis le [NOTFOUND = return] est déclenché.

Comment puis-je réparer ça?

Plutôt bien, mais les autres réponses sont excessives. La solution simple est d’enlever le bit effectivement déclenché, c’est-à-dire de retirer simplement [NOTFOUND=return] .

Si vous le supprimez, cela signifie que si cette valeur est mdns4_minimalrenvoyée NOTFOUND, l’entrée suivante de la liste du résolveur est utilisée. C'est le comportement normal.[NOTFOUND=return]est une optimisation pour échouer plus rapidement sur des noms inconnus mais suppose que tous les .localnoms sont dans mDNS.

MSalters
la source
1

J'ai eu un cas intéressant avec les mêmes symptômes (ping, montage, etc. ne fonctionnant pas, mais hôte, travail de fouille). Vérifier les autorisations sur fichier /etc/resolv.conf . Dans mon cas, quelqu'un l'a changé et je n'avais pas le droit de le lire (bien cat /etc/resolv.confque la modification du fichier a bien fonctionné).

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 adresse IP du serveur de noms à 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’affichait aucun trafic DNS lors du ping. Tout fonctionne après un correctif 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 peut être les attributs étendus du fichier ou tout autre problème d'accès. Dans ce cas, supprimez simplement le fichier /etc/resolv.conf et recréez-le à partir de zéro.

Pik Master
la source
Un autre problème que j'ai eu sur un serveur est que tous les dossiers racine ont perdu leur xdrapeau et que, par conséquent, de nombreux fichiers binaires ne se comportent pas correctement. Le correctif était chmod +x /*.
Silex
0

Une autre raison est le format de /etc/hosts. Assurez-vous qu'il n'y a pas d'espace entre l'IP et le nom d'hôte, utilisez plutôt une tabulation. 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.
Thomas Lauria
la source
ça pourrait être une réponse mais c'est formaté comme commentaire ...
Francisco Tapia
-1

Installez avahi-daemon sur Ubuntu pour pouvoir atteindre le nom ubuntu.locald'hôte à partir du système d'exploitation hôte

sudo apt-get installer avahi-daemon avahi-decouvrir avahi-utils libnss-mdns mdns-scan

João Pedro Rodrigues
la source
Désolé, cette réponse n'est pas liée à la question. Nous ne demandons pas comment installer Avahi. La question est de savoir comment Avahi peut interrompre les recherches DNS après son installation.
Aaron Digulla