autossh não mata ssh quando link down

9

Eu iniciei meu autossh 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, significando que o túnel não pode mais funcionar, o autossh não mata o daemon ssh. Por quê? Eu 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 a extremidade distante !!! (uma operação de ping pelo túnel)
  3. Perceba que o túnel está inativo
  4. Pare o processo ssh
  5. Tente criar o túnel novamente
  6. Perceba que isso não funciona e configure um cronômetro (exponencialmente crescente?) para verificar novamente em breve

É por isso que estou executando o autossh: se algo acontecer ao túnel (seja um problema de software ou hardware), ele deve tentar reiniciá-lo. Em vez disso, ele 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á ativo e funcionando? Não está fazendo nenhum tipo de verificação de ponta?

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
    
por dangonfast 05.09.2014 / 12:41

1 resposta

9

But if I physically remove the network cable, meaning the tunnel can not be working anymore, autossh does not kill the ssh daemon. Why?

O autossh é executado em sua 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 ClientAliveInterval em /etc/ssh/sshd_config no servidor (consulte man sshd_config ) e reiniciar o serviço sshd no servidor para aplicar a alteração de configuração. Em seguida, no caso de uma desconexão de rede, o processo do daemon ssh será eliminado após ClientAliveInterval * ClientAliveCountMax segundos (mas não por autossh).

Agora, se você quisesse perguntar "Por que o autossh não mata o processo do cliente ssh?" , você especificou -M 0 . Na página de manual do 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 que o ssh saia após um tempo limite de ServerAliveCountInterval * ServerAliveCountMax segundos. Você solicitou 60 verificações de servidor vivo antes de ssh, com um intervalo de 60 segundos separando as verificações consecutivas, então você estará esperando uma hora antes do seu cliente ssh sair.

Você também pode considerar usar a opção ExitOnForwardFailure no lado do cliente (veja man ssh_config ), para que o ssh seja encerrado se não puder estabelecer um túnel, e então o autossh pode tentar iniciar o ssh novamente.

    
por 06.10.2014 / 05:44