termal.in

← Blog

13 erros comuns de SSH e como corrigir cada um

· atualizado 29 de set. de 2026 · Termalin Team sshtroubleshootingtutorial

As mensagens de erro do SSH são lacônicas de propósito — o protocolo não diz a um estranho por que o rejeitou. Isso é boa segurança e péssima ergonomia: a mensagem que você vê costuma estar a dois passos do problema real. Este é um guia prático dos treze erros que você de fato vai encontrar, o que cada um realmente significa e o caminho mais rápido para a correção.

Uma ferramenta antes de começar: ssh -v user@host (acrescente até -vvv — como ler essa saída (em inglês)). Quase todo mistério abaixo deixa de ser mistério assim que você vê em qual etapa do handshake ele morre.

Os erros num relance

ErroO que significaPrimeiro passo
Connection refusedO host respondeu; nada escutando naquela portaVerifique se o sshd está no ar e na porta que você discou
Connection timed outPacotes sumiram no caminhoVerifique o firewall/security group da nuvem
Permission denied (publickey)Nenhuma chave que você ofereceu foi aceitaVerifique o usuário, depois a chave, depois o authorized_keys
Permission denied (sem prompt)A autenticação por senha está desativada; uma chave precisa funcionarUse uma chave, ou entre pelo console do provedor
Host key verification failedA chave do servidor mudou desde que você confiou nelaVerifique por outro canal, depois ssh-keygen -R
Too many authentication failuresO agente ofereceu chaves demais-o IdentitiesOnly=yes com -i
UNPROTECTED PRIVATE KEY FILEO arquivo da chave pode ser lido por outroschmod 600 na chave privada
Broken pipeUma conexão ociosa foi derrubadaAdicione ServerAliveInterval
no matching key exchange methodServidor legado, cliente modernoReative um algoritmo só para aquele host
Connection reset by peerO TCP fechou de supetão antes do olá do SSHVerifique o fail2ban / MaxStartups
Bad configuration optionSeu cliente é velho demais para uma linha de configAtualize o ssh, ou proteja a linha
did not receive identification stringAlgo conectou, mas não enviou bannerGeralmente um scanner; ignore no lado do servidor
Unspecified GSS failureUma tentativa de Kerberos falhou e recuouIgnore se o login ainda funcionar

1. Connection refused

A máquina está acessível, mas nada está escutando na porta em que você bateu. Este quase nunca é sobre você:

  • o sshd não está rodando — systemctl status sshd a partir de um console (provedores de VPS têm um console web para exatamente este momento);
  • ele escuta em uma porta fora do padrão — tente ssh -p 2222, ou verifique Port em /etc/ssh/sshd_config;
  • um firewall está ativamente rejeitando (em vez de descartar) a porta.

Se você acabou de reconstruir o servidor, é o firewall. Se funcionava ontem, o sshd caiu ou a porta mudou.

Correção completa: connection refused vs timed out, decifrados.

2. Connection timed out

Diferente de recusado: seus pacotes estão sumindo. O host está fora do ar, o IP está errado ou — na maioria das vezes em máquinas na nuvem — um security group / ACL de rede descarta silenciosamente a porta 22. Verifique primeiro as regras de firewall do provedor, depois se você está em uma rede que bloqueia a saída pela 22 (o Wi-Fi de visitantes de hotéis e escritórios adora isso; tente um acesso baseado na porta 443 ou uma rede diferente para confirmar).

Correção completa: o mesmo passo a passo de refused vs timed out tem o ramo do timed-out detalhado.

3. Permission denied (publickey)

O campeão de todos os tempos. O servidor só aceita autenticação por chave, e não aceitou nenhuma chave que você ofereceu. Em ordem de probabilidade:

  • Usuário errado. ubuntu em imagens Ubuntu, ec2-user no Amazon Linux, root na maioria dos VPSes crus. A mesma chave com o nome de usuário errado produz exatamente este erro — cada imagem de nuvem escolhe seu próprio usuário de login, o que é metade do primeiro login em EC2/VPS (em inglês).
  • Sua chave não foi oferecida. ssh -v mostra cada chave tentada. Se a sua chave não está na lista, aponte para ela explicitamente: ssh -i ~/.ssh/id_ed25519 user@host.
  • A chave não está no servidor. A metade pública dela precisa ser uma linha em ~user/.ssh/authorized_keys — daquele usuário, não do root.
  • Permissões no lado do servidor. O sshd se recusa a honrar o authorized_keys se o diretório home, o ~/.ssh (700) ou o próprio arquivo (600) tiver permissão de escrita para o grupo. Este é o clássico “copiei a chave e ainda não funciona”.

Correção completa: Permission denied (publickey), uma correção sistemática e rápida (em inglês) percorre cada culpado em ordem.

4. Permission denied quando você esperava um pedido de senha

Se você queria autenticação por senha e nunca foi perguntado, o servidor tem PasswordAuthentication no — a maioria das imagens de nuvem vem assim, e é o padrão certo. Use o console do provedor ou a sua chave existente para entrar, depois adicione a nova chave do jeito certo, em vez de reativar as senhas.

5. Host key verification failed / REMOTE HOST IDENTIFICATION HAS CHANGED

O banner assustador com energia de caveira em ASCII. O servidor apresentou uma chave diferente da que você confiou antes. Duas explicações: a máquina foi legitimamente reconstruída/reinstalada (de longe o caso comum), ou algo entre você e o servidor está se passando por ele (o caso para o qual o aviso existe).

Se — e somente se — você sabe que o servidor foi reconstruído: ssh-keygen -R hostname remove a entrada obsoleta, e a próxima conexão volta a confiar. Não roteirize cegamente essa remoção no seu fluxo de trabalho; a única vez em que o aviso é real, é o único aviso que você recebe.

Correção completa: Host key verification failed, e o jeito certo de corrigir (em inglês).

6. Too many authentication failures

Seu agente ofereceu com entusiasmo seis chaves, e o MaxAuthTries do servidor disse basta. Diga ao cliente para oferecer só a chave que você quer:

ssh -o IdentitiesOnly=yes -i ~/.ssh/the_right_key user@host

…ou torne isso permanente em ~/.ssh/config por host. Se você carrega muitas chaves, IdentitiesOnly yes sob Host * vai lhe poupar deste erro para sempre.

7. WARNING: UNPROTECTED PRIVATE KEY FILE

Sua chave privada pode ser lida por outros, e o cliente se recusa a usá-la. chmod 600 ~/.ssh/id_ed25519. No Windows, isso aparece depois de copiar chaves entre máquinas ou de um drive na nuvem — corrija pelas propriedades de Segurança do arquivo, ou mantenha as chaves totalmente fora de pastas sincronizadas.

8. client_loop: send disconnect: Broken pipe (a sessão que morre quando você desvia o olhar)

Conexões ociosas derrubadas por um roteador NAT ou um firewall agressivo entre você e o servidor. Keepalives resolvem no lado do cliente:

Host *
    ServerAliveInterval 30
    ServerAliveCountMax 4

Dois minutos de silêncio tolerados, pacotes a cada 30 segundos para que a tabela NAT nunca esqueça você. Se as sessões morrem sob carga em vez de ociosas, é outro bicho — olhe o MTU (VPNs especialmente), não os keepalives.

9. no matching key exchange method found / no matching cipher

Você está falando com algo antigo — um roteador, um switch, um appliance preso em criptografia legada. O OpenSSH moderno removeu esses algoritmos por um bom motivo. Reative-os só para aquele host, nunca globalmente:

Host ancient-switch
    KexAlgorithms +diffie-hellman-group14-sha1
    Ciphers +aes256-cbc

A mensagem de erro nomeia os algoritmos que o servidor ofereceu; adicione o menos ruim que ela listar.

10. ssh_exchange_identification: read: Connection reset by peer

A conexão TCP abriu e foi fechada de supetão na mesma hora, antes mesmo de o SSH dizer olá. Suspeitos de sempre: o fail2ban ou o DenyHosts baniram o seu IP (verifique /etc/hosts.deny e a jail do fail2ban a partir de um console), o sshd está sobrecarregado (MaxStartups esgotado por um scanner martelando a porta), ou um health check de load balancer está comendo as conexões. Se for o fail2ban e for o seu próprio servidor, a correção é um login pelo console e fail2ban-client unban <your-ip> — depois tire o SSH do radar dos scanners ou aperte a jail para você não ser o dano colateral da semana que vem.

11. Bad configuration option: pubkeyacceptedalgorithms

Não é problema de servidor — o seu ssh local é velho demais para o seu arquivo de configuração. PubkeyAcceptedAlgorithms chegou no OpenSSH 8.5 (substituiu o PubkeyAcceptedKeyTypes); entregue essa linha a um cliente mais antigo — o ssh de fábrica de um macOS de certa idade, uma distro antiga, uma imagem mínima de contêiner — e ele se recusa a interpretar o arquivo por completo. Três saídas: atualize o cliente (ssh -V diz onde você está); use a grafia antiga PubkeyAcceptedKeyTypes, que as versões mais novas ainda aceitam como alias; ou proteja a linha para que só clientes capazes a leiam:

Match all
    # only OpenSSH >= 8.5 gets here via Include ordering

— na prática, a proteção mais simples é manter as opções sensíveis à versão em um arquivo separado puxado com Include, de modo que um cliente antigo sobre os mesmos dotfiles simplesmente o pule. O mesmo formato de erro (Bad configuration option: <something>) sempre significa a mesma coisa: aquela palavra é desconhecida para este binário — verifique primeiro a grafia da opção, depois a versão do binário.

12. did not receive identification string / invalid ssh identification string

Ambos vivem na primeira etapa do SSH — a troca de banner, antes de qualquer criptografia. did not receive identification string from <ip> é registrado no lado do servidor pelo sshd quando algo abriu uma conexão TCP na porta 22, mas nunca enviou a linha SSH-2.0-...: um port scanner, um health check de load balancer, uma sonda de monitoramento ou um cliente que desistiu. Nos logs do seu servidor, quase sempre é ruído de fundo, não um defeito — a menos que seja o seu cliente falhando ao conectar, caso em que algo no caminho (um proxy, um TCP wrapper, um IDS) está comendo o banner.

kex_exchange_identification: ... invalid ssh identification string é a imagem espelhada: algo respondeu, mas com dados que não são SSH. Causas de sempre, em ordem: você apontou o ssh para a porta errada — um servidor HTTP, um banco de dados, um portal cativo devolvendo HTML; um middlebox no caminho está interceptando a conexão e respondendo no lugar do servidor; ou uma má configuração de ProxyCommand/ProxyJump está canalizando para o cliente algo que não é um fluxo SSH — a página de erro de um proxy chegando onde deveria vir um banner. Confirme que você está mesmo falando com um sshd: nc <host> 22 deve imprimir um banner SSH-2.0-OpenSSH... imediatamente. Se imprimir HTML ou nada, a porta (ou o host, ou o salto do proxy) está errada, não a sua chave.

13. Unspecified GSS failure / debug1: unspecified GSS failure. Minor code may provide more information

Ruído de Kerberos. Por padrão, o OpenSSH tenta a autenticação GSSAPI (Kerberos) antes da sua chave e, se você não está em um realm Kerberos — o caso da maioria —, ela falha e registra isto em nível de debug, depois recua para a autenticação por chave e conecta normalmente. Se a conexão acaba dando certo, esta linha é inofensiva; ignore-a. Ela só importa se você realmente depende do SSO via Kerberos e a autenticação está falhando, caso em que é um problema real de ticket/realm (verifique klist, o desvio de relógio e o SPN do host no DNS). Para parar o ruído em uma configuração sem Kerberos, adicione GSSAPIAuthentication no à sua config.


Faça as correções durarem

Metade delas são correções pontuais; a outra metade merece uma linha em ~/.ssh/config para que nunca voltem — keepalives, IdentitiesOnly, portas e identidades por host. Config vence memória.

A outra coisa que vence a memória é um cliente que guarda o estado por você. O Termalin guarda as configurações por host — porta, usuário, chave, keepalives — junto do próprio host, verifica os servidores na primeira conexão e avisa alto quando uma impressão digital muda, e sua barra de status mostra os sinais vitais da máquina ao vivo, então “a máquina está sequer no ar?” deixa de ser um passo do diagnóstico. O plano Free não tem limite de hosts — pegue o Termalin e aposente alguns desses erros de vez.

Experimente em um host.

Termalin é um cliente SSH rápido para você — e para seus agentes.

Plano gratuito · 14 dias de Pro grátis · preços