ServerAliveCountMax no SSH

24

O que o ServerAliveCountMax no SSH realmente faz?

Estou tentando garantir que, quando eu me conecto ao meu servidor via SSH, a conexão permaneça aberta por um longo período de tempo, em vez de a conexão acabar após um curto período de inatividade. Este é o exemplo

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 2

Ouvi de uma fonte que a configuração acima sempre envia uma resposta ao servidor a cada 60 segundos, desde que o servidor receba essa resposta. No entanto, se por algum motivo a resposta não for enviada ao servidor, ela tentará enviar outra mensagem. Se essa mensagem também falhar, ela fechará a conexão. (Eu sinto que isso está errado)

A segunda e terceira fonte, no entanto, dizem algo diferente. Eles afirmam que uma mensagem será enviada ao servidor a cada 60 segundos, se houver um período de inatividade, mas somente enviará duas solicitações e depois fechará a conexão.

Então, o que exatamente ServerAliveCountMax faz?

John Crawford
fonte

Respostas:

31

Seu sentimento de que "isso está errado" está correto. Veja a página de manual :

 ServerAliveCountMax
         Sets the number of server alive messages (see below) which may be
         sent without ssh(1) receiving any messages back from the server.
         If this threshold is reached while server alive messages are
         being sent, ssh will disconnect from the server, terminating the
         session.  It is important to note that the use of server alive
         messages is very different from TCPKeepAlive (below).  The server
         alive messages are sent through the encrypted channel and there‐
         fore will not be spoofable.  The TCP keepalive option enabled by
         TCPKeepAlive is spoofable.  The server alive mechanism is valu‐
         able when the client or server depend on knowing when a connec‐
         tion has become inactive.

         The default value is 3.  If, for example, ServerAliveInterval
         (see below) is set to 15 and ServerAliveCountMax is left at the
         default, if the server becomes unresponsive, ssh will disconnect
         after approximately 45 seconds.  This option applies to protocol
         version 2 only.

 ServerAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the server, ssh(1) will send a message through
         the encrypted channel to request a response from the server.  The
         default is 0, indicating that these messages will not be sent to
         the server.  This option applies to protocol version 2 only.
Michael Hampton
fonte
3
A página de manual é clara no Intervalconjunto para 0desativá-la. Mas não está claro se você definir Maxa 0. Envia infinitos pings vivos, ou nenhum?
gcb
não está claro para mim se a configuração de ServerAliveInterval 0 manterá a conexão aberta indefinidamente ou não #
Francesco
1
@Francesco Por padrão, a conexão permanecerá aberta para sempre, a menos que uma extremidade a feche explicitamente.
Michael Hampton
5

As mensagens ativas do servidor são úteis quando um servidor SSH foi configurado para fechar conexões após um período de tempo sem tráfego (os provedores de hospedagem compartilhada na Web que oferecem acesso SSH quase sempre fazem isso, por exemplo). A definição dessas duas opções envia um pacote a cada ServerAliveIntervalsegundo, por um período máximo de ServerAliveCountMaxtempo, mantendo assim a sessão ativa.

Para responder aos comentários sobre a incerteza de definir qualquer uma das opções 0, li o código fonte da opensshimplementação e aqui está o que vejo ...

  • A configuração ServerAliveIntervalpara 0NÃO enviará os pacotes, mas manterá a sessão ativa indefinidamente, assumindo que a conexão não foi interrompida devido ao tempo limite do TCP e que o servidor não está configurado para eliminar clientes inativos.

  • Definir ServerAliveCountMaxpara 0tem o mesmo efeito que definir ServerAliveIntervalpara 0.

  • Definir um valor como negativo ou algo maior que INT_MAX(ou seja, 2.147.483.647) resultará em um erro "valor inteiro ..." .

  • Definir ServerAliveCountMaxentre INT_MAX/1000+1(ie 2.147.484) a INT_MAX(ou seja 2.147.483.647) também seria equivalente a definir qualquer valor para 0.

Portanto, em essência, o maior tempo limite que você pode obter (enquanto ainda envia os pacotes) é INT_MAX/1000(ou seja, 2.147.483). Com um tempo limite esgotado 1e nenhum tráfego nas sessões, você recebe quase 25 dias.

Obviamente, outras implementações do SSH podem ter resultados diferentes.

Drew Chapin
fonte