Uno de los muchos usos que tiene SSH es el de redirigir puertos, una característica que te permite crear un túnel entre tu cliente SSH y el servidor al que te estés conectando, para que el tráfico que entre por uno de los extremos se reenvíe desde el otro, y a la vez el tráfico que reciba tu servidor te lo traiga a ti.
Entre los usos que tiene esto: podrías usar tu servidor como intermediario al hacer una conexión de red. Imagina que hay otro servidor en internet que tiene un firewall configurado para que sólo se pueda entrar desde la IP de tu servidor (o incluso, imagina que tienes un servicio en tu servidor que sólo se puede acceder desde localhost). Aunque localmente desde tu ordenador no vas a poder conectarte a él, si montas una redirección de puertos al conectarte a tu servidor, podrías usarlo de intermediario y entonces conectarte a ese servicio.
Cómo montar un port forwarding local
Cuando lo configuras en modo local, al conectarte por SSH al servidor se habilita un puerto en tu máquina personal (o sea, localhost
), que cuando recibe tráfico lo manda al servidor y lo desvía como le digas.
Para hacerlo, incluye el parámetro -L
cuando te conectes al servidor, usándolo del siguiente modo: -L [puerto origen]:[IP / hostname de destino]:[puerto destino]
. La sintaxis se explica del siguiente modo:
- En
[puerto origen]
estableces qué puerto de tu ordenador es el que quieres usar para interactuar con él localmente. Este es el puerto al que, cuando te conectes desde tu ordenador, se mandará tu tráfico al servidor para reenviarlo desde ahí. - En
[IP / hostname de destino]
especificas dónde quieres que tu servidor envíe el tráfico que le venga desde tu ordenador una vez le llegue. - Y en
[puerto destino]
especificas el puerto al que se tiene que conectar tu servidor.
Te pongo un ejemplo. Si me conecto a mi servidor del siguiente modo:
ssh -L 4500:servidor2.example.com:8400 admin@servidor1.example.com
Estoy estableciendo una conexión SSH con servidor1.example.com
. Sin embargo, también estoy levantando una redirección de puerto local. SSH se pondrá a escuchar en el puerto 4500 de mi máquina. Si me trato de conectar a él (por ejemplo, visitando http://localhost:4500
en mi navegador web), todo el tráfico que le envíe a ese puerto será reenviado a mi servidor como si fuese un proxy. En mi servidor, ese tráfico desviado será reenviado a servidor2.example.com:8400
. Esta es una conexión separada e independiente; de hecho, el servidor2 verá que el tráfico le viene de servidor1, no de mi ordenador. En la otra dirección, lo que sea que servidor2.example.com:8400
le responda a mi servidor, mi servidor me lo mandará a mí, y será la respuesta que yo vea desde el puerto 4500.
Un ejemplo muy habitual que mencionaba antes es conectarte a un panel de control que tengas en tu servidor pero que esté solamente accesible desde 127.0.0.1
, para que no puedan acceder desconocidos a él. Si te conectas a tu servidor como:
ssh -L 3000:localhost:3000 admin@servidor.example.com
Lo que ocurrirá es que a partir de ese momento, si en tu navegador web visitas http://localhost:3000
, esa petición será enviada a tu servidor, desde donde volverá a ser lanzada, en este caso, a localhost:3000
también, por lo que si en tu servidor tienes algo escuchando en el puerto 3000, aunque tenga un bind a 127.0.0.1 (que, de hecho, sería el caso de uso ideal, para no tener que exponerlo a la internet abierta), tu petición será atendida por ese servicio porque se pensará que le está hablando el propio servidor y que es una conexión local. Lo que sea que te diga, te volverá a tu máquina para que lo puedas ver.
Ventajas y usos
Una de las ventajas de usar túneles SSH es que el tráfico entre tu ordenador y tu servidor SSH va cifrado porque así es como funciona el protocolo SSH. Si por lo que sea estás en una ubicación de red poco confiable, derivar el tráfico a través de un túnel de este estilo en vez de conectarte directamente al recurso puede ser un alivio que no alcanza el nivel de una VPN pero que proporciona cierto nivel de seguridad.
Además, como ya has visto, te permite tener servicios internos en localhost que puedes usar para mantenimiento, y que requieran una conexión activa mediante SSH para verificar la identidad.
@nosgustalinux amo aprender nuevas cosas gracias.