El escenario es el siguiente. Tenemos un equipo remoto C detrás de un cortafuegos, router o similar, que no podemos configurar y no permite conexiones entrantes, de tal manera que el equipo es inaccesible desde el exterior de la red en la que está. Otro equipo A, el nuestro, también está detrás de un cortafuegos, en otra red, que tampoco podemos configurar y tampoco permite conexiones entrantes. La buena noticia es que tenemos un servidor remoto B en otra red diferente al que sí tenemos acceso por SSH desde el equipo remoto C y desde el nuestro (el A). Tanto el equipo remoto C como el servidor B tienen un servidor SSH corriendo.
Una posible solución es abrir un túnel inverso del equipo C al servidor B, entonces desde nuestro equipo (el A) conectarnos al servidor B y de ahí al equipo remoto C.
El siguiente comando abre un túnel inverso desde el equipo C al servidor B, de tal manera que en el servidor B en el puerto 8000 se podrá iniciar una conexión que será redirigida al servidor SSH del equipo C:
remoteC$ ssh -f -N -R 8000:localhost:22 userB@remoteB # remoteC:22 ---> remoteB:8000
hostA$ ssh userB@remoteB
remoteB$ ssh -p8000 userC@localhost
Estas dos últimas acciones se pueden combinar en una sola si utilizamos
el argumento -t
para utilizar el servidor SSH de B como servidor
intermedio para acceder a C (a través de la redirección en el propio
servidor B):
remoteC$ ssh -f -N -R 8000:localhost:22 userB@remoteB # remoteC:22 ---> remoteB:8000
hostA$ ssh -t userB@remoteB ssh -p8000 localhost
Otra forma es abrir un túnel desde nuestro equipo creando una redirección local al puerto del servidor B en el cual se ha creado, previamente, el túnel inverso al equipo remoto C. De esta forma bastará conectarnos a nuestro propio equipo para tener acceso al equipo remoto C:
remoteC$ ssh -f -N -R 8000:localhost:22 userB@remoteB # remoteC:22 ---> remoteB:8000
hostA$ ssh -f -N -L 8001:localhost:8000 userB@remoteB # remoteB:8000 ---> hostA:8001
hostA$ ssh -p8000 userC@localhost
Sería mejor que los usuarios para conectarnos al servidor B desde el equipo remoto C y desde el nuestro fuesen distintos:
remoteC$ ssh -f -N -R 8000:localhost:22 user_1B@remoteB # remoteC:22 ---> remoteB:8000
hostA$ ssh -f -N -L 8001:localhost:8000 user_2B@remoteB # hostA:8001 < -- remoteB:8000
hostA$ ssh -p8000 userC@localhost
Como último comentario, si vamos a utilizar este sistema para administrar equipos remotos, quizá sería interesante utilizar algún sistema de contraseñas de un solo uso en el servidor.