Dejando que la IA lo Haga
Necesitaba un servidor de desarrollo: VM con acceso SSH y herramientas de desarrollo instaladas. Le describí lo que quería a Claude Code y dejé que se encargara de la configuración.
El Prompt
Pedí una VM de Vultr con 8 núcleos y 32GB de RAM, accesible solo a través de Tailscale, con sesiones persistentes que sobrevivan caídas de red.
Lo que Claude Code Construyó
1. Provisionó la VM a través de la API de Vultr
Creó una instancia de 8 núcleos/32GB con Ubuntu, esperó a que la IP estuviera disponible, y luego se conectó por SSH como root.
2. Fortaleció SSH
Port 49152 # Puerto alto aleatorio
PermitRootLogin no
PasswordAuthentication no
ListenAddress 100.x.x.x # Solo interfaz Tailscale
Autenticación solo por clave, escuchando únicamente en la interfaz Tailscale.
3. Configuró tres capas de firewall
- UFW: Denegar todo el tráfico entrante excepto la subred Tailscale
- fail2ban: Banear automáticamente IPs después de intentos de login fallidos
- Firewall Vultr: Bloquear todo a nivel del hipervisor
4. Instaló Tailscale con SSH habilitado
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up --ssh --authkey=$TAILSCALE_KEY
Esto crea una segunda ruta SSH a través del servidor SSH integrado de Tailscale, independiente de OpenSSH.
5. Instaló el stack de desarrollo
Node.js (a través de nvm), Python (a través de pyenv), Docker, y herramientas comunes. Configuró Docker para ejecutarse sin sudo.
6. Configuró sesiones persistentes con tmux
Un script de inicio que automáticamente se reconecta a una sesión existente, para que las caídas de red no maten los procesos en ejecución.
7. Creó scripts de gestión locales
Scripts dev-start y dev-stop en mi laptop que encienden y apagan la VM a través de la API de Vultr.
El Bloqueo
Después de terminar, Claude Code verificó que el login de root estuviera deshabilitado intentando conectarse por SSH como root. El login falló. fail2ban notó los intentos fallidos y nos baneó.
Claude Code había configurado SSH de Tailscale como ruta secundaria. Usó tailscale ssh para volver a entrar y ejecutó:
fail2ban-client set sshd unbanip 100.x.x.x
Configuración
Necesitarás:
- Claude Code (o IA similar con uso de herramientas)
- Una cuenta de proveedor cloud (Vultr, DigitalOcean, AWS, etc.)
- Una cuenta de Tailscale
Almacena las claves API como variables de entorno y referencialas por nombre (ej., $VULTR_API_KEY) para que los secretos no aparezcan en la conversación.
Ejemplo de prompt:
Crea una VM de 8 núcleos en Vultr, bloquéala para que solo sea accesible a través de Tailscale, configura Node/Python/Docker, y dame scripts para iniciarla y detenerla.