Túneles SSH: Configuración y Casos Prácticos de Uso
Secure Shell (SSH) es un protocolo ampliamente utilizado que proporciona una comunicación segura y cifrada entre ordenadores. Más allá de su uso tradicional para iniciar sesión en sistemas remotos, SSH también ofrece potentes capacidades de tunelización, que permiten reenviar de forma segura el tráfico entre redes y sistemas. Esta técnica se conoce como tunelización SSH y puede ser muy valiosa para varios casos de uso práctico, como acceder a servicios restringidos o eludir cortafuegos.
En este artículo, exploraremos cómo funcionan los túneles SSH, cómo configurarlos y cómo puedes utilizarlos para diferentes escenarios en aplicaciones del mundo real.
¿Qué es un túnel SSH?
Un túnel SSH es un método de transmisión de datos arbitrarios a través de una conexión SSH encriptada entre dos sistemas. Esencialmente, le permite reenviar de forma segura el tráfico de red de una máquina a otra mediante la creación de un túnel a través del cual viajan los datos.
Los túneles SSH se pueden utilizar de tres formas principales:
- Reenvío local de puertos
- Reenvío remoto de puertos
- Reenvío dinámico de puertos
Cada uno de estos métodos tiene sus casos de uso específicos, y vamos a cubrir cada uno en detalle a continuación.
1. Reenvío local de puertos
El reenvío local de puertos es la forma más común de túnel SSH. Le permite reenviar tráfico desde un puerto local de su máquina a un servicio remoto a través de una conexión SSH.
Cómo funciona el reenvío local de puertos
Cuando usted crea un túnel SSH local, el tráfico enviado a un puerto específico en su máquina local es reenviado al servidor SSH, que entonces lo envía al destino deseado (como una base de datos o un servidor web).
Ejemplo de uso: Acceso a una base de datos remota
Imagine que necesita acceder a una base de datos en un servidor remoto, pero el puerto de la base de datos está bloqueado por un cortafuegos. En lugar de abrir el puerto públicamente, puede utilizar el reenvío de puertos local para acceder de forma segura a la base de datos.
Comando para el reenvío local de puertos
En este ejemplo
- -L 5432:localhost:5432: Especifica el reenvío de puerto local. El primer 5432 es el puerto en su máquina local, localhost:5432 se refiere a la base de datos remota.
- user@remote-server: Se conecta al servidor SSH remoto.
Ahora, puede acceder a la base de datos remota desde su máquina local conectándose a localhost:5432.
2. Reenvío de puertos remotos
El reenvío remoto de puertos le permite reenviar tráfico desde un servidor remoto a una máquina local. Esto es útil cuando quieres exponer un servicio que se ejecuta en tu máquina local a un servidor remoto o a sus usuarios.
Cómo funciona el reenvío remoto de puertos
Con el reenvío remoto de puertos, cualquier tráfico que alcance un puerto especificado en la máquina remota será reenviado a un puerto de tu máquina local. Esta configuración se utiliza a menudo cuando se necesita exponer un servicio al servidor remoto que sólo es accesible en su red local.
Ejemplo de Caso de Uso: Exponer una Aplicación Web Local a un Servidor Remoto
Imagina que estás desarrollando una aplicación web localmente en tu máquina, y quieres mostrársela a un colega en un servidor remoto. En lugar de desplegar la aplicación, puede utilizar el reenvío remoto de puertos para permitir el acceso a su aplicación local.
Comandos para la redirección remota de puertos
En este ejemplo:
- -R 8080:localhost:3000: Especifica el reenvío de puertos remotos. El puerto 8080 de la máquina remota se reenviará a localhost:3000 en su máquina local, donde se ejecuta la aplicación web.
- user@remote-server: Conecta con el servidor SSH remoto.
Ahora, cualquier persona en el servidor remoto puede acceder a su aplicación web a través de http://remote-server:8080.
3. Reenvío dinámico de puertos
El reenvío dinámico de puertos convierte su cliente SSH en un servidor proxy SOCKS, permitiéndole dirigir el tráfico desde su máquina local a través del túnel SSH a cualquier destino. Esto resulta especialmente útil cuando se desea canalizar todo el tráfico (como la navegación web) a través de una conexión segura.
Cómo funciona el reenvío dinámico de puertos
Con el reenvío dinámico de puertos, el cliente SSH escucha en un puerto local y reenvía todo el tráfico saliente a través del servidor SSH. Esta configuración le permite utilizar el servidor SSH como un proxy para su conexión a Internet, evitando los cortafuegos y asegurando el tráfico.
Ejemplo de uso: eludir las restricciones de la red
Imagina que estás en una red Wi-Fi pública y ciertos sitios web o servicios están bloqueados. Puede utilizar el reenvío dinámico de puertos para eludir estas restricciones y acceder a Internet de forma segura a través de su servidor SSH.
Comando para el reenvío dinámico de puertos
En este ejemplo:
- -D 8080: Especifica el reenvío dinámico de puertos. Su máquina local actuará como proxy SOCKS en el puerto 8080.
- user@remote-server: Se conecta al servidor SSH remoto.
Una vez que el túnel está activo, puede configurar su navegador o cualquier aplicación para que utilice localhost:8080 como proxy SOCKS, lo que le permitirá enrutar de forma segura todo el tráfico a través del servidor remoto.
Configuración de túneles SSH con archivo de configuración
Si utiliza túneles SSH con frecuencia, puede simplificar el proceso creando un archivo de configuración SSH. El archivo de configuración le permite definir atajos para sus conexiones SSH y configuraciones de reenvío de puertos, facilitando la configuración de túneles sin necesidad de escribir largos comandos cada vez.
Ejemplo de archivo de configuración SSH
Añada la siguiente configuración a ~/.ssh/config:
Ahora, puede configurar un reenvío de puerto local a la base de datos remota con sólo:
Ejemplos prácticos de túneles SSH
1. Tráfico Web Seguro a través de un Proxy SOCKS
Si trabajas en un entorno restringido y necesitas acceder a sitios web bloqueados, puedes configurar el reenvío dinámico de puertos para dirigir todo tu tráfico a través de un servidor SSH seguro.
A continuación, configura tu navegador para que utilice localhost:9090 como proxy SOCKS.
2. Acceso a un servicio interno remoto
Suponga que necesita acceder a un servicio interno que sólo está disponible en una red privada remota. Puede utilizar la redirección local de puertos para conectarse de forma segura a ese servicio desde su máquina local.
Esto le permitirá acceder al servicio interno en http://localhost:8080.
3. Exposición de un servidor de desarrollo local
Si desea compartir un servidor de desarrollo local con colegas en un servidor remoto, utilice el reenvío remoto de puertos:
Los colegas del servidor remoto ya pueden acceder a tu aplicación local en http://remote-server:4000.
Consideraciones de seguridad
Aunque los túneles SSH proporcionan canales de comunicación seguros y cifrados, es importante seguir las mejores prácticas de seguridad:
- Utilice una autenticación fuerte: Utilice siempre contraseñas seguras o autenticación basada en claves SSH para proteger su servidor SSH.
- Limite el acceso a los puertos reenviados: Restrinja el acceso a los puertos reenviados mediante reglas de cortafuegos o configuraciones SSH para evitar accesos no autorizados.
- Supervise las conexiones SSH: Supervise regularmente los registros de conexión SSH para detectar cualquier actividad inusual o intentos de acceso no autorizados.
Conclusión
Los túneles SSH son una herramienta versátil que proporciona formas seguras de reenviar tráfico y acceder a servicios a través de redes. Tanto si desea acceder a servicios restringidos, eludir cortafuegos o exponer recursos internos de forma segura, los túneles SSH ofrecen una solución potente y flexible. Si domina el reenvío de puertos local, remoto y dinámico, podrá mejorar la seguridad de su red y ampliar su capacidad para acceder y gestionar sistemas remotos de forma eficaz.