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:
- Verifique o processo ssh filho (
check on child ...
) - Verifique o ponto final !!! (uma operação semelhante a ping através do túnel)
- Perceba que o túnel está inoperante
- Pare o processo ssh
- Tente criar o túnel novamente
- 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
fonte
dev tun
em ambos e definindoremote
na 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.Respostas:
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
ClientAliveInterval
in/etc/ssh/sshd_config
no servidor (consulteman 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ósClientAliveInterval * ClientAliveCountMax
segundos (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 * ServerAliveCountMax
segundos. 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
ExitOnForwardFailure
opção no lado do cliente (consulteman 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.fonte
-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