autossh não mata ssh quando link inativo

10

Comecei minha autossh witt com um tempo de pesquisa de 30 s:

AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1

E está funcionando bem:

Sep  5 12:26:44 serverA autossh[20935]: check on child 23084
Sep  5 12:26:44 serverA autossh[20935]: set alarm for 30 secs

Mas se eu remover fisicamente o cabo de rede, o que significa que o túnel não pode mais funcionar, o autossh não mata o daemon ssh. Por quê? Entendo que o autossh não pode fazer nada se o link estiver inativo, mas, na minha opinião, ele deve tentar fazer o seguinte:

  1. Verifique o processo ssh filho ( check on child ...)
  2. Verifique o ponto final !!! (uma operação semelhante a ping através do túnel)
  3. Perceba que o túnel está inoperante
  4. Pare o processo ssh
  5. Tente criar o túnel novamente
  6. Perceba que não funciona e configure um cronômetro (aumentando exponencialmente?) Para verificar novamente em breve

É por isso que estou executando o autossh: se algo acontecer com o túnel (seja um problema de software ou hardware), ele deverá tentar reiniciá-lo. Em vez disso, está apenas esperando o processo ssh morrer. Não deveria estar tentando reiniciá-lo, mesmo que não haja esperança de restabelecer a conexão?

Que tipo de verificação está fazendo autossh? Apenas verifique se o ssh está funcionando? Não está fazendo nenhum tipo de verificação remota?

Editar

Conforme solicitado, adiciono a parte relevante da configuração do ssh:

# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
#   that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
#   be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
#   be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can tweak those
#   specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60

TCPKeepAlive yes
dangonfast
fonte
que tal tentar reduzir o tempo limite?
Nikolaidis Fotis
Usamos o autossh por um tempo, mas não era muito confiável em conexões inadequadas, principalmente quando combinadas com encaminhamentos de portas. Agora usamos o OpenVPN e estamos muito felizes com isso.
Nils Toedtmann 9/09/14
@ NikolaidisFotis: o tempo limite está bom. É ... o tempo limite. Mas ele não faz a coisa certa (imho) sempre que o tempo limite se inicia, a saber: verificar o extremo !
dangonfast
@ NilsToedtmann: obrigado, vou tentar. É fácil de implementar? Você tem algum link para um bom tutorial?
dangonfast
O OpenVPN é bem direto, nós apenas o 'apt-get install' o instalamos e começamos com as configurações padrão para servidor ou cliente, usando dev tunem ambos e definindo remotena configuração do cliente. O único bit irritante é gerenciar os certificados. Usamos a CA 'easy-rsa' que acompanha o OpenVPN. Depois de ter os certificados, o resto é fácil.
Nils Toedtmann 9/09/14

Respostas:

11

Mas se eu remover fisicamente o cabo de rede, o que significa que o túnel não pode mais funcionar, o autossh não mata o daemon ssh. Por quê?

O autossh é executado na máquina cliente, portanto, não pode matar diretamente o processo do daemon ssh no servidor. No entanto, você pode especificar um valor diferente de zero para ClientAliveIntervalin /etc/ssh/sshd_configno servidor (consulte man sshd_config) e reiniciar o serviço sshd no servidor para aplicar a alteração na configuração. Em seguida, no caso de uma desconexão da rede, o processo ssh daemon será interrompido após ClientAliveInterval * ClientAliveCountMaxsegundos (mas não por autossh).

Agora, se você quis perguntar "Por que a autossh não mata o processo do cliente ssh?" , você especificou -M 0. Na página do manual autossh:

Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit.

Em vez de usar o autossh para monitorar a conexão, você está esperando o ssh sair após um tempo limite de ServerAliveCountInterval * ServerAliveCountMaxsegundos. Você solicitou 60 verificações ativas do servidor antes da saída do ssh, com um intervalo de 60 segundos separando as verificações consecutivas; portanto, você estará aguardando uma hora antes da saída do seu cliente ssh.

Você também pode considerar usar a ExitOnForwardFailureopção no lado do cliente (consulte man ssh_config), para que o ssh saia se não puder estabelecer um túnel e, em seguida, o autossh poderá tentar iniciar o ssh novamente.

James W
fonte
Obrigado, isso faz sentido. Eu realmente quis dizer "processo do cliente", não processo do servidor.
dangonfast
E depois de reler a página de manual do autossh agora, lembro-me por que defini -M 0: não é fácil usar uma porta de monitoramento e é indiretamente desencorajada: de muitas maneiras, essa pode ser uma solução melhor que a porta de monitoramento
dangonfast