Cómo crear un túnel SSH en Linux

Los túneles SSH o reenvío de puertos vía SSH, que quizás técnicamente es más correcto llamarlo así, consiguen que todas las conexiones que tengamos con un host remoto estén protegidas vía cifrado. Esto crea algo similar a lo que sería una VPN. Ideal para conectarnos desde redes poco seguras, como las públicas, a Internet.

Las sesiones que creemos con SSH, vía reenvío de puertos, se pueden clasificar de tres maneras, esto es, reenvío de los puertos locales, los remotos o bien los dinámicos.

Imagen de Peter H en Pixabay

Ejemplos de uso del reenvío de puertos vía SSH

Primero de todo veamos el entorno de pruebas. Mi host local, que en este caso es un Linux Mint, con IP 192.168.0.25, y me voy a conectar a un VPS remoto, que tengo en mi proveedor de confianza Clouding.io, con nombre servtest.bitsandlinux.com

Reenvío de puerto local vía SSH

Este tipo de reenvío de puertos nos permite conectarnos desde nuestro host a un servidor remoto. Esto nos irá bien si estamos detras de un cortafuegos restrictivo y queremos acceder al puerto 8080, que utiliza TOMCAT, del servidor remoto, pero no podemos.

En este ejemplo vamos a utilizar el puerto local 8081 para el reenvío. El parámetro «-L» se utiliza para definir el puerto a reenviar al host remoto.

Un ejemplo:

ssh root@servtest -L 8081:servtest:8080

Si añadimos el parámetro «-N«, indicamos que no ejecute el comando de forma remota. De esta manera no obtendremos nincuna consola.

ssh -N root@servtest -L 8081:servtest:8080

Si añadimos el parámetro «-f«, indicamos a SSH que se ejecute en segundo plano.

ssh -N -f root@servtest -L 8081:servtest:8080

Si todo ha ido bien, ya tendríamos que acceder al servidor TOMCAT remoto, por el puerto 8081 local.

Accedemos al puerto al puerto remoto desde puerto local

Ojo aquí, al dejar el proceso en segundo plano lo tendremos que «matar» con el comando kill, cuando ya no lo necesitemos.

Reenvío de puertos SSH remotos

El reenvío de puertos remotos nos permite conectarnos desde nuestra máquina remota a nuestra equipo local. De forma predeterminada, SSH no permite el reenvío de puertos remotos. Podemos habilitar esto usando la directiva «GatewayPorts» en al archivo de configuración /etc/ssh/sshd_config en el host remoto.

Si utilizamos a nuestro editor favorito:

sudo vi /etc/ssh/sshd_config

Buscamos la línea de GatewayPorts y la cambiamos por yes.

GatewayPorts yes

Tal y como se muestra en la imagen:

Habilitamos el reenvío de puertos

Guardamos y salimos.

Para que se apliquen los cambios debemos reiniciar SSH, así:

sudo systemctl restart sshd

Ahora ya podemos enviar un puerto local, por ejemplo el 80, donde tengo funcionando un servidor Apache, al 82 del host remoto.

Para ello utilizamos el parámetro «-R«, de esta manera:

ssh -N -f root@servtest -R 82:localhost:80

Con este parámetro especificamos que las conexiones al puerto TCP dado o al socket UNIX en el host remoto deben reenviarse al lado local.

Para muestra un botón:

Accedemos al servidor web local desde el host remoto

Esto me parece una idea genial y muy útil. Ya que podemos exponer servicio que tengamos en servidores locales a un host remoto, y así poder acceder a ellos de forma fácil. Veáse una Wiki que tengamos en local, el acceso a un NAS doméstico y mucho más.

Reenvío de puertos SSH dinámico

A diferencia de los dos casos anteriores, que utilizaban un único puerto, este método, el dinámico, hace posible una gama mucho más amplía de vías comunicación TCP a través de un número dado de puertos. El reenvío de puertos dinámico configura la máquina indicada como un servidor proxy SOCKS, que escucha por el puerto 1080, de forma predeterminada.

Para que entendamos todos el concepto de SOCKS, se trata de un protocolo de Internet que define cómo un cliente puede conectarse a un servidor a través de un servidor proxy, aunque en nuestro caso sería un servidor SSH. Para habilitar esta opción debemos utilizar el parámetro «-D«.

Veamos un ejemplo:

ssh -f -N -D 1080 root@servtest

De esta forma podemos hacer que las aplicaciones en nuestra máquina usen este servidor proxy SSH editando sus configuraciones e indicando que lo deben usar. Eso, al cerrar la sesión SSH, este servidor dejará de estar operativo.

Resumen

Hemos visto diferentes maneras de crear y utilizar los llamados túneles SSH, que no dejan de ser una redirección de puertos entre dos hosts, de forma cifrada. Creo que es una excelente oportunidad, para poder habilitar el acceso a servicios que tengamos en nuestra RaspberryPi de turno, sin tener que utilizar servicios de terceros.

Fuentes consultadas

Página de man de SSH

Tecmint.com – How to Create SSH Tunneling or Port Forwarding in Linux