15 abril, 2025

Cómo abrir puertos usando SSH (Forwarding explicado fácil)

SSH no solo sirve para conectarte a servidores, también puedes abrir puertos, crear túneles (como ngrok) y proteger conexiones entre tu máquina y servidores remotos.

Hoy aprenderás cómo redireccionar puertos usando SSH, paso a paso y con ejemplos.

¿Qué es el “port forwarding” en SSH? (Explicado fácil)

Imagina que tu servidor tiene un servicio (por ejemplo, una base de datos o una página web) que NO está abierto al mundo.
Pero tú quieres acceder a él de forma segura como si estuviera en tu computadora.

SSH Forwarding crea un túnel secreto entre tu computadora y el servidor, pasando por SSH.

Es como si abrieras un portal entre dos puntos.

¿Qué tipos de port forwarding existen?

Hay tres tipos principales:

  1. Local Forwarding → Accedes a un puerto remoto desde tu máquina.
  2. Remote Forwarding → Permites que alguien desde el servidor acceda a tu máquina.
  3. Dynamic Forwarding → Creas un proxy (tipo VPN ligera).

Hoy vamos a enfocarnos en Local Forwarding (el más usado).

Local Port Forwarding: Acceder a un servicio remoto localmente

Ejemplo práctico

Supongamos:

  • Tu servidor tiene una base de datos MySQL corriendo en localhost:3306.
  • Pero el firewall NO permite conexiones externas a MySQL (solo dentro del servidor).

Y tú quieres conectarte a esa base de datos desde tu laptop.

¿Cómo hacerlo?

Con este comando:

ssh -L 3307:localhost:3306 usuario@ip_del_servidor

Significado:

  • -L → Local forwarding
  • 3307 → El puerto que se abrirá en tu máquina.
  • localhost:3306 → El destino dentro del servidor.
  • usuario@ip_del_servidor → Tus datos de acceso al servidor.

¿Qué pasa después?

  • En tu laptop, te conectas a localhost:3307.
  • SSH se encarga de redireccionarlo al servidor y al puerto 3306.
  • ¡Como si la base de datos estuviera corriendo en tu propia máquina!

Por ejemplo, podrías conectar tu cliente MySQL:

mysql -h 127.0.0.1 -P 3307 -u tu_usuario -p

Remote Port Forwarding: Permitir acceso a tu máquina a través del servidor

(Para cuando quieres abrir un puerto de tu computadora a través del servidor).

Por ejemplo:

ssh -R 8080:localhost:80 usuario@ip_del_servidor

Significado:

  • -R → Remote forwarding
  • 8080 → Puerto abierto en el servidor
  • localhost:80 → Tu máquina local (por ejemplo, un servidor web local)

Así alguien podría entrar al puerto 8080 del servidor, y ver tu puerto 80 local.

Dynamic Port Forwarding (avanzado)

Crea un proxy SOCKS5 para navegar todo el tráfico de internet a través del servidor.

ssh -D 1080 usuario@ip_del_servidor

Luego configuras tu navegador para usar un proxy SOCKS5 en localhost:1080.

¡Navegas por internet como si estuvieras en el servidor!

Ideal para:

  • Navegar de forma privada.
  • Saltarte firewalls.
  • Simular estar en otro país.

Tips útiles con port forwarding

  • Mantener vivo el túnel (evitar desconexiones):
ssh -o ServerAliveInterval=60 -L 3307:localhost:3306 usuario@ip
  • Túnel en segundo plano (sin bloquear la terminal):
ssh -f -N -L 3307:localhost:3306 usuario@ip

Significado:

  • -f → Corre en background.
  • -N → No ejecutar comandos remotos (solo crear el túnel).

Caso real: Abrir MySQL de tu Raspberry Pi (192.168.1.103) y exponerlo en un servidor AWS EC2

Objetivo:
Quiero conectarme desde cualquier lugar del mundo a la base de datos MySQL que tengo en mi Raspberry Pi, usando como “puente” mi servidor en AWS.

Vamos a usar SSH Remote Port Forwarding para hacerlo.

¿Qué necesitamos?

  • Tu Raspberry Pi o cualquier servidor/pc (donde corre MySQL) – IP local: 192.168.1.103.
  • Una instancia EC2 en AWS – IP pública o DNS: (ej: ec2-34-203-10-10.compute-1.amazonaws.com).
  • Tener acceso SSH a tu Raspberry Pi y tu AWS EC2.

Crear el túnel SSH para exponer MySQL

Ahora en tu Raspberry Pi, ejecuta este comando:

ssh -R 3307:localhost:3306 [email protected]

Explicación:

  • -R → Remote forwarding: abrir un puerto en el servidor EC2.
  • 3307 → El puerto que se abrirá en la EC2 (puedes elegir otro si quieres).
  • localhost:3306 → Se conectará a la Raspberry Pi en su MySQL local.
  • ubuntu@ec2... → Usuario y dirección de tu instancia AWS.

Este comando:

Abre el puerto 3307 en la EC2.
Cada conexión que llegue a ese puerto será redirigida al MySQL de tu Raspberry Pi.

Importante:
Puede que tengas que usar el usuario correcto de tu EC2 (ubuntu, ec2-user, etc.) o agregar tu archivo .pem con -i.