diff --git a/docs/28-servidor-de-produccion.md b/docs/28-servidor-de-produccion.md index ee997f71..c68a283b 100644 --- a/docs/28-servidor-de-produccion.md +++ b/docs/28-servidor-de-produccion.md @@ -1778,6 +1778,58 @@ ofrecer contraseña ✅, `:2345` igual ✅, y el `git ls-remote` por SSH sigue f Decidir «fail2ban muere porque tenemos algo mejor» es correcto **y** deja un hueco abierto hasta que ese algo mejor pueda ejecutarse. Entre la decisión y la capacidad hay un kernel de por medio. +### 6.31 ✅ La caja arrancó con `nf_tables` — y el init la levantó ENTERA sola *(2026-09-15)* + + $ nft list ruleset + $ ← sin error: vacío, que es lo correcto en una caja sin reglas + +El kernel `b3:63fdd57c…` bootea, y con él **`nft` funciona por primera vez en una máquina takana**. +Comprobado con el mecanismo exacto que reemplaza a fail2ban, no con una regla de adorno: un +`set ... flags dynamic; timeout 10s` con `add @ban4 { ip saddr timeout 10s limit rate over 5/minute } +drop` — aceptado por el kernel (`rc=0`) y releído tal cual. Eso es el ban por IP **dentro del +kernel**, sin daemon. + +#### Lo que el reinicio probó de paso, y vale más que el kernel + +**La Semilla levantó los OCHO entes sola, todos con `↻ 0`:** `sshd`, `gitea`, `caddy`, `squid`, +`crond`, `chronyd`, `sergioh-api` y `gioser-php` — o sea los dos servicios enjaulados en `qorpa` +(con su `newuidmap`, su overlay y su `harkaq`) **arrancan desde el genesis igual que un binario +nativo**. Todo lo que se fue editando en `/ente/seed.card.json` a lo largo del día era, hasta este +momento, una declaración sin probar: un reinicio es el único examen que toma. + +Desde fuera, al minuto: los siete dominios en **200**, el proxy en **407** y `git ls-remote` por +SSH:2345 devolviendo el commit. Cero intervención. + +#### ⚠ `reboot` NO reinicia una caja con arje-zero + +`reboot` de busybox le pide a PID 1 que lo haga, y **arje-zero no implementa ese protocolo**: el +comando vuelve, no dice nada, y la máquina sigue arriba (`up 4 days` después de «reiniciar»). Lo que +sí funciona es **`reboot -f`**, que llama a `reboot(2)` directo saltándose al init. Con `sync` antes, +claro: el corte es duro por definición. + +⇒ **Y falta la pieza**: un init que gobierna un servidor de producción tiene que atender un apagado +ordenado. Hoy la única vía es el corte duro, que ya costó el `write_atomic` no durable del §6.13. + +#### 🧨 Casi reinicio el HUB por un backtick en un `echo` + +Escribiendo el aviso del reinicio, el mensaje decía ``… no atiende el `reboot` normal …`` dentro de +comillas DOBLES. La shell ejecutó lo que había entre backticks: **`reboot`, en gioser**. No pasó nada +por una razón que no es mérito de nadie —la sesión no es root y OpenRC contestó «you must be root»— +y el hub lleva 11 días arriba, con la granja y el cron encima. + +Es la **tercera vez en el día** que un backtick dentro de un texto se ejecuta +([[heredoc-sin-comillas-ejecuta-comentarios]]), y las dos anteriores sólo se comieron un comentario. +La regla deja de ser de estilo: **nunca un backtick dentro de comillas dobles en una shell** — +comillas simples, o `$(printf '%s' …)`, o directamente no poner el acento grave en el texto. + +#### Lo que queda para cerrar el frente del cortafuegos + +El kernel ya no estorba; falta **la política**: `PoliticaEntrada` (.ron) → `generate-input` → +`apply-input` del cortafuegos de tawasuyu, con los puertos reales de la caja (`22022`, `2345`, `80`, +`443`, `1137`). ⚠ Y hay que aplicarla con **interruptor de hombre muerto** (aplicar, esperar, y +`flush` automático si nadie confirma): una regla mal puesta en una caja **sin consola serie** deja +la única salida en `hcloud server enable-rescue`. + ## 7. Reusar los scripts que ya existen, y no escribir de nuevo Pedido explícito del usuario. El inventario de lo que ya hace el trabajo: