Supongamos la siguiente situación: estás en casa y quieres conectar por ssh con el Linux de tu oficina (destino). Problema: el firewall de la oficina bloquea las conexiones entrantes. Desde el pc de la oficina puedes conectar hacia el exterior, y en concreto tienes acceso ssh a una máquina intermedia. Desde casa tienes acceso a la misma máquina intermedia, también por ssh. Bien, aquí es donde entra en juego los túneles ssh inversos.
Desde la máquina destino (lógicamente tendrás que hacerlo antes de irte de la oficina, o bien que alguien que ya esté en la oficina lo haga, o bien un proceso cron…)
user@destino$ ssh -R 10000:localhost:22 usuariointermedio@maquinaintermedia
Es decir, desde destino, abrir una conexión ssh contra la máquina intermedia. Al conectar, crear un túnel inverso de tal forma que el puerto 10.000 de la máquina intermedia conecte con el puerto 22 de la máquina destino.
Desde casa:
user@casa $ ssh usuariodestino@maquinaintermedia -p 10000
Es decir, conectar desde casa al puerto 10.000 de la máquina intermedia (con credenciales de la máquina destino). Si todo va bien, se nos abrirá una conexión ssh contra el Linux de la oficina , pasando como trampolín o pasarela por la máquina intermedia.
Para rematar, si quieres evitar problemas de desconexión por timeout, modifica el fichero de configuración ssh /etc/ssh/sshd_config para que incluya las siguientes líneas:
TCPKeepAlive yes
ClientAliveInterval 30
ClientAliveCountMax 99999
Nota: si la última orden ssh te dice algo como «Connection refused» haz lo siguiente: conecta normal por ssh (al puerto 22) desde casa a la máquina intermedia. Una vez ahí, lanza la siguiente orden:
$ ssh usuariodestino@localhost -p 10000
¡Listo! Hoy, leer en el wiki de Gentoo sobre cómo se hacen túneles inversos por ssh contra máquinas protegidas por un firewall me ha salvado de hacer un viaje de unas cuantas horas… Espero que os venga igual de bien a vosotros, lectores de diariolinux.com. Y recuerda que no es la primera vez que hablamos de las maravillas de ssh.