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.
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.
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:
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:
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
Tecmint.com – How to Create SSH Tunneling or Port Forwarding in Linux