From 70e4c540d3dd5de028786530ac283af2651c743c Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 15 Sep 2026 21:41:08 +0000 Subject: [PATCH] =?UTF-8?q?la=20caja=20arranc=C3=B3=20con=20nf=5Ftables=20?= =?UTF-8?q?=E2=80=94=20y=20la=20Semilla=20la=20levant=C3=B3=20ENTERA=20sol?= =?UTF-8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `nft list ruleset` contesta vacío y sin error: nf_tables funciona por primera vez en una máquina takana. Comprobado con el mecanismo que reemplaza a fail2ban y no con una regla de adorno: un set `flags dynamic` con `add @ban4 { ip saddr timeout 10s limit rate over 5/minute } drop`, aceptado por el kernel y releído tal cual. LO QUE EL REINICIO PROBÓ DE PASO, y vale más que el kernel: la Semilla levantó los OCHO entes sola, todos con ↻ 0 — incluidos los DOS enjaulados en qorpa, que arrancan desde el genesis con su newuidmap, su overlay y su harkaq igual que un binario nativo. Todo lo que se editó en /ente/seed.card.json a lo largo del día era hasta ahora una declaración SIN PROBAR: un reinicio es el único examen que toma. Desde fuera, al minuto: 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: 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»). Funciona `reboot -f`, que llama a reboot(2) saltándose al init. Falta la pieza: un init que gobierna producción tiene que atender un apagado ordenado. 🧨 Y CASI REINICIO EL HUB POR UN BACKTICK: el aviso decía «no atiende el `reboot` normal» dentro de comillas DOBLES, y la shell ejecutó lo de entre backticks — `reboot`, en gioser. No pasó nada porque la sesión no es root y OpenRC contestó «you must be root». Es la TERCERA vez en el día que un backtick dentro de un texto se ejecuta; las otras dos sólo se comieron un comentario. La regla deja de ser de estilo: nunca un backtick dentro de comillas dobles en una shell. Co-Authored-By: Claude Opus 5 (1M context) --- docs/28-servidor-de-produccion.md | 52 +++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) 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: