¡Hola! ¿Te resulta interesante el mundo del acceso remoto utilizando SSH? En publicaciones anteriores, hemos tratado sobre la generación de claves SSH, los comandos básicos de acceso y el reenvío de puerto local (-L
). Esta vez, nos enfocaremos en otra poderosa funcionalidad de SSH: el reenvío de puerto reverso (Reverse Port Forwarding), es decir, la opción -R
.
Si la opción -L
permite "túnelizar desde mi computadora hacia el exterior para acceder a recursos externos", la opción -R
es lo contrario. Permite "túnelizar desde una computadora externa hacia mi computadora para acceder a recursos internos", funcionando como crear una puerta en la pared.
¿Qué es el Reenvío de Puerto Reverso? (Resumen de la opción -R)
Generalmente, es difícil acceder directamente desde un servidor remoto (Servidor A) a una computadora local (Cliente B). Esto se debe a que la mayoría de las veces, el Cliente B utiliza una dirección IP privada, está detrás de un firewall o no tiene una IP fija.
En este caso, al usar el reenvío de puerto reverso (-R
), el Cliente B puede intentar conectarse al Servidor A por SSH, mientras establece un túnel para redirigir las solicitudes que entran al puerto específico del Servidor A al puerto específico del Cliente B.
En términos simples:
- Cliente B (mi computadora) intenta conectarse al Servidor A (servidor externo) por SSH.
- En este momento, utilizando la opción
-R
, le dice "¡Envía las solicitudes que entran al puerto X del Servidor A al puerto Y de mi computadora (Cliente B)!". - Ahora, si otros usuarios externos se conectan al puerto X del Servidor A, esa solicitud será redirigida a través del túnel SSH al puerto Y del Cliente B.
Es como si el Cliente B le pidiera al Servidor A "Crea una puerta por la que pueda conectarme".
-R
Composición del Comando
El formato básico del comando para el reenvío de puerto reverso es el siguiente:
ssh -R [puerto_remoto]:[host_destino]:[puerto_destino] [usuario_servidor_remoto]@[direccion_servidor_remoto]
Analicemos cada elemento en detalle:
ssh
: Comando para ejecutar el cliente SSH.-R
: Opción para el reenvío de puerto reverso.[puerto_remoto]
: Número de puerto del servidor remoto (Servidor A) que será túnelizado. Cuando un usuario externo accede a este puerto, se conecta a los recursos del Cliente B.[host_destino]
: Nombre del host o dirección IP del recurso que se puede acceder dentro de[usuario_servidor_remoto]@[direccion_servidor_remoto]
cuando se conecta. Generalmente eslocalhost
(es decir, el propio Cliente B).[puerto_destino]
: Número de puerto del servicio en el Cliente B que está abierto. Este es el lugar al que finalmente llegarán las solicitudes externas.[usuario_servidor_remoto]@[direccion_servidor_remoto]
: Cuenta de usuario y dirección del servidor externo (Servidor A) al que se establece el túnel. Este es el camino que toma el Cliente B para acceder al Servidor A.
Ejemplo:
Cuando quiero acceder al servidor web del puerto 8080 de mi computadora local (Cliente B) a través del puerto 8888 del servidor externo (Servidor A):
# Ejecutar en el Cliente B (mi computadora)
ssh -R 8888:localhost:8080 user@server_a_public_ip
Si este comando se ejecuta exitosamente, estaré conectado por SSH a server_a_public_ip
. En este momento, si otro computador accede a http://server_a_public_ip:8888
, realmente estará accediendo al puerto 8080 de mi computadora (Cliente B).
¿Cuándo es útil el reenvío de puerto reverso? (Uso en el proceso de desarrollo)
El reenvío de puerto reverso es extremadamente poderoso en situaciones específicas donde no se puede resolver con un acceso SSH común. Puede ser especialmente útil en el proceso de desarrollo.
1. Exposición de un servidor de desarrollo local detrás de NAT/firewall
- Situación problemática: Tienes una aplicación web que estás desarrollando (por ejemplo, ejecutándose en
localhost:3000
) en tu red interna en casa o en la oficina. Quieres mostrar esta aplicación a un compañero de equipo o cliente externo, pero como tu computadora local tiene una IP privada, no puede ser accedida directamente desde el exterior. La configuración del router o firewall de la empresa puede ser complicada y requerir la aprobación de un administrador. - Solución: Puedes exponer tu servidor de desarrollo local a través de un servidor externo con IP pública (por ejemplo, una instancia de AWS EC2, VPS).
# Ejecutar en mi máquina de desarrollo local (Cliente B)
ssh -R 80:localhost:3000 your_user@your_public_server.com
# O dado que el puerto 80 requiere privilegios de root, usar un puerto diferente (por ejemplo, 8080)
ssh -R 8080:localhost:3000 your_user@your_public_server.com
Luego, al acceder a `your_public_server.com:8080`, en realidad accederás a la aplicación web que está funcionando en tu máquina local (`localhost:3000`). Ahora puedes permitir a otros ver en tiempo real el progreso de tu desarrollo.
2. Pruebas de Webhook
- Situación problemática: Deseas probar eventos de webhook que ocurren en sistemas de pago, repositorios Git (GitHub/GitLab), plataformas de mensajería, etc., pero los webhooks solo pueden enviarse a una URL pública.
- Solución: Puedes mapear un endpoint de webhook local (por ejemplo,
localhost:5000/webhook
) a una URL específica de un servidor público mediante el reenvío de puerto reverso.
# Ejecutar en mi máquina de desarrollo local (Cliente B)
ssh -R 5000:localhost:5000 your_user@your_public_server.com
Ahora, al ingresar `http://your_public_server.com:5000/webhook` en la configuración del webhook, los eventos de webhook serán enviados a tu servidor local para que puedas probarlos.
3. Acceso directo a un puerto específico en un servidor remoto (evitar redes seguras)
- Situación problemática: Deseas acceder directamente a una base de datos o herramienta de gestión interna instalada en un servidor remoto (Cliente B) (por ejemplo, ejecutándose en
localhost:9000
), pero este servidor tiene un firewall que impide el acceso externo a ciertos puertos o está en una red privada. Sin embargo, el Cliente B puede conectarse al servidor público externo (Servidor A) por SSH. - Solución: El Cliente B solicita al Servidor A mediante la conexión SSH y el reenvío de puerto reverso: "Crea un camino que se conecte a mi puerto 9000".
# Ejecutar en el Cliente B (servidor detrás del firewall)
ssh -R 9000:localhost:9000 your_user@server_a_public_ip
Ahora, si accedes a `server_a_public_ip:9000` desde tu computadora (o desde otra computadora externa), podrás acceder al servicio del puerto 9000 del Cliente B.
4. Demostración temporal o compartición
- Situación problemática: Quieres mostrar a un compañero cómo funciona una aplicación específica que se está ejecutando localmente, o deseas hacerla pública temporalmente para obtener comentarios.
- Solución: Puedes exponer temporalmente un servicio local a través de un simple reenvío de puerto reverso. Después de la demostración, puedes terminar la sesión SSH para bloquear el acceso fácilmente.
Precauciones al usar el reenvío de puerto reverso
-
GatewayPorts yes
: Por defecto, el puerto remoto abierto por reenvío de puerto reverso solo es accesible desde la máquina donde se ejecuta el servidor SSH (server_a_public_ip
). Si deseas que otras computadoras externas puedan acceder a este puerto, debes agregar la configuraciónGatewayPorts yes
en el archivosshd_config
del servidor SSH y reiniciar el servicio SSH. (Debes tener cuidado al usar esta configuración ya que puede afectar la seguridad). -
Seguridad: El reenvío de puerto reverso expone un puerto específico de tu red local al exterior, por lo que debes utilizarlo solo en servidores en los que confíes. Debes revisar previamente las vulnerabilidades de seguridad del servicio expuesto.
-
Mantenimiento de la sesión SSH: El túnel de reenvío de puerto reverso solo es válido mientras la sesión SSH esté activa. Para ejecutarlo de manera continua en segundo plano, es común utilizar
ssh -fN -R ...
junto con las opcionesf
(ejecución en segundo plano) yN
(no ejecutar comando remoto).
Conclusión
El reenvío de puerto reverso SSH (-R
) es una función muy útil cuando necesitas exponer un servicio específico al exterior en entornos de red complejos o detrás de firewalls. Puede ser una herramienta de productividad potente, especialmente al compartir tu entorno local o realizar pruebas de webhook durante el proceso de desarrollo.
Si encontraste el concepto difícil de entender, lo mejor es intentar practicarlo directamente. ¡Aprovecha el reenvío de puerto reverso SSH en tu flujo de trabajo de desarrollo!
Si tienes alguna pregunta, no dudes en dejarla en los comentarios.
No hay comentarios.