Como pode ser que ssh somename funcione, enquanto nslookup somename não funciona?

16

Como saber o endereço IP de algum host que somenameeu puder ssh? Se eu fizer nslookupneste host, ele diz "sem resposta". Como sshresolver o seu nome então?


Nem /etc/hostsnem .ssh/configexplicação funcionou.


EDITAR

Desculpe, somenameestá totalmente qualificado.

ssh somename.somedomain

funciona, enquanto

ping somename.somedomain

e

nslookup somename.somedomain

não

Dims
fonte
12
Está listado em /etc/hostsou ~/.ssh/config?
Stephen Kitt
11
O nome também pode ser resolvido usando mDNS (DNS de difusão seletiva) ou LLMNR (resolução de nome de difusão seletiva local).
Johan Myréen 7/05/19
Ele pode ter uma entrada no seu .ssh / arquivo de configuração
Tagwint
11
@ Dims Você pode tentar fazer ping somename.local. .localé um domínio especial reservado para mDNS. Para LLMNR, você pode usar este script NMAP.
Johan Myréen
2
@mckenzm não, não vai.
Stephen Kitt

Respostas:

31

Nslookup é um programa para consultar servidores de nomes de domínio da Internet . O Nslookup é muito bom para consultar servidores DNS, mas não fornece uma imagem completa quando se trata de resolução de nomes.

No Linux, a resolução de nomes é geralmente controlada pelo NSS, que é configurado por /etc/nsswitch.conf. Especificamente, esta configuração contém uma hostsentrada. Por exemplo:

hosts:          files dns

Na entrada acima, você pode ver que a primeira coisa a ser consultada é filesseguida por dns, o que significa que /etc/hostsserá consultado antes do DNS. Existem outras opções, incluindo LDAP , DNS Multicast e WINS .

Respondendo à sua pergunta diretamente, o SSH resolve o nome do host para um endereço IP usando o NSS (obtendo resultados de várias fontes) em que o nslookup consulta apenas o DNS.

Você pode verificar para qual IP NSS resolve um nome de host usando getent. Por exemplo, para resolver somename:

getent hosts somename

Também no caso do SSH, você pode configurar informações específicas do host em /etc/ssh/ssh_confige ~/.ssh/config. Isso permitirá que você especifique um endereço IP para um nome de host, ignorando completamente a resolução de nomes .:

O seguinte diz ao SSH para usar 192.168.1.25para deve dev.example.com. O SSH usará este endereço, existindo ou não esses nomes como nomes DNS para um IP diferente:

# contents of $HOME/.ssh/config
Host dev dev.example.com
    HostName 192.168.1.25
Philip Couling
fonte
10

Como saber o endereço IP de algum host que somenameeu puder ssh?

Use a flag detalhada ( -v) do sshcomando:

ssh somename -v

A saída deve conter, entre outras coisas, uma linha que mostra o IP resolvido do servidor ao qual você está se conectando:

debug1: Connecting to aur.archlinux.org [5.9.250.164] port 22.

Se eu procurar neste host, ele diz "sem resposta". Como sshresolver o seu nome então?

A causa mais provável de sshresolver um nome de host que nslookupnão pode é que ele esteja configurado no sshnível.

De acordo com a ssh_config(5)página do manual , há três locais onde os ssharquivos de configuração são procurados:

  1. opções de linha de comando
  2. arquivo de configuração do usuário (~ / .ssh / config)
  3. arquivo de configuração em todo o sistema (/ etc / ssh / ssh_config)

Um desses arquivos pode conter seu nome de host somename(ou um padrão que corresponda a ele) como um alias de outro nome de host ou IP. Por exemplo:

# explicit alias of somename to 8.8.8.8 IP
Host somename
    HostName 8.8.8.8

# pattern alias (that obviously matches somename) to another hostname
# that is itself resolved via DNS (and that can be nslookup-ed).
Host *
    HostName anotherhostname

Consulte as ssh_config(5)explicações Hoste HostNamediretrizes da página de manual e a PATTERNSseção para obter mais informações.

Jules Lamur
fonte
Esta resposta não responde à pergunta, que era como um nome de host é reconhecido, mesmo que não seja servidor por um servidor DNS.
Johan Myréen 7/05/19
11
A resposta menciona corretamente o cenário muito provável em que ssh user@someserverparece "resolver" o someservernome DNS (mesmo que isso não ocorra de fato). Se o Host someserverestiver configurado no .ssh/configarquivo, é possível usar o comando ssh exatamente como OP afirma, mesmo que someservernão esteja no DNS.
Fiisch
2
@ JohanMyréen A saída de ssh -v somenameinclui o endereço IP (independentemente de quaisquer ssh_configentradas). Por isso, responde diretamente à pergunta "Como saber o endereço IP de algum host com um nome que eu possa ssh?", Além de ser um bom primeiro passo para responder "Como pode ser que esse ssh somename funcione ...?".
JigglyNaga
4

Philip está quase lá, mas desce o .ssh/configrathole que é improvável que você tenha configurado.

Os comandos ...

getent hosts somename

... consulta o NSS usando a hosts:linha de pesquisa, em /etc/nsswitch.confvez de apenas o DNS nslookup. É provável que seu ambiente Unix esteja usando mais de um serviço de nomes; possivelmente algum tipo de integração do AD.

Rico
fonte
3
Eu não diria que segui por esse caminho. Eu adicionei um "também" para completar.
Philip Couling
@PhilipCouling Claro, mas o seu "pré-também" está incompleto - você não está mostrando como resolver um nome arbitrariamente quando a pergunta é sobre "$ thing versus nsloookup".
Rich
3
Como já comentado no Q, hostnormalmente faz parte de bind-utils (ou equivalente) e gosta de ambos nslookupe digusa apenas DNS. OTOH getent hosts(ou possivelmente ahosts) faz o que você descreve.
Dave_thompson_085
@ dave_thompson_085 Incorreto. hostconsulta outros serviços de nome. Concordou que getent hostsé o melhor método inequívoco para consultar "qualquer serviço de nome configurado".
Rich
11
hosté somente DNS nas páginas de manual e confirmado por testes nos sistemas que eu uso (CentOS, Ubuntu, FreeBSD, Solaris) e também no upstream . Veja também os (próximos) idiotas que comentei no Q, que também dizem isso.
Dave_thompson_085 10/10/19