Desmitificando el reenvío de puertos SSH: Explicación de los túneles locales, remotos y dinámicos
Aprende el reenvío de puertos SSH local, remoto y dinámico con comandos prácticos para bases de datos, aplicaciones web y proxies SOCKS.
Desmitificando el Reenvío de Puertos SSH: Túneles Locales, Remotos y Dinámicos Explicados
El reenvío de puertos SSH te permite acceder a un servicio de red a través de una conexión SSH cifrada en lugar de exponer ese servicio directamente. Normalmente lo usarás cuando una base de datos, panel de control o servidor de desarrollo sea accesible desde un host SSH pero no desde tu computadora portátil.
Las tres formas comunes son el reenvío local, el reenvío remoto y el reenvío dinámico. Usan una sintaxis similar, pero el puerto de escucha se encuentra en un lugar diferente.
Qué Hace el Reenvío de Puertos SSH
El reenvío de puertos SSH, también conocido como tunelización SSH, redirige el tráfico de un host y puerto a otro host y puerto a través de tu sesión SSH. El destino se resuelve desde el lado que realiza la conexión final. Para el reenvío local, el servidor SSH se conecta al destino. Para el reenvío remoto, tu cliente SSH se conecta al destino.
Esto ofrece varias ventajas:
- Seguridad: Cifra el tráfico que de otro modo no estaría cifrado entre tu cliente y el servicio de destino.
- Control de Acceso: Permite el acceso a servicios que se ejecutan en redes privadas o detrás de cortafuegos que no son directamente accesibles desde tu ubicación actual.
- Puente de Redes: Conecta diferentes segmentos de red de forma segura.
Reenvío de Puertos Local (-L)
El reenvío de puertos local es el tipo más común. Te permite reenviar conexiones desde un puerto en tu máquina local a un puerto en una máquina remota, a través de un servidor SSH. Básicamente, haces que un servicio que se ejecuta en la red remota aparezca como si se estuviera ejecutando en tu máquina local.
Cómo funciona:
- Inicias un cliente SSH en tu máquina local.
- Especificas un puerto local (
puerto_local) en el que SSH escuchará. - Cualquier conexión realizada a
puerto_localen tu máquina local se reenvía a través de la conexión SSH alhost_remotoypuerto_remoto.
Sintaxis:
ssh -L [dirección_enlace_local:]puerto_local:host_remoto:puerto_remoto [usuario@]servidor_ssh_host
dirección_enlace_local: Dirección opcional en tu máquina local para enlazar. Si se omite, OpenSSH normalmente se enlaza a direcciones de bucle local a menos que tu configuración de cliente indique lo contrario.puerto_local: El puerto en tu máquina local en el que SSH escuchará.host_remoto: El nombre de host o dirección IP de la máquina de destino a la que se conectará el servidor SSH.puerto_remoto: El puerto en elhost_remotoal que se dirigirá el tráfico.usuario@servidor_ssh_host: Tu nombre de usuario y el nombre de host/dirección IP del servidor SSH al que te estás conectando.
Caso de Uso Práctico: Acceder a un servidor de base de datos que se ejecuta en la dirección IP privada de un servidor remoto.
Imagina un servidor de base de datos (por ejemplo, PostgreSQL en 192.168.1.100:5432) que solo es accesible desde la red interna de tu empresa. Puedes usar el reenvío de puertos local para acceder a él desde tu computadora portátil en casa:
ssh -L 5433:192.168.1.100:5432 tu_usuario@tu_servidor_ssh.com
- Este comando te conecta a
tu_servidor_ssh.com. - Abre el puerto
5433en tu máquina local (localhostpor defecto). - Cualquier conexión a
localhost:5433se reenviará a través detu_servidor_ssh.coma192.168.1.100:5432.
Ahora, puedes configurar tu cliente de base de datos local para conectarse a localhost:5433, y el tráfico se canalizará de forma segura al servidor de base de datos remoto.
Consejo: Usa ssh -N para crear un túnel sin ejecutar un comando remoto. Esto es útil para túneles en segundo plano.
ssh -N -L 5433:192.168.1.100:5432 tu_usuario@tu_servidor_ssh.com
Reenvío de Puertos Remoto (-R)
El reenvío de puertos remoto te permite reenviar conexiones desde un puerto en el servidor SSH remoto a un puerto en tu máquina local u otra máquina accesible desde tu máquina local. Esto es útil para hacer que un servicio que se ejecuta en tu máquina local sea accesible para el servidor remoto o su red.
Cómo funciona:
- Inicias un cliente SSH en tu máquina local.
- Especificas un puerto remoto (
puerto_remoto) en el servidor SSH en el que SSH escuchará. - Cualquier conexión realizada a
puerto_remotoen el servidor SSH se reenvía a través de la conexión SSH de vuelta a tu máquina local y luego a unhost_destinoypuerto_destinoespecificados.
Sintaxis:
ssh -R [dirección_enlace_remoto:]puerto_remoto:host_destino:puerto_destino [usuario@]servidor_ssh_host
dirección_enlace_remoto: (Opcional) La dirección en el servidor SSH para enlazar el puerto de escucha. Por defecto eslocalhost(lo que significa que solo el propio servidor SSH puede conectarse a este puerto). Usa0.0.0.0o*para permitir que otras máquinas en la red remota se conecten.puerto_remoto: El puerto en el servidor SSH en el que SSH escuchará.host_destino: El nombre de host o dirección IP de la máquina de destino a la que se conectará tu cliente SSH (a menudolocalhostsi el servicio está en tu máquina local).puerto_destino: El puerto en elhost_destinoal que se dirigirá el tráfico.usuario@servidor_ssh_host: Tu nombre de usuario y el nombre de host/dirección IP del servidor SSH al que te estás conectando.
Caso de Uso Práctico: Exponer un servidor web local a una red remota.
Supongamos que estás desarrollando una aplicación web en tu computadora portátil y quieres mostrársela a un colega que solo tiene acceso a la red interna de tu empresa, y tienes un servidor SSH (tu_servidor_ssh.com) accesible desde esa red.
En tu computadora portátil, ejecutarías:
ssh -R 8080:localhost:3000 tu_usuario@tu_servidor_ssh.com
- Este comando te conecta a
tu_servidor_ssh.com. - Le indica a
tu_servidor_ssh.comque escuche en el puerto8080. - Cualquier conexión a
tu_servidor_ssh.com:8080se reenviará de vuelta a través del túnel SSH a tu computadora portátil (localhost) en el puerto3000(donde se está ejecutando tu servidor web).
Ahora, tu colega puede acceder a tu aplicación web navegando a http://tu_servidor_ssh.com:8080 en su navegador. El tráfico va desde su navegador al servidor SSH, a través del túnel a tu computadora portátil, y luego a tu servidor web.
Advertencia: En configuraciones típicas de OpenSSH, el puerto_remoto solo es accesible desde el propio servidor SSH. Para permitir que otras máquinas en la red remota accedan al puerto reenviado, establece explícitamente dirección_enlace_remoto a 0.0.0.0 o * y asegúrate de que el servidor SSH lo permita con una configuración GatewayPorts como clientspecified o yes.
ssh -R 0.0.0.0:8080:localhost:3000 tu_usuario@tu_servidor_ssh.com
Reenvío de Puertos Dinámico (-D)
El reenvío de puertos dinámico crea un proxy SOCKS en tu máquina local. Este es posiblemente el tipo más flexible, ya que te permite tunelizar cualquier aplicación que admita proxies SOCKS a través de tu conexión SSH. En lugar de reenviar un puerto específico, SSH escucha en un puerto local y actúa como un servidor proxy SOCKS.
Cómo funciona:
- Inicias un cliente SSH en tu máquina local.
- Especificas un puerto local (
puerto_local) en el que SSH escuchará como un proxy SOCKS. - Configuras tus aplicaciones (navegador web, etc.) para que usen
localhost:puerto_localcomo su proxy SOCKS. - Cuando una aplicación realiza una solicitud a través de este proxy, SSH reenvía el tráfico al servidor SSH, que luego realiza la conexión al destino final en nombre de tu aplicación.
Sintaxis:
ssh -D [dirección_enlace_local:]puerto_local [usuario@]servidor_ssh_host
dirección_enlace_local: (Opcional) La dirección en tu máquina local para enlazar el puerto del proxy SOCKS de escucha. Por defecto eslocalhost.puerto_local: El puerto en tu máquina local en el que SSH escuchará como un proxy SOCKS.usuario@servidor_ssh_host: Tu nombre de usuario y el nombre de host/dirección IP del servidor SSH al que te estás conectando.
Caso de Uso Práctico: Navegar por la web de forma segura desde una red Wi-Fi pública.
Cuando estás conectado a una red Wi-Fi pública no confiable, tu tráfico es vulnerable. Puedes usar el reenvío de puertos dinámico para tunelizar todo tu tráfico de navegación web a través de una conexión SSH cifrada a un servidor de confianza.
En tu computadora portátil, ejecuta:
ssh -D 1080 tu_usuario@tu_servidor_confiable.com
- Este comando te conecta a
tu_servidor_confiable.com. - Abre el puerto
1080en tu máquina local, actuando como un proxy SOCKS.
A continuación, configura tu navegador web u otra aplicación para usar un proxy SOCKS en localhost en el puerto 1080. Si la aplicación tiene una opción de DNS remoto SOCKS5, úsala cuando no quieras que las consultas DNS ocurran en tu red local.
El tráfico de tu navegador se envía a tu servidor SSH, que luego se conecta al sitio de destino. HTTPS sigue siendo importante; el túnel SSH protege la ruta hacia tu servidor SSH, no cada salto después de él.
Consejo: Puedes combinar -D con -C para compresión, lo que puede ser beneficioso en enlaces de red más lentos.
ssh -C -D 1080 tu_usuario@tu_servidor_confiable.com
Consideraciones Avanzadas y Mejores Prácticas
- Configuración del Servidor SSH (
sshd_config): Algunas funciones de reenvío requieren permiso del lado del servidor. VerificaAllowTcpForwarding,PermitOpen,PermitListenyGatewayPortsantes de asumir que un túnel puede escuchar o conectarse en cualquier lugar. - Cortafuegos: Recuerda que los cortafuegos en el cliente, servidor o redes intermedias pueden bloquear las conexiones SSH o los puertos utilizados para el reenvío. Asegúrate de que los puertos necesarios (generalmente el 22 para el propio SSH) estén abiertos.
- Seguridad: Si bien el reenvío de puertos cifra el tráfico, la seguridad del túnel depende de la seguridad de tu servidor SSH. Usa claves SSH sólidas, desactiva la autenticación por contraseña y mantén tu servidor SSH actualizado.
- Fiabilidad: Para scripts, agrega
-o ExitOnForwardFailure=yespara que SSH salga si no puede crear el reenvío solicitado. Para túneles de larga duración, consideraautossho un servicio supervisado.
Conclusión
Usa -L cuando tu computadora portátil necesite acceder a un servicio remoto privado. Usa -R cuando un host remoto necesite acceder a algo cerca de tu computadora portátil. Usa -D cuando necesites un proxy SOCKS a través de un servidor SSH de confianza. Mantén los enlaces ajustados, verifica la política del servidor y trata cada túnel como una apertura de red temporal.