Como o tcp-keepalive funciona no ssh?

85

Eu estou tentando codificar um shell-script que usa uma conexão ssh para fazer "pulsações". Desejo encerrar o lado do cliente e do servidor dessa conexão após um certo tempo limite (após a queda da conexão).

O que eu encontrei até agora:

  • TCPKeepAlive yes / no para ssh e sshd
  • ClientAliveCountMax para sshd
  • ClientAliveInterval para sshd
  • ServerAliveCountMax para ssh
  • ServerAliveInterval para ssh

Para alterar "ClientAliveCountMax", eu precisaria modificar o sshd_config em cada máquina de destino (essa opção está desativada por padrão).

Portanto, minha pergunta é - posso usar o "TCPKeepAlive" para meus propósitos também (sem alterar mais nada nas máquinas de origem / destino)?

O sistema operacional de destino é o SLES11 SP2 - mas não acho relevante aqui.

Nils
fonte
Esses parâmetros são todos destinados a situações em que um firewall ou dispositivo intermediário ao longo da conexão terminará a conexão. Esses parâmetros são para enviar dados periódicos para manter a conexão ativa e também para desligar a conexão quando houver X respostas pendentes. Você pode fornecer um pouco mais de detalhes do que está fazendo? Você está usando a ControlMasteropção e conexões escravo?
Patrick
Eu só quero criar um meio para determinar se outro nó está "inativo" usando várias conexões ssh-network com várias linhas físicas. Eu faço isso apenas abrindo uma sessão ssh (que mais ou menos faz um loop sem fim). Quero que a sessão termine se as conexões quebrarem. Gostaria de saber qual é o intervalo / contagem para TCPKeepalive.
Nils

Respostas:

104

Você provavelmente deseja usar as configurações do ServerAlive para isso. Eles não requerem nenhuma configuração no servidor e podem ser configurados na linha de comando, se desejar.

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

Isso enviará uma mensagem de manutenção de rotina ssh a cada 5 segundos e, se chegar a hora de enviar outra manutenção de manutenção, mas uma resposta para a última não foi recebida, a conexão será encerrada.

A diferença crítica entre ServerAliveIntervale TCPKeepAliveé a camada em que eles operam.

  • TCPKeepAliveopera na camada TCP. Ele envia um pacote TCP ACK vazio. Os firewalls podem ser configurados para ignorar esses pacotes; portanto, se você passar por um firewall que interrompe conexões inativas, elas podem não manter a conexão ativa.
  • ServerAliveIntervalopera na camada ssh. Na verdade, ele envia dados pelo ssh, para que o pacote TCP tenha criptografado os dados e um firewall não saiba se é um pacote de manutenção de atividade ou legítimo, para que funcionem melhor.
Patrick
fonte
1
Eu acho que essa é a direção certa. Testes iniciais mostraram que isso funcionará - ele terminará o envio e recebimento de subprocessos ssh / sshd nos últimos 5 segundos após a queda da conexão. Acho que o TCPKeepalive simplesmente usa os padrões da pilha TCP - por isso é mais difícil de configurar também.
Nils
Isso também resolve o problema do usuário fantasma. Eu acredito que isso também pode ser feito nas configurações do PuTTY , mudando Seconds between keepalivespara 1800 em Configurações | Conexão.
Bob Stein
7

A TCPKeepAliveopção é realmente um método muito diferente de manter as conexões ativas das opções do tipo ClientAlive ou ServerAlive.

São por BSD página do manual SSH , podemos ler que:

As mensagens ativas do cliente são enviadas pelo canal criptografado e, portanto, não serão falsificadas. A opção TCP keepalive ativada por TCPKeepAliveé falsificada. O mecanismo ativo do cliente é valioso quando o cliente ou o servidor depende de saber quando uma conexão se tornou inativa.

O TCPKeepAlivecertifique-se se o sistema deve enviar mensagens TCP keepalive para o outro lado. A opção padrão está sempre ativada.

Se você estiver usando ClientAliveInterval, você pode desativar TCPKeepAlive. Essa opção enviará uma mensagem através do canal criptografado para solicitar uma resposta do cliente (o padrão é 0, portanto, nenhuma mensagem será enviada ao cliente) e ClientAliveCountMaxdefine o número de mensagens ativas do cliente antes que o sshd desconecte o cliente, encerrando o sessão.

kenorb
fonte