ti-enxame.com

Quais são as opções `ServerAliveInterval` e` ClientAliveInterval` no sshd_config exatamente?

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

Minha pergunta é simplesmente: algumas das minhas conexões atingem o tempo limite quando eu suspiro e desinsiro o meu laptop com a resposta Write failed: Broken pipe e alguns não. Como posso configurar corretamente um sshd local para que eles não falhem com um pipe quebrado?

177
M. Tibbits

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

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

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

ServerAliveInterval parece ser a estratégia mais comum para manter uma conexão ativa. Para evitar o problema de tubo quebrado, aqui está a configuração 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 ServerAliveInterval) e enviará um "pacote nulo não operacional" para o 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. Esse é o limite de quanto tempo um cliente pode permanecer sem resposta antes de ser desconectado. O valor padrão é 3, como em três ClientAliveInterval.

227
Barthelemy

Isso é explicado em sshd_config manual (man sshd_config):

ClientAliveInterval

Define um intervalo de tempo limite em segundos, após o qual, se nenhum dado foi recebido do cliente, o sshd enviará uma mensagem através do canal criptografado para solicitar uma resposta do cliente. O padrão é 0, indicando que essas mensagens não serão enviadas ao cliente. Essa opção se aplica apenas à versão 2 do protocolo.

ClientAliveCountMax

O valor padrão é 3. Se ClientAliveInterval (veja abaixo) estiver definido como 15 e ClientAliveCountMax for deixado no padrão, os clientes SSH que não responderem serão desconectados após aproximadamente 45 segundos. Esta opção se aplica apenas ao protocolo versão 2.

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

ServerAliveInterval

Define um intervalo de tempo limite em segundos após o qual, se nenhum dado foi recebido do servidor, ssh enviará uma mensagem pelo canal criptografado para solicitar uma resposta do servidor. O padrão é 0, indicando que essas mensagens não serão enviadas ao servidor. Essa opção se aplica apenas à versão 2 do protocolo.

ServerAliveCountMax

O valor padrão é 3. Se, por exemplo, ServerAliveInterval estiver definido como 15 e ServerAliveCountMax for deixado no padrão, se o servidor não responder, ssh será desconectado após aproximadamente 45 segundos. Esta opção se aplica apenas ao protocolo versão 2.

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

29
kenorb

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

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

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

20
3h4x

Como você não pode garantir que uma conexão SSH (sendo TCP) permaneça ativa quando uma extremidade parar de enviar ACKs para pacotes recebidos, eu pessoalmente uso http://www.harding.motd.ca/autossh/ = para reiniciar todas as minhas conexões SSH quase assim que eu suspender.

Como a tela GNU estará em uso no lado do servidor, a reconectação me leva a onde eu estava antes).

Você pode ouvi-lo em portas extras para verificar continuamente se as conexões ainda estão ativas, mas, pessoalmente, acho que funciona bem o suficiente com isso desativado e confiando apenas no ServerAliveInterval/ServerAliveCountMax do SSH.

Outra opção é http://mosh.mit.edu/ que usa UDP e se recupera perfeitamente da falta de conectividade a longo prazo.

16
grifferz

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

por exemplo.

$ Nohup tar -xzf some_huge.tar.gz &

O & acho que 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 leva algum tempo, para não precisar recomeçar se perder a conexão por qualquer motivo - falta de energia (na minha localização remota, não no host, obviamente), falta de rede, qualquer que seja.

5
Buttle Butkus

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 à sessão da tela

1
user180529