¿Qué es un túnel SSH?
Un túnel SSH es una conexión SSH que transforma un puerto X en tu equipo, en el puerto Y de otra máquina, pasando por una tercera.
¿Se entiende?
Es probable que no, así que me explicaré con detalles.
Una conexión “tradicional”, es cuando quiero acceder a un cierto servicio en otra máquina, y me conecto directamente a ella. Tal como se muestra en la imagen a continuación.
Pero, ¿qué pasa cuando aún necesito conectarme a esa máquina, pero por alguna razón ya no puedo conectarme directamente?
En este caso, lo que se hace es usar un tunel SSH.
- Flechas Azules: Conexiones que si son posibles realizar.
- Flecha Verde: Túnel SSH. Conexión al otro equipo, pasando por el equipo que puede conectarse.
- Flecha Roja: Conexión en un puerto local, equivale a la conexión de la flecha roja de la imagen anterior.
¿Y como funciona?
$ ssh -L <puerto local>:<el otro equipo>:<puerto en el otro equipo> <equipo que puede conectarse> -l <usuario para el equipo que puede conectarse>
Por ejemplo, el servidor de Tareas (carretas.inf.utfsm.cl) del LabComp está restringido para ser accesado solo desde las IP’s del DI. Para conectarme a éste seria algo así como:
$ ssh -L 6666:carretas:22 ssh2.inf.utfsm.cl -l rcovarru
En el ejemplo, se podría haber omitido el -l rcovarru, ya que el usuario de mi equipo es exactamente igual.
Además, como ven, al nombre del servidor de tareas no se le agregó el dominio, eso es solo el equipo al que me estoy conectado (ssh2) también pertenece al mismo dominio.
Ok, pero ese comando extraño, ¿Qué hace?
Transforma el puerto 6666 de mi equipo, en el puerto 22 (puerto de ssh) de carretas.
Esto significa, que ahora me podré conectar “directamente” a carretas por el túnel, con:
$ ssh -p 6666 localhost -l usuario-en-carretas
Mientras que la conexión SSH esté viva, el túnel se mantendrá igual.
😉
Esto, funciona para cualquier tipo de puerto, no solo para comunicarse por ssh. Si quieren conectar, por ejemplo, al servidor postgresql de carretas, el tunel debería ser:
$ ssh -L 6666:carretas:5432 ssh2.inf.utfsm.cl -l rcovarru
Y luego, la conexión de psql deberia ser algo así como:
$ psql -p 6666 -h localhost dbname pguser
Lindo, no? 😀