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:
- Bastión SSH
- Endpoint público
- Reverse proxy con Nginx
- Terminación de dominio (codigoelectronica.com)
- Puente hacia tu Ubuntu local vía túnel SSH inverso
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:
- t3.micro (1 vCPU, 1GB RAM)
- Ubuntu Server 22.04 LTS
- 8–10 GB gp3
Es suficiente porque:
- No ejecutará la app
- Solo corre SSH + Nginx
- El tráfico pesado ocurre en tu máquina local
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:
- Genera certificado Let's Encrypt
- Configura redirección automática a HTTPS
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:
- Se apaga
- Pierde internet
- Se cae el túnel
El sitio deja de funcionar.
Esto es válido para:
- Laboratorio
- Demo
- Desarrollo remoto
No es arquitectura de producción real.