Quem é administrador de sistemas com certeza já deve ter passado por algo assim… Aliás, muita gente que acessa servidores remotamente via SSH já passou por isso. Eu mesmo já fiquei com muita raiva quando estava com diversas janelas com sessões SSH em vários lugares, editando e visualizando arquivos de configuração, esperando uma cópia de arquivos grande ou uma compactação bzip2 demorada…. Quando de repente:
Read from remote host servidor.remoto.com.br: Connection reset by peer Connection to servidor.remoto.com.br closed.
É isso… você perde o que estava fazendo e tem que efetuar login novamente na máquina remota… Multiplique isso por cada uma das várias janelas com conexões abertas e você tem um grande de um stress.
A explicação para isso é o TCP Timeout. Alguns roteadores, para manter a rede “mais limpa“, verificam constantemente todas as conexões estabelecidas para ver se alguma delas está ociosa (sem nenhum tráfego de dados). Quando é encontrada uma conexão neste estado, ele verifica se essa conexão está assim há X segundos (de acordo com a configuração do TCP Timeout) e se estiver, ele desconecta. Com isso, as conexões que teoricamente estavam “travadas” são limpas e o canal fica limpo para novas conexões, ajudando assim a descongestionar os recursos.
Só que no nosso caso, apesar da conexão SSH ficar ociosa, não quer dizer que ela está travada ou com defeito, então por favor roteador, pare de fechar estas conexões!
A solução: Keep Alive!
Para que não ocorra mais estas quedas nas conexões, podemos usar o recurso de Keep Alive, que traduzindo para português significa “Manter Vivo”. O Keep Alive é um conceito que existe em diversas aplicações e consiste em um pequeno pacote descartável e sem nenhuma importância, que é mandado para o servidor de tempos em tempos. Isso faz com que a conexão TCP continue aberta e não feche por ociosidade ou outra razão.
Para o nosso problema, podemos configurar os clientes SSH para mandar os pacotes de Keep Alive em intervalos de por exemplo, 30 segundos.
Como fazer no Linux / Unix
Em sistemas Linux e semelhantes, geralmente utilizamos o cliente de SSH chamado OpenSSH. O arquivo de configuração do cliente do SSH é:
- /etc/ssh/ssh_config
Então edite-o e adicione a seguinte linha no final do arquivo:
ServerAliveInterval 30
Pronto. Das próximas vezes que você se conectar via comando ssh em servidores remotos, o OpenSSH irá mandar os pacotes de Keep Alive de 30 em 30 segundos, e assim sua conexão não irá cair por TCP Timeout.
Se você estiver com pressa e não quiser editar um arquivo de configuração, pode fazer isso na própria linha de comando quando for executar o ssh, adicionando a opção “-o TCPKeepAlive=yes”, exemplo:
ssh -o TCPKeepAlive=yes servidor.remoto.com.br
Como fazer no Windows
No Windows, acho que 99,9% das pessoas que acessam servidores remotos via SSH utilizam o cliente PuTTY. Neste caso, para habilitar os pacotes de Keep Alive, basta preencher o campo mostrado na imagem abaixo:
Ou seja, na configuração antes da conexão, em Connection -> Seconds between keepalives e colocar a quantidade em segundos entre os pacotes, que no nosso caso é 30.