Como posso impedir que minhas sessões SSH congele?

66

Eu tenho ServerAliveIntervale, no caso de poucas máquinas, também ClientAliveIntervaldefinido como 540 nos arquivos de configuração de cliente / servidor SSH (suponho que configurá-lo para mais do que isso não seria uma boa ideia). Eu trabalho com muitas sessões SSH que atualmente congelam após alguns minutos.

Como posso corrigir isso? O que eu quero é ter uma sessão para não congelar, de modo que, se eu abrir uma sessão às 8 e não a usar por 4 horas, por exemplo, ainda usá-la novamente às 12 sem ter que fazer login novamente .

sintagma
fonte
Por quanto tempo você pode permanecer conectado no momento (supondo que isso não se deva à desconexão da rede)? TCPKeepAlive yes?
Iyrin
Não tenho certeza, mas 10 min. no máximo. Quanto a TCPKeepAlive yes- depende da máquina.
Syntagma
11
Basta usar mosh ?
Vi.
11
Ou você pode usar autossh...
ThoriumBR
Eu diria que deixar uma conexão aberta por 4 horas é uma preocupação de segurança, e você deve usá-lo screen. Mas ainda estou votando sua pergunta porque estou enfrentando o mesmo problema depois de apenas um ou dois minutos.
Dale Anderson

Respostas:

80

As alterações feitas /etc/ssh/ssh_confige /etc/ssh/sshd_configestão corretas, mas ainda não terão efeito.

Para que sua configuração funcione, faça estas alterações na configuração do cliente:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval O cliente enviará um pacote nulo ao servidor a cada 100 segundos para manter a conexão ativa

Pacote NULL É enviado pelo servidor para o cliente. O mesmo pacote é enviado pelo cliente para o servidor. Um pacote TCP NULL não contém nenhum sinalizador de controle como SYN, ACK, FIN etc. porque o servidor não requer uma resposta do cliente. O pacote NULL é descrito aqui: https://tools.ietf.org/html/rfc6592

Em seguida, configurando a parte sshd no servidor.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval O servidor aguardará 60 segundos antes de enviar um pacote nulo ao cliente para manter a conexão ativa

TCPKeepAlive Existe para garantir que determinados firewalls não descartem conexões inativas.

O ClientAliveCountMax Server enviará mensagens ativas ao cliente, mesmo que não tenha recebido nenhuma mensagem do cliente.

Finalmente, reinicie o ssh server

service ssh restart ou service sshd restartdependendo do sistema em que você está.

Valentin Bajrami
fonte
Eu acho que ServerAliveCountMaxtambém é necessário um valor alto para que seja o mais confiável possível. E se ambos ServerAliveIntervale ClientAliveIntervalsão definidas baixa o suficiente, eu não acho que haverá qualquer necessidade de TCPKeepAlive. Além disso, se houver caixas intermediárias, elas ainda poderão perder o estado, mesmo com todas as configurações mencionadas anteriormente definidas exatamente corretas. Pode ser útil usar o MPTCP (se o cliente e o servidor suportarem).
Kasperd
Não está claro no início se você quer dizer configuração no lado do cliente ou no servidor (eventualmente concluo, lado do cliente). Em seguida, na descrição ServerAliveInterval , você diz "o cliente enviará ... para o servidor", mas no próximo parágrafo "o pacote NULL é enviado pelo servidor para o cliente". Acho isso um pouco confuso.
Craig McQueen
11
Depois de adicionar ao servidor eu recebo: / etc / ssh / ssh_config: Linha 57: opção de configuração Bad: clientaliveinterval / etc / ssh / ssh_config: Linha 59: opção de configuração Bad: clientalivecountmax
Anders
2
@Anders Você recebe o erro porque ClientAliveIntervale ClientAliveCountMaxsão opções servidor SSH, assim significou para sshd_confige nãossh_config
Valentin Bajrami
11
@chandresh você não precisa. Após a modificação, ssh_configas novas sessões lerão esse arquivo. O /etc/environmentarquivo é uma coisa diferente que tem o formato VAR="value" sem espaços, portanto, VAR = "value"seria inválido. A fonte /etc/ssh/ssh_configdessa maneira lerá: Port 22ou Host * será tratada como comandos
Valentin Bajrami 14/08
13

Sugestão pessoal: uso screenno host remoto; ele conseguirá manter sua conexão ativa enquanto permanecer ativa em um terminal.

Aqui está o que eu normalmente adiciono /etc/screenrcpara identificar rapidamente minhas sessões de tela:

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

EDIT: Dicas.

A hardstatussequência mostrará uma linha de status inferior como esta: Exemplo de sessão de tela com três guias abertas

O buffer de rolagem também é estendido para 8192 linhas, em vez das habituais 1000-1500 (dependendo da distribuição).


fonte
Obrigado, duas perguntas: 1. Você pode explicar as opções no seu screenrcarquivo? Como configuro o sistema na tela de inicialização / tmux logo após o login?
Syntagma
8
Apenas para esclarecer, screennão mantém sua conexão ssh viva. Ele executa processos em um terminal virtual independente do terminal do usuário ao qual você se conecta, para sshque o processo não dependa da sua conexão. Você ainda perderá sua sshconexão até que ela seja resolvida.
Iyrin
11
Por " manter a conexão ativa ", quero dizer essencialmente " impede que a conexão ocorra ", que tem o mesmo resultado. Se não houver entrada por 4 horas, o SSH ficará ocioso e, eventualmente, fechará a conexão, todos os processos filhos também desapareceram.
2
Por mais que eu amei screen, aconselho novos usuários para começar tmux.
Dotancohen
2

Com o OpenSSH:

Você precisa habilitar

TCPKeepAlive yes

no seu cliente ssh_config (por exemplo, /etc/ssh/ssh_configou in ~/.ssh/config) e no servidor SSH de destino executando o OpenSSH (por exemplo, / etc / ssh / sshd_config).

Assim, toda vez que sua conexão fica ociosa, o OpenSSH envia alguns pacotes fictícios para o host de destino ...

Martin Allert
fonte
Isso também pode fazer com que a conexão fique The default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. inativa linux.die.net/man/5/sshd_config
iyrin
Honestamente, mas "[…] network goes down […] client host crashes […] route is down […]"são erros graves que nenhuma configuração SSH pode capturar. O principal problema aqui são as sessões SSH ociosas, não as falhas de rede. Portanto, para resumir: - ative TCPKeepAlive yesno servidor e no cliente. - definido ClientAliveInterval no servidor - definir IdleTimeoutno servidor - definir ClientAliveCountMax Isso deve fazer o truque ...
Martin Allert
2

Se o problema for um laptop hibernado ou uma conexão de rede menos que perfeita, eu recomendo usar o moshque atropela sshe permite a reconexão automática.

No site :

Mosh (shell móvel)

Aplicativo de terminal remoto que permite roaming, suporta conectividade intermitente e fornece eco local inteligente e edição de linha das teclas do usuário.

Mosh é um substituto para o SSH. É mais robusto e ágil, especialmente através de links Wi-Fi, celular e de longa distância.

Mosh é um software gratuito, disponível para GNU / Linux, BSD, macOS, Solaris, Android, Chrome e iOS.

Em combinação com tmux(ou mais antigo screen), isso me permite conectar via sshservidor a um servidor do meu laptop e permanecer conectado por dias, mesmo ao alterar as conexões Wi-Fi e sobreviver a desistências de dados móveis.

Tom Hale
fonte
Aqui está um link para mosh.org e para mosh no Github
joeytwiddle
1

Verifique a sua configuração sshd na máquina host /etc/sshd_configpara a IdleTimeoutconfiguração .

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
iyrin
fonte