Facundo Cornejo.
Volver a proyectos

Case study

Infraestructura propia — VPS, Coolify y un casi-lockout

Monté mi propio servidor para dejar de depender de plataformas ajenas. La lección más cara no fue instalar nada: fue cerrar tres puertos y quedarme afuera.

Infraestructura privada, sin acceso publico
LinuxDockerCoolifyiptablesCloudflareLet's Encrypt
Infraestructura propia — VPS, Coolify y un casi-lockout

Contexto

Venía deployando todo en plataformas administradas sin entender qué pasaba abajo. Alquilé un VPS propio y monté Coolify encima como PaaS, para tener un solo lugar donde deployar mis proyectos y, sobre todo, para aprender administración de servidores de verdad: con un server que si lo rompo, lo arreglo yo.

El incidente

Coolify publica algunos puertos internos que Docker abre salteándose el firewall del sistema. Para cerrarlos usé el firewall del panel del proveedor y escribí una política con tres reglas de bloqueo, confiando en que las reglas implícitas de aceptar todo que la interfaz mostraba al final seguirían valiendo. No valían: al aplicar una política propia, esas implícitas dejan de existir y todo lo que no esté permitido explícitamente queda bloqueado. Cerré también el 22, el 80 y el 443. Sin SSH y sin dashboard.

Cómo salí y cómo lo arreglé bien

  • El servidor nunca dejó de funcionar: respondía al ping, era filtrado puro. Salí quitando la política desde el panel del proveedor, que es externo al server — el paracaídas que hay que tener identificado ANTES de tocar un firewall.
  • La herramienta correcta no era un firewall externo más contundente, sino la cadena DOCKER-USER de iptables: es la que Docker respeta y nunca pisa.
  • Esa cadena vive en FORWARD, o sea el tráfico hacia contenedores, así que por diseño no puede cortar el SSH del host, que va por INPUT. No hay lockout posible.
  • El detalle que costó entender: hay que filtrar por el puerto que pidió el cliente ANTES del NAT de Docker. Filtrar por el puerto de destino común no funciona, porque a esa altura ya fue traducido al puerto interno del contenedor.
  • Reglas persistidas para que sobrevivan al reboot, y verificación desde afuera del servidor, no desde adentro.

Mi rol

Todo, y a propósito a mano: evaluación y compra del proveedor, instalación, hardening, dominio y certificados para el dashboard, y el runbook de deploy por proyecto. Es el proyecto donde decidí no automatizar nada hasta entenderlo, porque el objetivo era aprender, no terminar rápido.

Aprendizajes

  • La política por defecto de un firewall se verifica contra la documentación o con una prueba reversible. No se deduce de lo que muestra una interfaz.
  • Antes de aplicar un cambio de red, tener el camino de vuelta identificado y probado. Y verificar 22, 80 y 443 desde afuera inmediatamente después, no solo los puertos que querías cerrar.
  • Elegir la herramienta hecha para el problema antes que la más contundente. La opción más agresiva fue justamente la que casi me deja afuera.
  • Los incidentes valen si se escriben. Este quedó documentado con causa raíz y regla, y por eso no volvió a pasar.