Quais opções 'ServerAliveInterval' e 'ClientAliveInterval' em sshd_config fazem exatamente?

143

Eu encontrei esta pergunta , mas desculpe, não entendi muito bem as configurações das duas variáveis ServerAliveInterval e ClientAliveInterval mencionadas na resposta aceita. Se o meu servidor local estiver expirando, devo definir esse valor como zero? Será que isso nunca vai expirar? Devo, em vez disso, configurá-lo para 300 segundos ou algo assim?

A minha pergunta é simplesmente que algumas das minhas ligações expiram quando suspendo o & depois suspenda meu laptop com a resposta Write failed: Broken pipe e outros não. Como posso configurar corretamente um sshd local para que eles não falhem com um pipe quebrado?

    
por M. Tibbits 12.10.2010 / 18:11

6 respostas

172

ServerAliveInterval : número de segundos que o cliente aguardará antes de enviar um pacote nulo para o servidor (para manter a conexão ativa).

ClientAliveInterval : número de segundos que o servidor aguardará antes de enviar um pacote nulo para o cliente (para manter a conexão ativa).

Definir um valor de 0 (o padrão) desabilitará esses recursos para que sua conexão possa cair se ficar ociosa por muito tempo.

ServerAliveInterval parece ser a estratégia mais comum para manter uma conexão ativa. Para evitar o problema do cano quebrado, aqui está a configuração do ssh que eu uso no meu arquivo .ssh / config:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

A configuração acima funcionará da seguinte maneira,

  1. O cliente aguardará inativo por 60 segundos (tempo de ServerAliveInterval) e enviará um "pacote nulo sem operação" ao servidor e esperará uma resposta. Se não houver resposta, ele continuará tentando o processo acima até 10 (ServerAliveCountMax) vezes (600 segundos). Se o servidor ainda não responder, o cliente desconectará a conexão ssh.

ClientAliveCountMax no lado do servidor também pode ajudar. Este é o limite de quanto tempo um cliente pode ficar sem responder antes de ser desconectado. O valor padrão é 3, como em três ClientAliveInterval.

    
por 12.10.2010 / 18:29
16

Isso é explicado em sshd_config manual ( man sshd_config ):

ClientAliveInterval

Sets a timeout interval in seconds after which if no data has been received from the client, sshd will send a message through the encrypted channel to request a response from the client. The default is 0, indicating that these messages will not be sent to the client. This option applies to protocol version 2 only.

ClientAliveCountMax

The default value is 3. If ClientAliveInterval (see below) is set to 15, and ClientAliveCountMax is left at the default, unresponsive SSH clients will be disconnected after approximately 45 seconds. This option applies to protocol version 2 only.

Para as opções do cliente, veja a explicação em man ssh_config :

ServerAliveInterval

Sets a timeout interval in seconds after which if no data has been received from the server, ssh 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.

ServerAliveCountMax

The default value is 3. If, for example, ServerAliveInterval 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.

Com base no acima, 0 significa que está desativado. Portanto, você deve definir esses valores altos o suficiente para evitar o erro Canal quebrado .

    
por 02.12.2016 / 21:17
14

Como você não pode garantir que uma conexão SSH (sendo TCP) permanecerá ativa quando uma extremidade parar de enviar ACKs para pacotes recebidos, eu pessoalmente uso link para reiniciar todas as minhas conexões SSH quase assim que eu suspenso.

Como o GNU Screen estará em uso no servidor, a reconexão me leva para onde eu estava antes.

Você pode fazer com que ele escute em portas extras para que ele verifique continuamente se as conexões ainda estão ativas, mas pessoalmente acho que funciona bem o suficiente com isso desativado e confiando apenas no próprio ServerAliveInterval / ServerAliveCountMax do SSH.

Outra opção é o link que usa o UDP e se recupera da falta de conectividade a longo prazo.

    
por 26.07.2014 / 21:32
10

A resposta de Barthelemy é legal, mas não chega à raiz do problema. Você suspende sua máquina e quer que a sessão SSH ainda esteja ativa quando você inicializar seu computador.

Não existe tal configuração para o ssh que manterá a conexão ativa assim. O SSH usa o TCP, para começar você precisa do handshake de três vias e depois se manter vivo após algum tempo ocioso. Quando você desliga / hiberna todas as suas conexões TCP são fechadas com FIN. Não há como superar isso.

Para uma solução alternativa, você pode usar o VPS ou outra caixa online com tela para manter a conexão. Meu conselho não é feito por razões de segurança.

    
por 21.03.2014 / 09:42
4

Você também pode executar comandos com nohup se quiser que eles sejam executados, independentemente da sua conexão SSH.

por exemplo,

$ nohup tar -xzf some_huge.tar.gz &

O & , na minha opinião, não é necessário, mas é conveniente, pois faz com que o processo seja executado em segundo plano para que você possa fazer outras coisas.

Eu sempre uso o nohup para qualquer processo que demore, para que eu não tenha que começar de novo se perder a conexão por qualquer motivo - falta de energia (na minha localização remota, não no host obviamente), falha de rede qualquer coisa.

    
por 28.04.2013 / 06:50
0

Coloque sua longa sessão dentro da tela Veja a tela -h para detalhes

Dessa forma, você pode se reconectar à máquina usando ssh e reconectar-se à sessão de tela

    
por 20.07.2016 / 06:51