Un túnel SSH es una técnica que te permite encaminar un determinado tráfico a través de una conexión SSH. Por ejemplo, supón que conectas a un servicio de ficheros remoto mediante FTP. Todo el tráfico entre el cliente y el servidor viajará sin estar cifrado, por lo que estaríamos expuestos a un ataque Man-in-the-middle, en el que un atacante con acceso a nuestra conexión podría interceptar todos los paquetes para su consulta o modificación. Si enrutaramos todo este tráfico mediante un túnel SSH, evitaríamos estos problemas, asegurándonos un tráfico seguro añadiendo la capa SSH. De hecho, es común utilizar FTP sobre SSH (no confundir con SFTP, que es un protocolo distinto).

Sin embargo, esta técnica tiene más utilidades, que es la que a mí personalmente más práctica me resulta. Supón que te dan acceso a un servicio remoto que sólo autoriza para conectar a una determinada IP. Si quisieras conectar a ese servicio desde una conexión de banda ancha convencional o desde la red 3G, tendrías un problema, ya que, salvo que lo hayas contratado explícitamente, estarán asignando a tu conexión una IP dinámica. Si cada vez utilizas una IP, ¿cómo puedes entonces conectar al servicio? Utilizando un tercer servidor.

Muy posiblemente ya tengas acceso a un servidor remoto con una IP estática y al que tienes acceso SSH (por ejemplo, porque en él tienes alojada una página web). Podremos autorizar a este tercer servidor a ser el único al que se le permita acceder al servicio deseado. De esta forma, tendríamos tres equipos:

  1. Por un lado, el equipo #1, que es el cliente, el ordenador desde el que inicias la conexión a través de tu línea ADSL o 3G.
  2. Por otro lado, tenemos el equipo #2, que es el servidor web al que tienes acceso SSH. Host: example1.com.
  3. Y por último, el equipo #3, que es el que tiene el servicio que sólo autoriza a unas determinadas direcciones IPs. Host: example2.com. El puerto del servicio es, por ejemplo, el 1234.
Lo que haríamos sería indicar al administrador de #3 que añada la dirección IP de #2 como una IP autorizada. Entonces, podríamos iniciar un túnel SSH de #1 a #2, configurado para que redirija todo su tráfico a #3:
$ ssh usuario@example1.com -L 2222:example2.com:1234 -N

Es decir, primero conectamos mediante SSH al equipo #2 (example1.com). Por otra parte, el parámetro L indica que todo el tráfico que conecte al puerto 2222 del cliente (equipo #1) se redirigirá, mediante la conexión SSH del equipo #2 (example1.com), hasta el puerto 1234 del equipo #3 (example2.com). Por último, el parámetro -N es un modificador que se utiliza en túneles SSH para evitar que se ejecuten comandos en el equipo remoto (equipo #2).

Pulsamos INTRO, introducimos la constraseña de nuestro usuario de example1.com, y ya está. ¿Ahora qué? Si quisiéramos conectar al famoso servicio remoto del equipo #3, tan sólo deberíamos realizar la conexión a localhost:2222, y ya estaríamos dentro.

Espero que este truquito os sea de tanta utilidad como lo es para mí :)