Encaminhamento de porta reversa estável em sessões SSH e obsoletas

6

Usando o VPS para encaminhar portas por trás do NAT:

for((;;)) { ssh -R 2222:127.0.0.1:22 [email protected]; sleep 10; }

Quando a conexão é interrompida de alguma forma e está se reconectando.

Warning: remote port forwarding failed for listen port 2222
Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686

eu digito:

vi@vi-server:~$ killall sshd
Connection to vi-server.org closed by remote host.
Connection to vi-server.org closed.
Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686
vi@vi-server:~$ 

Agora está tudo bem.

Como é mais simples tornar isso automático?

    
por Vi. 19.02.2010 / 21:13

3 respostas

1

Parece que AutoSSH é a coisa certa para isso.

Autossh is a program to start a copy of SSH and monitor it, restarting it as necessary should it die or stop passing traffic. The original idea and the mechanism were inspired by RSTunnel (Reliable SSH Tunnel).

With version 1.2 the method changed: autossh began to use SSH to construct a loop of SSH forwardings (one from the local machine to the remote, and one from the remote to the local), and then send test data that it expects to get back. (The idea was thanks to Terrence Martin.)

With version 1.3, a new method was added (thanks to Ron Yorston): a port may be specified for a remote echo service that will echo back the test data. This avoids the congestion and the aggravation of making sure all the port numbers on the remote machine do not collide. The loop-of-forwardings method remains available for situations where using an echo service may not be possible.

Features

  • autossh is a program to start a copy of ssh and monitor it, restarting it as necessary should it die or stop passing traffic. The idea is from rstunnel (Reliable SSH Tunnel), but implemented in C.
  • The author's view is that it is not as fiddly as rstunnel to get to work.
  • Connection monitoring using a loop of port forwardings or a remote echo service.
  • Backs off on rate of connection attempts when experiencing rapid failures such as connection refused.
  • Compiled and tested on OpenBSD, Linux, Solaris, Mac OS X, Cygwin, and AIX; should work on other BSDs.
  • Freeware.
    
por 10.03.2010 / 22:48
8

Acho que você tomou o lado errado: no seu caso, sshd (do lado do servidor) está provavelmente não está falhando nem tendo sessões obsoletas , portanto, matá-lo não deve ajudá-lo além do efeito colateral de parar praticamente qualquer conexão do cliente ssh conectado.

É o cliente ssh que não encerra a conexão após falha ao construir o mecanismo de encaminhamento de porta. E esse comportamento não é um bug.

Você precisa olhar a opção ExitOnForwardFailure no manual do ssh.

Seu script seria:

  for((;;)) { ssh -R 2222:127.0.0.1:22 [email protected] -o ExitOnForwardFailure=yes; sleep 10; }

Além disso, convém apertar ServerAliveInterval e ServerAliveCountMax para o cliente detectar detecções mais cedo. (E você deve garantir que TCPKeepAlive seja on , que é o valor padrão). Observe que autossh não ajudará muito mais se você tiver definido essas opções.

    
por 24.10.2011 / 13:32
2

Eu vejo que já existe uma boa resposta referindo-se a um software existente (autossh) que automaticamente mantém o encaminhamento de porta reversa através do ssh.

Eu ainda quero compartilhar meu próprio pequeno script bash fazendo a mesma coisa e é trivial para configurar.

#!/bin/bash

while true
do
  START=$(date +%s)
  ssh -NR rport:host:lport -o ServerAliveInterval=10 -o ExitOnForwardFailure=yes user@host
  END=$(date +%s)
  DIFF=$(( $END - $START ))
  if (( $DIFF < 3 ))
  then
    sleep 60
  fi
done

Se o encaminhamento falhar repetidamente, será suficiente tentar novamente uma vez por minuto, se a conexão falhar depois que ele estiver ativo por um tempo, ele tentará novamente imediatamente.

Eu uso no archlinux com o systemd (escrevi um pequeno arquivo .service) e funciona como um encanto.

    
por 29.01.2013 / 13:10