¿Cómo puedo configurar una conexión SSH inversa a la computadora conectada?


20

Voy a implementar una serie de máquinas en el futuro cercano que estarán detrás de los enrutadores. No será factible configurar DNS dinámico en cada enrutador y reenvío de puertos, por lo tanto, ¿hay alguna manera de que pueda configurar estas máquinas para iniciar una conexión TCP a mi computadora y luego hacer que mi computadora inicie una conexión SSH a la computadora remota? esa conexión?

ES DECIR:

COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A

¿Es esto posible? Y si es así, ¿cómo puedo hacerlo?


Respuestas:


21

En el conjunto /etc/ssh/sshdde la computadora B :

AllowTcpForwarding yes
TCPKeepAlive yes

Desde la computadora A :

$ ssh -R 2222:localhost:22 ip.of.computer.b

Desde la computadora B :

$ ssh localhost -p 2222

Tenga en cuenta que 2222 es un número arbitrario de puerto alto que elegí. Ese puerto en la computadora B se volverá a tunelizar a través de la conexión SSH inicializada en la computadora A al puerto 22. Si tiene varias máquinas, debe usar un puerto diferente para cada máquina.

Para su caso de uso, es probable que desee ejecutar esto desde un script para que pueda convertirlo en un demonio e intentar volver a conectarse periódicamente si se cae el enlace. Probablemente desee una cuenta especial con un shell de solo /bin/trueen la computadora B para manejar las conexiones entrantes. Luego puede configurar una sola tecla o varias teclas para cada máquina a las que se les permite "llamar a casa".

En el equipo A se puede encontrar el -n, -Ny -Topciones útiles para desconectarlo de entrada local (por lo que puede ejecutarse en segundo plano), no intente ejecutar cualquier comando a distancia, basta con abrir el túnel, y no crear un TTY.

La mayoría de los métodos normales para generar un demonio no funcionan muy bien con la configuración de un túnel de red como este. Un problema en la conectividad de la red haría que intentara derribar el muro para atravesarlo. Un simple bucle con un sueño para esperar debería ser suficiente. Diez minutos es un buen número porque no inunda la red y registra los archivos con intentos si hay un problema (como que la Computadora B está fuera de línea) pero aún así te devuelve razonablemente rápido si la conexión se cae.

#/bin/sh
while true; do
    sleep $((60*10))
    ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done

Un script como ese se puede ejecutar lanzado en el arranque /etc/rc.local. Su primer cambio para iniciar la sesión en la máquina empezará a unos diez minutos después de que el equipo A botas.


1
Agradable. Entonces, ¿básicamente haría que cada máquina remota haga un túnel del puerto SSH local a un puerto en la máquina local? Puede ser conveniente que cada máquina solo haga un túnel de la conexión a pedido. Es posible que pueda hacer que cada máquina abra una conexión HTTP de mantenimiento e inserte datos XML cuando quiera que intente una conexión inversa, para facilitar la administración (y no obstruir todos mis puertos;)). ¡Gracias!
Naftuli Kay

@TKKocheran: Hay bastantes puertos para elegir ... específicamente más de lo que tendrá kioscos. ¿Cómo es peor mantener abierto un túnel SSH que mantener abierta una conexión http?
Caleb

Supongo que tienes razón, podría hacer eso, pero luego tendría que asignar puertos a las máquinas y recordar cuál es cuál, mientras que la otra ruta se instanciaría perezosamente, es decir, solo crearía un túnel SSH cuando se me pidiera.
Naftuli Kay

1
@TKKocheran: Tendría que hacer el mapeo de cualquier manera, de lo contrario, incluso su instancia perezosa se toparía con situaciones en las que intentaran golpearse entre sí.
Caleb

1
No sé si es generalmente aplicable, pero mi configuración sshd ahora está /etc/ssh/sshd_config
activada
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.