Explicación del túnel SSH: Acceso seguro a servicios remotos

Usa túneles SSH para acceder a bases de datos privadas, aplicaciones web y servicios remotos mediante reenvío local, remoto y dinámico.

Túneles SSH Explicados: Acceso Seguro a Servicios Remotos

Los túneles SSH te ayudan a acceder a servicios remotos sin exponerlos a internet. Si tu base de datos, panel de administración o servidor de desarrollo solo es accesible desde un host bastión, un túnel SSH puede proporcionar una ruta segura para tus herramientas locales.

Los patrones principales son el reenvío local, el reenvío remoto y el reenvío dinámico. Cada uno responde a una pregunta diferente: ¿necesitas acceder a algo remoto, exponer algo local o crear un proxy SOCKS?

¿Qué es un Túnel SSH?

Un túnel SSH encapsula el tráfico de aplicaciones dentro de una conexión SSH. En lugar de conectarte directamente a un servicio, te conectas a un puerto reenviado local o remoto. SSH transporta ese tráfico a través de la sesión cifrada y se conecta al destino final desde el lado correcto del túnel.

El túnel cifra el tráfico entre tu cliente SSH y el servidor SSH. Si el destino final está más allá del servidor SSH, ese último tramo utiliza la seguridad que proporcione el servicio de destino. Para servicios sensibles, mantén TLS o el cifrado nativo habilitado incluso cuando uses un túnel.

Tipos de Túneles SSH

SSH ofrece tres tipos principales de reenvío de puertos, cada uno con un propósito diferente:

1. Reenvío de Puerto Local (-L)

El reenvío de puerto local es el tipo más común. Te permite reenviar tráfico desde un puerto de tu máquina local a un puerto de una máquina remota (o una máquina accesible desde el servidor SSH remoto). Esto es ideal para acceder a servicios que se ejecutan en la red interna de un servidor remoto o en el propio servidor, que no son directamente accesibles desde tu red local.

Cómo funciona: El cliente SSH escucha en tu máquina. El servidor SSH se conecta al destino.

Caso de uso: Acceder a una base de datos MySQL en el puerto 3306 que solo el host bastión puede alcanzar.

Sintaxis del comando:

ssh -L [PUERTO_LOCAL]:[HOST_DESTINO]:[PUERTO_DESTINO] [USUARIO_SSH]@[SERVIDOR_SSH]

Ejemplo:

Supón que tienes una base de datos MySQL ejecutándose en db.internal.example.com (puerto 3306) y solo puedes conectarte por SSH a bastion.example.com. Para acceder a la base de datos desde tu máquina local en el puerto 8888:

ssh -L 8888:db.internal.example.com:3306 [email protected]

Después de ejecutar este comando, puedes abrir tu cliente MySQL local y conectarte a localhost:8888. El tráfico se canalizará de forma segura a través de bastion.example.com hasta db.internal.example.com:3306.

Usa -N cuando no necesites un shell remoto:

ssh -N -L 8888:db.internal.example.com:3306 [email protected]

Para scripts, añade -o ExitOnForwardFailure=yes para que SSH salga si no se puede crear el listener local.

2. Reenvío de Puerto Remoto (-R)

El reenvío de puerto remoto hace lo contrario del reenvío local. Te permite reenviar tráfico desde un puerto del servidor SSH remoto a un puerto de tu máquina local o una máquina accesible desde tu máquina local. Esto es útil para exponer un servicio que se ejecuta en tu máquina local (o en una máquina de tu red local) al servidor remoto o a su red.

Cómo funciona: El servidor SSH escucha en un puerto remoto. Tu cliente SSH se conecta al destino desde tu lado del túnel.

Caso de uso: Permitir que un colega remoto acceda a un servidor de desarrollo web que se ejecuta en tu máquina local (por ejemplo, una aplicación Flask en el puerto 5000) sin exponer tu máquina local directamente a internet.

Sintaxis del comando:

ssh -R [PUERTO_REMOTO]:[HOST_DESTINO]:[PUERTO_DESTINO] [USUARIO_SSH]@[SERVIDOR_SSH]

Ejemplo:

Supón que estás ejecutando una aplicación web en tu máquina local en localhost:5000. Quieres permitir que un usuario en remote.example.com acceda a ella conectándose al puerto 9000 en remote.example.com.

ssh -R 9000:localhost:5000 [email protected]

En configuraciones típicas de OpenSSH, el listener remoto solo está disponible en la interfaz de loopback del servidor SSH. Esto significa que los usuarios en el host remoto pueden probar localhost:9000, pero otras máquinas no pueden necesariamente alcanzar remote.example.com:9000.

Para exponer el listener a otras máquinas, normalmente necesitas una dirección de enlace como 0.0.0.0 en el comando y una configuración del lado del servidor GatewayPorts como clientspecified o yes. Ten cuidado: el reenvío remoto puede exponer servicios en tu portátil o red local a la red remota.

3. Reenvío de Puerto Dinámico (-D)

El reenvío de puerto dinámico crea un proxy SOCKS en tu máquina local. En lugar de reenviar tráfico a un destino específico, permite que las aplicaciones configuradas para usar este proxy SOCKS se conecten a cualquier host y puerto accesible desde el servidor SSH. Esto convierte efectivamente tu conexión SSH en un servidor proxy versátil.

Cómo funciona: Tu cliente SSH escucha como un proxy SOCKS. Las aplicaciones que soportan SOCKS envían solicitudes a ese proxy local, y el servidor SSH realiza la conexión saliente.

Caso de uso: Navegar por la web de forma segura desde una red Wi-Fi pública enrutando todo el tráfico de tu navegador a través de un servidor SSH en casa o en tu oficina. Esto cifra tu actividad de navegación.

Sintaxis del comando:

ssh -D [PUERTO_LOCAL] [USUARIO_SSH]@[SERVIDOR_SSH]

Ejemplo:

Para crear un proxy SOCKS en tu máquina local que escuche en el puerto 1080:

ssh -D 1080 [email protected]

Después de ejecutar este comando, configura tu navegador u otra aplicación para usar un proxy SOCKS en localhost:1080. Si la aplicación soporta DNS remoto sobre SOCKS5, actívalo cuando la privacidad del DNS sea importante.

Aplicaciones Prácticas y Beneficios

El túnel SSH ofrece una amplia gama de aplicaciones prácticas:

  • Acceso Seguro a Bases de Datos: Acceder a bases de datos (como PostgreSQL, MySQL o MongoDB) que solo son accesibles desde un servidor específico en una red privada, sin exponer el puerto de la base de datos directamente a internet.
  • Acceso a Servicios Web Internos: Conectarse a aplicaciones web internas, interfaces administrativas o paneles de monitoreo que no están expuestos públicamente.
  • Asegurar Protocolos No Cifrados: Envolver protocolos inseguros como VNC, FTP o HTTP simple dentro de un túnel SSH cifrado, proporcionando confidencialidad e integridad.
  • Trabajar a través de Restricciones de Red: Acceder a servicios a través de un servidor que tiene permitido alcanzarlos. Solo hazlo cuando cumpla con la política de red de tu organización.
  • Desarrollo Remoto Seguro: Proporcionar acceso seguro a entornos de desarrollo o herramientas que se ejecutan en servidores remotos.

Conclusión

Usa el reenvío local cuando tu portátil necesite acceso a un servicio remoto privado. Usa el reenvío remoto cuando un host remoto necesite acceso temporal a un servicio cercano a ti. Usa el reenvío dinámico cuando necesites un proxy SOCKS a través de un servidor SSH de confianza. Mantén el túnel lo más estrecho posible y ciérralo cuando termines el trabajo.