host é capaz de resolver um hostname, ssh não é

12

Estou tentando conectar de um sistema 10.04 a um sistema 12.04 via SSH. Estranhamente, as regras em resolv.conf parecem ter efeito apenas seletivamente, o que me deixa perplexo. Observe:

[2] user@mach:~$ ssh pangolin
ssh: Could not resolve hostname pangolin: Name or service not known
[2] user@mach:~$ host pangolin
pangolin.subdomain.domain.tld has address 172.16.7.12

subdomain.domain.tld está na linha search em /etc/resolv.conf e, usando host , o nome é pesquisado adequadamente de acordo com essas regras. No entanto, com o cliente SSH ssh recebo o erro reproduzido acima. Como isso pode ser? Sempre tive a impressão de que as regras de resolução de nomes em resolv.conf se aplicam ao sistema global.

Nota: /etc/hosts não declara o nome pangolin . O pacote openssh-server está configurado na máquina de destino. A questão é puramente sobre por que a resolução de nomes não é consistente entre esses dois programas.

Outra observação: o comando funciona bem quando eu insiro o nome de domínio totalmente qualificado, por exemplo, pangolin.subdomain.domain.tld .

Enquanto isso, reiniciei a máquina cliente (10.04) e o problema ainda existe. Um daemon de armazenamento em cache do DNS não está instalado, então eu acho que isso não deveria ter sido um problema de qualquer maneira.

As informações solicitadas no comentário:

$ grep host /etc/nsswitch.conf
hosts:          files dns

/etc/resolv.conf , eu transformei os nomes de domínio de forma consistente:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 172.16.1.1
nameserver 172.16.1.5
search subdomain.domain1.com domain1.com domain2 domain3.com domain2.ccTLD domain3.net dev.domain1.com sdk.dev.domain1.com

... e o total /etc/nsswitch.conf :

$ cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the 'glibc-doc-reference' and 'info' packages installed, try:
# 'info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

... e /etc/network/interfaces , que é a fonte para resolv.conf em 12.04:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 172.16.1.234
        netmask 255.255.0.0
        gateway 172.16.255.254
        dns-nameservers 172.16.1.1 172.16.1.5
        dns-search domain1.com. domain2. domain3.com. domain2.ccTLD. domain3.net. dev.domain1.com. sdk.dev.domain1.com. subdomain.domain1.com.
        dns-domain subdomain.domain1.com.

Nota: a transformação dos nomes de domínio foi feita com sed , por isso é consistente entre os vários arquivos reproduzidos.

Não há ~/.ssh/config , mas aqui está o global ( /etc/ssh/ssh_config ), reduzido por questão de brevidade:

$ grep -v '^#' /etc/ssh/ssh_config |grep -v '^[[:space:]]*$'
Host *
    SendEnv LANG LC_*
    HashKnownHosts yes
    GSSAPIAuthentication yes
    GSSAPIDelegateCredentials no
$ mtr pangolin
Name or service not known: Success
    
por 0xC0000022L 11.06.2012 / 20:31

6 respostas

11

Considerando que ssh e outros programas como ping usam o resolvedor glibc para procurar o nome do host ('pangolin' neste caso), host procura o nome diretamente no DNS, ignorando o resolvedor glibc. Essa é a diferença.

No entanto, como o resolvedor glibc está configurado em sua máquina para tentar dns após files , não consigo explicar porque o resolvedor falha onde host é bem-sucedido.

Eu já vi esse comportamento relatado antes, quando o dnsmasq era usado como um servidor de nomes de encaminhamento local (https://bugs.launchpad.net/ubuntu/+source/dnsmasq/+bug/998712), mas você não está usando servidor de nomes local; mas talvez o problema lá e aqui não estivesse no dnsmasq mas no resolvedor glibc.

    
por jdthood 29.10.2012 / 14:19
9

Seu ssh pode tentar resolver o IP6 e expirar fazendo isso. Se você não estiver usando o IP6, tente desativar o IP6 em /etc/ssh/ssh_config alterando AddressFamily de any para inet .

    
por Arnaud Kleinveld 14.04.2013 / 16:20
3

Eu me deparei com isso algumas vezes, e isso sempre me impressiona até que eu me lembro da restrição de seis domínios na lista de busca no resolv.conf.

    
por golights 11.11.2013 / 18:28
3

Eu sei que esta é uma questão antiga, mas acrescentarei o que funcionou para mim.

Eu tive o mesmo problema e descobri que no meu nsswitch.conf , havia mdns além de files e dns . Remover mdns4 resolveu esse problema para mim.

    
por J Hart 30.04.2015 / 21:47
2

Eu recebi esse erro colocando uma linha de entrada de domínio antes das duas linhas do servidor de nomes por acidente. nslookup funcionou. wget funcionou. ssh, scp, rsync falhou.

movendo o domínio para abaixo dos servidores de nomes e salvando o resolv.conf corrigido. nada mais foi necessário para mim.

    
por Louy 10.02.2014 / 14:24
-1

Eu estava enfrentando problemas para acessar meu servidor sftp. O usuário do ftp não pôde loggin ao sftp de um outro servidor. (Solaris - Openssh). Eu comentei a entrada "dns" no nsswitch.conf e o problema foi resolvido.

Obrigado Arun Janardhanan (Serviços de Software IBS)

    
por Arun 09.04.2014 / 12:45