avahi: o ping não pode resolver o nome do host, mas o nslookup pode

39

ping me diz que não é possível resolver alguns nomes de host ("ping: host desconhecido domain.company.local") em uma URL, mas quando eu uso host ou nslookup no mesmo computador no comando linha, as resoluções funciona bem (ou seja, é rápido e confiável).

O que poderia estar causando isso?

Mais testes: o Firefox, wget e ping têm o mesmo problema. Ping no endereço IP funciona.

OS: Linux (Ubuntu 13.04)

EDITAR Meu /etc/resolv.conf diz:

nameserver 127.0.1.1
search domain.company.local

netstat relatórios:

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      -               

então algo está sendo executado nessa porta ( nslookup também informa que usa 127.0.1.1 como servidor DNS).

Não há /etc/*inetd.conf , por isso não tenho certeza de qual aplicativo atende a essa porta.

Parece que dnsmasq é usado:

/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

Todos os arquivos e pastas de configuração estão vazios. Como nslookup diz que usa 127.0.1.1#53 , meu palpite é que dnsmasq funciona mesmo sem uma configuração. Mas como ele sabe qual DNS pai deseja consultar?

EDIT2 Desativar dnsmasq como sugerido por harrymc não ajudou. Então eu corri strace ping que me deu essa saída estranha (apenas as partes interessantes):

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, "7ELF
hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
nameserver 127.0.1.1
search domain.company.local
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      -               
/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
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, "7ELF
hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%%pre%\f%pre%%pre%%pre%%pre%%pre%%pre%"..., 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
%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%%pre%\f%pre%%pre%%pre%%pre%%pre%%pre%"..., 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

Portanto, ping procura /etc/hosts , o que faz sentido. Em seguida, ele carrega e mmap() s /lib/libnss_mdns4_minimal.so.2 , o que também faz sentido.

Mas então fala com avahi !?

O que me levou a este post no fórum: ping não faz um pedido de DNS .

Meu /etc/nsswitch.conf também contém esta linha:

%pre%

Se eu ping um endereço de trabalho, vejo que o processo também carrega /lib/libnss_mdns4_minimal.so.2 , mas, em seguida, ele faz uma consulta DNS pela porta 53.

Então, meu palpite é de que /lib/libnss_mdns4_minimal.so.2 está de alguma forma percebendo que o endereço IP termina com .local e não com .com e, em seguida, o [NOTFOUND=return] é acionado.

Como corrijo isso?

    
por Aaron Digulla 21.01.2014 / 12:14

9 respostas

32

Conforme descrito em detalhes em esta postagem do blog , você precisa editar /etc/avahi/avahi-daemon.conf :

[server]
domain-name=.alocal

Isso vincula o daemon ao domínio .alocal em vez do padrão .local .

e reinicie o daemon com:

sudo service avahi-daemon restart

Nota da postagem do blog:

You may need to flush the DNS,mDNS and resolver cache, as well as restart your web browsers to clear their internal cache.

Depois disso, ping e nslookup começaram a concordar.

Obrigado ao harrymc por me colocar no caminho certo.

    
por 24.01.2014 / 12:28
11

Modificando o /etc/nsswitch.conf e substituindo:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

por:

hosts:          files dns

funcionou para mim.

    
por 08.04.2015 / 09:35
8

Coisa fácil de fazer: Editar /etc/default/avahi-daemon

Altere a linha:

AVAHI_DAEMON_DETECT_LOCAL=1

para

AVAHI_DAEMON_DETECT_LOCAL=0

Reinicie o avahi-daemon ou mate-o.

Eu não gosto do Avahi e não uso nenhum de seus recursos. Se você quiser realmente desabilitar o avahi, modifique /etc/init/avahi-daemon.conf , semelhante ao seguinte:

start on (never 
          and filesystem
      and started dbus)
stop on stopping dbus
    
por 25.01.2014 / 01:06
7

parece que o endereço local não pode ser acessado no Ubuntu.

uma solução é editar /etc/nsswitch.conf e alterar essa linha:

hosts:          files mdns4_minimal [NOTFOUND=return] dns

por isso:

hosts:          files dns
    
por 22.07.2015 / 05:09
3

Se você não estiver fazendo o compartilhamento de conexão com outros dispositivos ou VMs através do seu computador, você pode desativar o dnsmasq no Network Manager.

Edite /etc/NetworkManager/NetworkManager.conf e comente a linha (coloque # na frente dele):

dns=dnsmasq

Então faça:

sudo restart network-manager

Isso desativará o resolvedor local.

Fonte: DNS no Ubuntu 12.04 .

    
por 29.01.2014 / 19:35
1

Eu tive um caso interessante com os mesmos sintomas (ping, montagem etc. não funcionando, mas host, cavando trabalhando). Verifique as permissões no arquivo /etc/resolv.conf . No meu caso, alguém o alterou e eu não tive permissão para lê-lo (apesar de cat /etc/resolv.conf e edição do arquivo funcionarem bem).

De qualquer forma, a strace estava mostrando:

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

E como resultado, ele estava tentando consultar o host local (127.0.0.1) em vez de um IP do servidor de nomes do arquivo 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}])

E o tcpdump não estava exibindo nenhum tráfego DNS durante o ping. Tudo está funcionando após uma correção de permissão:

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

Outro problema pode ser atributos estendidos do arquivo ou qualquer outro problema de acesso. Nesse caso, basta deletar o arquivo /etc/resolv.conf e recriá-lo do zero.

    
por 03.10.2016 / 11:10
1

So my guess is now that /lib/libnss_mdns4_minimal.so.2 is somehow noticing that the IP address ends with .local and not with .com and then the [NOTFOUND=return] is triggered.

How do I fix this?

Muito bom palpite, mas as outras respostas são exageradas. A solução simples é remover o bit que é realmente acionado, ou seja, remover apenas [NOTFOUND=return] .

A remoção significa que se mdns4_minimal retornar NOTFOUND , a próxima entrada na lista de resolução será usada. Esse é o comportamento normal; [NOTFOUND=return] é uma otimização para falhar mais rapidamente em nomes desconhecidos, mas assume que todos os nomes .local estão no mDNS.

    
por 07.11.2017 / 14:30
0

Outro motivo é o formato de /etc/hosts . Certifique-se de que não haja espaços entre o IP e o nome do host, em vez disso, use um TAB. Depois de mudar para o TAB, o nome do host pode ser resolvido por ping.

127.0.0.1        test.local
         ^^^^^^^^ → Should be a TAB not multiple spaces.
    
por 09.07.2015 / 14:16
-1

Configure o avahi-daemon no Ubuntu para que você possa acessar o hostname ubuntu.local do sistema operacional host

sudo apt-get instala o avahi-daemon avahi-discover avahi-utils libnss-mdns mdns-scan

    
por 18.04.2019 / 20:09

Tags