Eu tenho um conjunto de problemas, todos combinados para criar um problema desagradável.
O fundo: Eu tenho um servidor atrás de um túnel reverso do firewall usando um VPS externo (vamos chamar o servidor "o servidor" e o VPS que está se conectando à "máquina do túnel"). O túnel SSH irá morrer aleatoriamente. Eu tenho um script no servidor para reconectar, mas infelizmente, o daemon SSHD na máquina de encapsulamento (rodando o CentOS 6.5) geralmente NÃO é desligado. Ele apenas fica aberto, o que significa que o túnel reverso não pode se ligar às portas.Eu configurei ClientAliveInterval como 15 e ClientAliveCountMax como 2 na máquina de encapsulamento para forçar o servidor a sair da escuta se passarem mais de 30 segundos. Às vezes funciona ... às vezes não. Em muitos casos, ele fica lá para sempre, escutando nas portas uma conexão que não está mais lá, e como ela não desiste das portas, o ssh não pode se ligar a elas.
Eu também tenho dois problemas secundários. Quando eu inevitavelmente obtenho Write failed: Broken pipe
no comando ssh no servidor, ele não tenta se reconectar. O SSH apenas fica lá esperando pela entrada. Da mesma forma, a mensagem Connection to xxx.xxx.xxx.xxx timed out while waiting to write
aparece algumas vezes. No cliente, eu tenho ServerAliveInterval em 15 e ServerAliveCountMax em 4, então ele aguarda 1 minuto antes de tentar se reconectar. Ainda assim, isso não é suficiente, já que essa mensagem pode fazer com que o SSH seja interrompido indefinidamente. Para avisos de falha de encaminhamento de porta remota, eu uso -o ExitOnForwardFailure=yes
para garantir que o SSH seja interrompido se receber um desses avisos, garantindo que meu script saiba sobre a falha e possa tentar novamente. Mas, para Write failed: Broken pipe
e outros, não consigo encontrar essa opção, e toda vez que um desses erros aparece, o SSH nunca morre e não é reiniciado.
Primeiro, o que acontece com o processo sshd não terminar quando a conexão é perdida e, segundo, como garantir que TODAS as desconexões ou avisos façam com que o SSH seja encerrado para garantir que ele possa se reconectar?
Além disso, sim, antes que alguém o mencione: eu tentei o autossh, e ele sofre dessas mesmas deficiências.
Tags ssh ssh-tunnel