Túnel SSH for dummies: Una explicación sencilla

Recientemente uno de mis usuarios me solicitó un script para realizar un túnel SSH desde su casa a través de un servidor “pasarela” para acceder a los servidores internos. Cabe destacar que todos nuestros usuarios son “avanzados”, la mayoría son desarrolladores y se mueven con soltura en entornos linux. Sin embargo el tema de los túneles les trae de cabeza. Tanto que solicitan un script cuando tan solo tendrían que ejecutar una línea. De modo que me he decidido a escribir esta entrada para clarificar que es un túnel SSH, que tipos hay y cómo debemos usarlos.
He indagado en varios sitios y en ninguno he logrado encontrar una explicacion facil, de modo que intentaré explicarlo con mis propias palabra y evitando aspectos demasiado técnicos. Esto, como siempre, puede suponer que no todo lo que diga sea técnicamente exacto, pero creo que vale la pena en pro de la claridad.

¿Qué es un túnel SSH?

Para explicar esto, vamos a imaginar una tubería. Este es mi tunel SSH. La tubería lo que hace es unir un origen y un destino para transportar cosas. Dentro de esta tubería podemos transportar agua, gas, petróleo o gazpacho. Aparte de eso, la tubería impide ver a gente que pase por allí que transportamos. Pues bien, el elemento que transportamos sería el protocolo que vamos a usar dentro del túnel SSH(esto ya lo aclararemos después) como puede ser http o ftp. La capacidad de no ver lo que hay en el interior se refiere a que los datos que viajan a través del túnel SSH siempre van cifrados (por el propio SSH)

Muy bien, ¿Y esto para qué vale?

Existen varios tipos de túneles (que veremos más adelante) pero generalmente se usan por dos motivos:

  • Conectarse a redes inaccesibles directamente a través de un host (llamado gateway) que si tiene acceso a la red.
  • Cifrar el tráfico para conectar a redes no confiables

Vamos a ver los tipos de túneles y explicaremos esto de arriba un poco más.

Local Port (-L)

Este es el caso más típico. Tenemos nuestra maquina y queremos acceder a www.wikileaks.com, pero como vivimos en china, nos tienen prohibido el acceso. Sin embargo, tenemos un amigo en Amsterdam que tiene un servidor SSH que si accede a wikileaks. Podríamos usar su máquina como pasarela o gateway para acceder a wikileaks.
Aquí viene donde yo creo que existe el mayor problema para entender los túneles: la sintaxis del comando:
ssh -L [bind_address:]port:host:hostport user@hostname
donde

  • bind_address Generalmente se puede obviar. Es por si en tu equipo tienes varias IP, para especificar cuál queremos usar
  • port Puerto local que pondremos a un extremo del túnel SSH(donde vamos a colocar la entrada de la tubería)
  • host Host remoto al que queremos acceder
  • port Puerto del host remoto al que queremos acceder (extremo de salida de la tubería)
  • user Usuario para conectar al gateway
  • hostname Host que hará de pasarela o gateway

Bueno, pues ya está claro. Supongamos que la maquina de mi amigo es maquinaAmigo.com. Y elegimos un puerto de nuestra máquina, elegiremos el 1234 (podemos elegir el que queramos, si es menor del 1024 nos pedirá privilegios de root). Además, a wikileaks se accede por https, por lo que el puerto sería el 443. De modo que nuestro comando se quedaria asi:

ssh -L 1234:www.youtube.com:443 myuser@maquinaamigo.com

La traduccion seria: cuando se solicite algo a mi puerto 1234 conecta a youtube.com por el puerto 443 usando maquinaamigo como pasarela.
Una vez que ejecutemos esto nos pedirá una contraseña para acceder al equipo. Os muestro un ejemplo en mi equipo tapando los datos comprometedores.

Una vez realizado, podremos acceder al puerto local que hemos abierto y veremos la página de wikileaks:
Acceso a wikileaks a traves de tunel SSH

Vamos a ver otro supuesto. Típico caso, queremos conectar a una bbdd de un servidor remoto que solo permite el acceso desde localhost. Buenos, pues especificamos que el equipo de destino al que se debe conectar el gateway es localhost (él mismo). De tal manera que haremos:

ssh -L 3306:localhost:3306 root@servidorBBDD

Como veis, aquí está el problema para entender los túneles, que pueden usarse para muchas cosas y localhost no siempre significa necesariamente nuestra máquina

Remote Port (-R)

Esta es un poco más enrevesada de entender. En principio, vamos a olvidar nuestra máquina local, esta no interviene para nada salvo para ejecutar el comando. La sintaxis es similar a la anterior:

ssh -L [bind_address:]port:host:hostport user@hostname

Y la traducción sería: Abre el puerto port en hostname y todo lo que llegue lo redirige al hostport de host. Fácil, ¿no?. Pero, ¿qué pasa si en host ponemos nuestro equipo?

ssh -L 1234:localhost:80 myuser@maquinaamigo.com

En este caso, cualquier persona que abra el navegador con http://maquinaamigo.com:1234 podra ver una web publicada en mi propio equipo. Ideal para mostrar una página en desarrollo a un jefe, pedir ayuda remota a un amigo o cualquier cosa que se te ocurra.

Dynamic (-D)

Se lo que estáis pensando y para que quereis usarlo todos. Supongamos que estamos en nuestra empresa y el acceso a internet está restringido por un proxy, firewall o lo que sea. Sin embargo, tenemos acceso a un servidor que si tiene acceso a internet sin restricciones. Con lo que sabemos hasta ahora, cada web que queramos visitar requeriría de hacer un túnel SSH de tipo local.
Bueno, aqui viene nuestra amigo el túnel SSH dinámico. Simplemente abre un puerto en nuestra máquina, lo conecta con el servidor de ssh y este abre túneles contra todo lo que le solicitemos.
Para nuestro ejemplo práctico, lo primero es crear el túnel SSH:
ssh -D [bind_address:]port user@hostname
Esta vez no explico nada

Los parámetros fN son para que deje la conexión contra el gateway en background en vez de entrar a la máquina.

Una vez levantado el túnel SSH, abrimos nuestro navegador favorito y configuramos un proxy tipo SOCKS en el puerto que hemos levantado:

Y listo, ya podemos navegar sin ningún tipo de restricción.

Conclusión

Los túneles son muy usados en seguridad tanto para abrir túneles remotos como para hacer pivoting. El pivoting consiste en usar una máquina comprometida como pivote (o gateway) para acceder al resto de la red interna. Es complicado dominarlos pero según te vayas haciendo con ellos, mas utilidades les encontrarás

Espero que lo hayáis entendido bien. Se que es denso y difícil de entender, pero con que os sirva como referencia para empezar a jugar me doy por satisfecho.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.