Como funciona o tcp-keepalive no ssh?

77

Estou tentando codificar um script de shell que usa uma conexão ssh para fazer "heartbeats". Eu quero terminar o lado do cliente e do servidor dessa conexão depois de um certo tempo limite (após a conexão cair).

O que eu encontrei até agora:

  • TCPKeepAlive sim / não para ssh e sshd
  • ClientAliveCountMax para sshd
  • ClientAliveInterval para sshd
  • ServerAliveCountMax para ssh
  • ServerAliveInterval para ssh

Para alterar "ClientAliveCountMax" eu teria que modificar o sshd_config em cada máquina de destino (esta opção está desabilitada por padrão).

Então, a minha pergunta é - eu posso usar "TCPKeepAlive" para os 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 que isso seja relevante aqui.

    
por Nils 12.03.2012 / 12:57

2 respostas

93

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

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

Isso enviará uma mensagem ssh keepalive a cada 5 segundos, e, se chegar a hora de enviar outro keepalive, mas uma resposta ao último não tiver sido recebida, a conexão será encerrada.

A diferença crítica entre ServerAliveInterval e TCPKeepAlive é a camada em que operam.

  • TCPKeepAlive opera 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 solte conexões inativas, elas podem não manter a conexão ativa.
  • ServerAliveInterval opera na camada ssh. Ele realmente enviará dados por meio do ssh, de modo que o pacote TCP tenha dados criptografados e um firewall não possa dizer se é um pacote keepalive ou legítimo, para que eles funcionem melhor.
por 15.03.2012 / 02:19
4

A opção TCPKeepAlive é, na verdade, um método muito diferente de manter as conexões ativas de opções semelhantes a ClientAlive ou semelhantes a ServerAlive.

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

The client alive messages are sent through the encrypted channel and therefore will not be spoofable. The TCP keepalive option enabled by TCPKeepAlive is spoofable. The client alive mechanism is valuable when the client or server depend on knowing when a connection has become inactive.

O TCPKeepAlive verifica 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 , poderá desativar TCPKeepAlive . Esta opção enviará uma mensagem através do canal criptografado para solicitar uma resposta do cliente (o padrão é 0, portanto, nenhuma mensagem é enviada ao cliente) e ClientAliveCountMax define o número de mensagens do cliente ativo antes que o sshd desconecte o cliente, terminando a sessão.

    
por 11.12.2016 / 12:58