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

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:

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.