13 min de leitura · Guia técnico
Timeout no SSH é um problema comum em servidores VPS Linux que ocorre quando a conexão é interrompida após um período de inatividade. Isso acontece devido a configurações de segurança no servidor ou em firewalls intermediários. Para solucionar esse problema, você precisará ajustar parâmetros de configuração tanto no cliente quanto no servidor SSH, garantindo conexões estáveis mesmo durante longos períodos de inatividade.
Pré-requisitos
- Acesso root ou sudo ao servidor VPS Linux
- Cliente SSH instalado em sua máquina local (OpenSSH, PuTTY, etc.)
- Conhecimentos básicos de linha de comando Linux
- Editor de texto como nano, vim ou similar
- Permissão para reiniciar o serviço SSH no servidor
Entendendo o problema de timeout no SSH
Os timeouts no SSH ocorrem quando a conexão é encerrada automaticamente após um período de inatividade. Isso pode ser extremamente frustrante, especialmente quando você está realizando tarefas que exigem longos períodos de monitoramento ou quando está trabalhando em uma conexão de rede instável.
As principais causas de timeout no SSH incluem:
- Configurações padrão restritivas no servidor SSH
- Firewalls ou roteadores que encerram conexões inativas
- Problemas de rede intermitentes
- Configurações inadequadas no cliente SSH
- NAT (Network Address Translation) que descarta conexões inativas
Antes de implementar as soluções, é importante verificar os logs do sistema para identificar a causa exata do timeout. Você pode examinar os logs SSH com o seguinte comando:
sudo journalctl -u sshd
Ou, em sistemas mais antigos:
sudo cat /var/log/auth.log | grep ssh
Procure por mensagens que indiquem "timeout", "connection closed" ou "disconnected".
Configurando o servidor SSH para evitar timeouts
A configuração do servidor SSH é o primeiro passo para resolver problemas de timeout. O arquivo principal de configuração do SSH está localizado em /etc/ssh/sshd_config. Vamos modificá-lo para aumentar o tempo de inatividade permitido.
-
Abra o arquivo de configuração do SSH com seu editor de texto preferido:
sudo nano /etc/ssh/sshd_config -
Procure pelas linhas que contêm
ClientAliveIntervaleClientAliveCountMax. Se não existirem, adicione-as ao final do arquivo:# Configuração para evitar timeouts ClientAliveInterval 60 ClientAliveCountMax 3Estas configurações significam:
- ClientAliveInterval 60: O servidor enviará um pacote de keep-alive a cada 60 segundos para verificar se o cliente ainda está ativo.
- ClientAliveCountMax 3: O servidor tolerará até 3 pacotes de keep-alive sem resposta antes de encerrar a conexão (ou seja, 3 minutos de inatividade total).
-
Verifique também se a opção
TCPKeepAliveestá habilitada:TCPKeepAlive yes -
Salve o arquivo e saia do editor (no nano: Ctrl+O, Enter, Ctrl+X).
-
Reinicie o serviço SSH para aplicar as alterações:
sudo systemctl restart sshdEm sistemas mais antigos que não usam systemd:
sudo service ssh restart
Atenção: Ao reiniciar o serviço SSH, suas conexões atuais não serão afetadas, mas é recomendável ter um método alternativo de acesso ao servidor caso algo dê errado.
Configurando o cliente SSH para manter a conexão ativa
Além de configurar o servidor, também é importante ajustar as configurações do cliente SSH para evitar timeouts. Isso é especialmente útil quando você não tem acesso administrativo ao servidor ou quando precisa se conectar a vários servidores diferentes.
Configuração para todos os servidores
Para configurar o cliente SSH para manter conexões ativas com todos os servidores:
-
Crie ou edite o arquivo de configuração SSH do cliente:
nano ~/.ssh/config -
Adicione as seguintes linhas:
Host * ServerAliveInterval 60 ServerAliveCountMax 3 TCPKeepAlive yesEstas configurações significam:
- ServerAliveInterval 60: O cliente enviará um pacote de keep-alive a cada 60 segundos.
- ServerAliveCountMax 3: O cliente tolerará até 3 pacotes de keep-alive sem resposta antes de considerar a conexão perdida.
- TCPKeepAlive yes: Habilita os pacotes TCP keep-alive.
-
Salve o arquivo e saia do editor.
Configuração para um servidor específico
Se você quiser aplicar configurações diferentes para servidores específicos:
Host meu-servidor-vps
HostName 123.456.789.10
User admin
ServerAliveInterval 30
ServerAliveCountMax 6
Com esta configuração, você pode se conectar usando ssh meu-servidor-vps e as configurações específicas serão aplicadas.
Configuração temporária via linha de comando
Se você precisar de uma solução rápida sem modificar arquivos de configuração, pode usar opções de linha de comando:
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 usuario@servidor
Soluções para timeouts durante transferências de arquivos
Transferências de arquivos grandes via SSH (usando SCP ou SFTP) são particularmente suscetíveis a timeouts. Aqui estão algumas soluções específicas para esse problema:
Usando o rsync com opção de retomada
O rsync é uma ferramenta poderosa que permite retomar transferências interrompidas:
rsync -avz --partial --progress --timeout=300 /caminho/local/arquivo usuario@servidor:/caminho/destino/
Opções importantes:
- --partial: Mantém arquivos parcialmente transferidos, permitindo retomar a transferência.
- --progress: Mostra o progresso da transferência.
- --timeout=300: Define um timeout de 300 segundos para operações de I/O.
Dividindo arquivos grandes
Para arquivos extremamente grandes, considere dividi-los antes da transferência:
split -b 1G arquivo_grande arquivo_parte_
Isso dividirá o arquivo em partes de 1GB cada. Após a transferência, você pode reuni-las com:
cat arquivo_parte_* > arquivo_grande
Usando o screen ou tmux para sessões persistentes
Ferramentas como screen ou tmux permitem que você mantenha sessões de terminal mesmo se sua conexão SSH cair:
sudo apt install screen
screen
# Inicie sua transferência de arquivo aqui
# Para desanexar: Ctrl+A, D
# Para reanexar: screen -r
Problemas comuns e como resolver
Sintoma: A conexão SSH cai exatamente após X minutos
Causa: Provavelmente há um firewall ou NAT no caminho que está configurado para descartar conexões inativas após esse período específico.
Solução: Configure valores mais baixos para ServerAliveInterval/ClientAliveInterval (por exemplo, 30 segundos) para garantir que os pacotes de keep-alive sejam enviados antes do timeout do firewall.
Sintoma: Mensagem "Write failed: Broken pipe" ao tentar usar SSH após inatividade
Causa: A conexão foi encerrada pelo servidor ou por um dispositivo intermediário, mas o cliente SSH não detectou isso imediatamente.
Solução: Além de configurar os parâmetros de keep-alive, verifique se há problemas de rede intermitentes usando ferramentas como mtr ou traceroute para identificar pontos problemáticos na rota de rede.
Sintoma: As configurações de keep-alive não parecem funcionar
Causa: Pode haver configurações conflitantes em outros arquivos de configuração ou o serviço SSH não foi reiniciado corretamente.
Solução: Verifique se não há configurações contraditórias em /etc/ssh/sshd_config.d/ ou em arquivos incluídos. Reinicie completamente o serviço SSH com sudo systemctl restart sshd e verifique seu status com sudo systemctl status sshd.
Sintoma: Timeouts ocorrem apenas em redes específicas
Causa: Algumas redes, especialmente redes móveis ou públicas, têm políticas agressivas de timeout para economizar recursos.
Solução: Use valores ainda mais baixos para ServerAliveInterval (15-30 segundos) quando estiver nessas redes. Considere também usar uma VPN, que pode fornecer uma conexão mais estável.
Sintoma: Timeouts durante operações de CPU intensivas no servidor
Causa: Quando o servidor está sob carga extrema, pode não responder aos pacotes de keep-alive dentro do tempo esperado.
Solução: Aumente o valor de ServerAliveCountMax/ClientAliveCountMax para tolerar mais pacotes perdidos, e considere otimizar o desempenho do servidor para reduzir a carga de CPU.
Perguntas frequentes sobre timeout no SSH
Por que minha conexão SSH cai após alguns minutos de inatividade?
Sua conexão SSH provavelmente está caindo devido à configuração de timeout no servidor ou no cliente SSH. Para resolver, você pode ajustar o parâmetro ClientAliveInterval no arquivo /etc/ssh/sshd_config do servidor ou configurar o KeepAlive no seu cliente SSH.
Como aumentar o tempo limite de inatividade no SSH?
Para aumentar o tempo limite de inatividade no SSH, edite o arquivo /etc/ssh/sshd_config e adicione ou modifique as linhas ClientAliveInterval e ClientAliveCountMax. Por exemplo, ClientAliveInterval 300 e ClientAliveCountMax 3 permitirão 15 minutos de inatividade antes de desconectar.
É possível manter a conexão SSH sempre ativa?
Sim, é possível manter a conexão SSH praticamente sempre ativa configurando o KeepAlive tanto no cliente quanto no servidor. No cliente, adicione 'ServerAliveInterval 60' ao arquivo ~/.ssh/config, e no servidor, configure 'ClientAliveInterval' com um valor baixo como 60 segundos no arquivo /etc/ssh/sshd_config.
O que fazer quando o SSH apresenta timeout durante a transferência de arquivos grandes?
Quando o SSH apresenta timeout durante transferências grandes, aumente o valor de TCPKeepAlive e ClientAliveInterval no servidor. Também considere usar ferramentas como rsync com a opção --partial para permitir a retomada de transferências interrompidas ou dividir os arquivos em partes menores.
Como diagnosticar a causa de timeouts frequentes no SSH?
Para diagnosticar timeouts frequentes no SSH, verifique os logs do sistema com 'journalctl -u sshd' ou '/var/log/auth.log', teste a latência de rede com 'ping', verifique firewalls intermediários e analise a carga do servidor. Também é útil tentar conexões com o modo verbose do SSH usando 'ssh -vvv usuario@servidor'.
Otimizando a segurança sem comprometer a estabilidade
Ao configurar parâmetros para evitar timeouts, é importante não comprometer a segurança do seu servidor. Aqui estão algumas práticas recomendadas:
- Não desative completamente os timeouts (definindo valores muito altos), pois isso pode deixar conexões zumbis consumindo recursos do servidor.
- Use autenticação por chave SSH em vez de senhas para maior segurança.
- Considere implementar o fail2ban para proteger contra tentativas de força bruta.
- Limite o acesso SSH a endereços IP específicos usando regras de firewall quando possível.
- Mantenha seu servidor SSH atualizado para corrigir vulnerabilidades de segurança.
Para implementar autenticação por chave SSH, você pode seguir estes passos:
-
Gere um par de chaves SSH em sua máquina local (se ainda não tiver):
ssh-keygen -t ed25519 -C "[email protected]" -
Copie a chave pública para o servidor:
ssh-copy-id usuario@servidor -
Opcionalmente, desative a autenticação por senha editando /etc/ssh/sshd_config:
PasswordAuthentication no -
Reinicie o serviço SSH:
sudo systemctl restart sshd
Você pode encontrar mais informações sobre como acessar servidores VPS Linux da AviraHost em nosso guia detalhado.
Conclusão
- Os problemas de timeout no SSH podem ser resolvidos ajustando configurações tanto no servidor quanto no cliente, principalmente através dos parâmetros ClientAliveInterval, ClientAliveCountMax, ServerAliveInterval e ServerAliveCountMax.
- Para transferências de arquivos grandes, ferramentas como rsync com a opção --partial ou o uso de screen/tmux podem evitar a frustração de ter que reiniciar transferências interrompidas.
- Ao implementar soluções para timeouts, mantenha um equilíbrio entre conveniência e segurança, utilizando autenticação por chave SSH e mantendo seu servidor atualizado.
Precisa de ajuda com seu servidor VPS Linux?
Na AviraHost, oferecemos servidores VPS Linux otimizados com suporte técnico especializado para ajudar você a configurar e manter seu ambiente sem problemas de timeout ou outras questões de conectividade.