Cómo publicar una aplicación local en Internet usando AWS EC2, Nginx y un túnel SSH inverso


Aprende a publicar una aplicación ejecutándose en local usando una instancia mínima de AWS EC2, Nginx, un túnel SSH inverso y un dominio personalizado con HTTPS.

Cómo publicar una aplicación local en Internet usando AWS EC2, Nginx y un túnel SSH inverso
oscar Escrito por oscar 20 July 2026 23 0

Problema

En muchas ocasiones tenemos una aplicación ejecutándose en una máquina local, pero queremos que sea accesible desde Internet utilizando un dominio público. Una alternativa es desplegar completamente la aplicación en un servidor cloud, pero también es posible utilizar una instancia mínima de AWS EC2 como punto de entrada y conectar la aplicación local mediante un túnel SSH inverso

Solucion

Vamos a diseñar una instancia mínima en EC2 que actúe únicamente como:

Arquitectura final:

Usuario
   ▼
su-dominio.com
   ▼
AWS EC2
Nginx :80/:443
   ▼
localhost:8080
   ▼
SSH Reverse Tunnel
   ▼
Ubuntu local
Next.js :3000

Tipo de instancia mínima recomendada

En Amazon Web Services, dentro de Amazon EC2:

Recomendación:

Es suficiente porque:

Security Group

Abrir únicamente:

Tipo Puerto Origen
SSH 22 Tu IP
HTTP 80 0.0.0.0/0
HTTPS 443 0.0.0.0/0

NO abras 8080 públicamente.

Configurar DNS del dominio

En el proveedor donde compraste el dominio:

Crear un registro:

Tipo: A
Nombre: @
Valor: IP_PUBLICA_EC2

Si usas Cloudflare, solo apunta el A record a la IP.

Configurar EC2

Conectarte:

ssh -i tu-clave.pem ubuntu@IP_PUBLICA_EC2

Actualizar:

sudo apt update && sudo apt upgrade -y

Instalar Nginx

sudo apt install nginx -y

Verificar:

sudo systemctl status nginx

Habilitar reverse tunnel en SSH

Editar:

sudo nano /etc/ssh/sshd_config

Asegurar: 

GatewayPorts yes
AllowTcpForwarding yes

Reiniciar: 

sudo systemctl restart ssh

Crear el túnel inverso desde tu Ubuntu local

En tu máquina local:

ssh -i tu-clave.pem -N -R 127.0.0.1:8080:localhost:3000 ubuntu@IP_PUBLICA_EC2

IMPORTANTE:

Usamos 127.0.0.1 para que el puerto 8080 solo sea accesible desde EC2, no desde internet.

Explicación:

Parámetro Descripción
-N No ejecutar comandos remotos
-R Crear un túnel remoto o inverso
127.0.0.1:8080 Puerto abierto en EC2
localhost:3000 Aplicación Next.js local

Configurar Nginx como reverse proxy

Crear config:

sudo nano /etc/nginx/sites-available/su-dominio

Contenido:

server {
    listen 80;
    server_name su-dominio.com www.su-dominio.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Activar:

sudo ln -s /etc/nginx/sites-available/su-dominio /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Agregar HTTPS (Recomendado)

Revisa el post Cómo instalar y configurar Certbot en Linux con Nginx y Apache donde explicamos a detalle de como usar certbot

Instalar certbot:

sudo apt install certbot python3-certbot-nginx -y

Ejecutar:

sudo certbot --nginx -d codigoelectronica.com -d www.codigoelectronica.com

Esto:

Hacer el túnel persistente (PRODUCCIÓN)

Usaremos autossh para persistir el túnel.

En tu máquina local instala: 

sudo apt install autossh

Ejecuta: 

autossh -M 0 -N -i tu-clave.pem -R 127.0.0.1:8080:localhost:3000 ubuntu@IP_PUBLICA_EC2

Idealmente crear un servicio systemd para que inicie automáticamente.

Seguridad recomendada

En EC2:  

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

Deshabilitar login por password:

PasswordAuthentication no

Resultado final

Cuando alguien acceda a:  

https://su-dominio.com

Flujo real:

Nginx EC2 → localhost:8080 → túnel SSH → tu Ubuntu local → Next.js

⚠️ Consideración crítica

Si tu máquina local:

El sitio deja de funcionar.

Esto es válido para:

No es arquitectura de producción real.


Comentario

Debe aceptar antes de enviar