Conexión ssh de fondo permanente para crear un túnel inverso: ¿cuál es la forma correcta?

41

Pregunta relacionada: iniciar la conexión ssh del servidor al cliente

La respuesta desde allí me ayudó mucho, este comando hace lo que necesito:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Entonces escribí el guión para volver a conectar todo el tiempo:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

Y lo agregó a la /etc/crontab. Pero descubrí que funciona si solo lo ejecuto "a mano" desde shell, pero si lo llama cron, ssh se conecta e inmediatamente termina. (Entonces, el script anterior se vuelve a conectar todo el tiempo)

De man ssh, descubrí que para las conexiones en segundo plano debería llamarlo con -nclave, pero no ayudó. Luego, solo busqué scripts similares y descubrí que funciona si llamo tail -f something, es decir, un comando "interminable", así que acabo de crear un archivo vacío /tmp/dummy_filey ahora mi comando ssh se ve así:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

¡Ahora funciona! Pero, esta solución parece un poco fea, además, realmente no entiendo las razones reales de ese comportamiento. Por casualidad, intenté llamar en bashlugar de tail -f(también bashme parece un comando "interminable"), pero no funciona.

Entonces, ¿alguien podría explicar este comportamiento, y cuál es la forma correcta de crear una conexión ssh en segundo plano para mantener el túnel ssh inverso?

Dmitry Frank
fuente
¿Qué pasa con el uso &al final de su comando ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker
Pero entonces mi whileciclo se ejecutará una y otra vez, comenzando una nueva sshconexión de fondo cada 5 segundos, ¿verdad? Esto no es lo que necesito.
Dmitry Frank

Respuestas:

37

Parece que quieres la -Nopción de ssh.

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).
Patricio
fuente
16

Te sugiero encarecidamente que lo consideres autossh. Tiene ciertas heurísticas que le permitirán determinar si la pérdida de conexión es la razón subyacente y disminuirá la frecuencia de los intentos de reconexión. Además, monitorea la conexión mediante túneles adicionales, lo que lo hace muy útil para escenarios como el que está preguntando.

Si está en Ubuntu, por ejemplo, puede hacer una búsqueda en la web para autossh upstartencontrar algunos ejemplos útiles sobre cómo configurar Ubuntu para que el túnel se mantenga de manera persistente.

Estoy usando esto para mantener una conexión tunelizada abierta a mi servidor en todo momento para ciertos servicios.

0xC0000022L
fuente
En realidad lo intenté autossh, leí este artículo: goo.gl/jVuuSR , pero solo funcionó para mí si tengo conexión a Internet de inmediato en el arranque del sistema; pero si la conexión se establece más tarde, no funcionó. No estoy seguro, tal vez hice algo mal, pero incluso en este artículo el autor tiene sleep 10en el suyo /etc/rc.local, para asegurarse de que la conexión a Internet ya esté lista cuando se llama a autossh.
Dmitry Frank
2
@DmitryFrank: es injusto no mencionar eso en su pregunta, si lo ha intentado. Todavía lo recomiendo Con upstarty otros reemplazos de inicio, puede vincular el inicio del túnel a uno o más dispositivos de red en funcionamiento. La mejor de las soluciones (IMO) en la web es esta: erik.torgesta.com/tag/ssh-upstart ... y de sleep 10todos modos no ayudará nada en algunos casos extremos.
0xC0000022L
Lamento no mencionar eso, para ser sincero, cuando no funcionó para mí, decidí hacerlo "a mano" y me olvidé por completo de autossh. ¡Gracias por ssh-upstartecharle un vistazo!
Dmitry Frank
tarde a la fiesta, pero quería agregar que no podía obtener autossh de manera confiable para mantener un túnel inverso. si el túnel inverso fallara por alguna razón, autossh no se daría cuenta y no reconstruiría la conexión. Necesito múltiples túneles desde múltiples servidores y esto complica las cosas
DeveloperChris
@DeveloperChris: Bueno, estoy ejecutando exactamente este escenario, y de manera confiable. A menos que el servidor remoto se caiga literalmente y necesite volver a encenderlo, el túnel siempre se restablece. Quizás debería escribir su propia pregunta y proporcionar detalles. Ciertamente esto se puede hacer. He usado esto para solucionar problemas de VPN durante meses.
0xC0000022L
9

Voy a segunda @ sugerencia de 0xC0000022L y el uso autosshtambién. Lo uso para mantener una conexión SSH desde mi computadora portátil mientras la llevo de un lugar a otro y simplemente funciona. Utilizo esta conexión para hacer un túnel en los puertos 25 y 2143 para acceder a mis servidores personales SMTP e IMAP.

Aquí está el script que uso:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

Luego mantengo una Hostentrada en mi $HOME/.ssh/configarchivo para host imap-o.

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh [email protected] nc `echo %h|sed 's/-o//'` %p

El autossh_mail.shscript se ejecuta como parte de mi escritorio cuando inicio sesión. Puede acceder a través de gnome-session-properties.

       ss # 1

                                          ss # 2

slm
fuente