el cortafuegos puesto en la caja — y el primer baneado fui yo
`table inet tawasuyu_input` con policy drop, 15 reglas de puerto, y el set `ban4` llenandose solo: a los pocos minutos, 27 IPs baneadas y paquetes tirados por el contador. El reemplazo de fail2ban funcionando sobre trafico real, dentro del kernel y sin daemon. 🧨 EL PRIMER BANEADO FUI YO, EN SEGUNDOS. Aplicada la primera version: ssh y https bien, y `http`, proxy y git-ssh muertos; al minuto la caja entera dejo de contestarme. La causa no es una regla mal escrita: **el set @ban4 es UNO SOLO para todos los servicios** y `ip saddr @ban4 drop` esta antes que todo, asi que pasarse de tasa en UN puerto te tira en TODOS — y el `nuevas_por_min: 5` del puerto de administracion es exactamente lo que me pasa a mi, porque cada comando remoto es una conexion nueva. Lo devolvio el INTERRUPTOR DE HOMBRE MUERTO (un `nft flush ruleset` programado a 180 s que sólo se desarma si la verificacion externa sale bien). Sin consola serie, esa es la diferencia entre un susto y un rescue. ⚠ Y el tipo ya lo avisaba: `PoliticaEntrada` tiene un campo `confiables` cuyo comentario describe palabra por palabra lo que me paso. Copie el .ron de EJEMPLO en vez de leer el TIPO. La cura fue una linea con el hub y el worker, que se aceptan ANTES de la logica de tasa. ⚠ `nft -c` rechazo 5 reglas antes de aplicar nada: `ct count over N` es CONFIG_NFT_CONNLIMIT y este kernel no lo trae. Quedan COMENTADAS y no borradas en el fichero que se aplica — lo que la politica declara y el kernel no puede tiene que verse. El simbolo ya entro a la receta del kernel. Y para que sobreviva al reinicio, `nftables` declara su [[service]] con `lifecycle = "oneshot"`: cargar un reglaset no es un daemon, es un acto. Va PRIMERO en el genesis — entre que la red esta y que las reglas cargan, la caja esta abierta. Probado con `nft flush ruleset` + `arjectl start`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1830,6 +1830,66 @@ El kernel ya no estorba; falta **la política**: `PoliticaEntrada` (.ron) → `g
|
||||
`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`.
|
||||
|
||||
### 6.32 🧱 El cortafuegos, puesto — y el primer baneado fui yo *(2026-09-15)*
|
||||
|
||||
La caja filtra: `table inet tawasuyu_input`, **`policy drop`**, 15 reglas de puerto, y el set `ban4`
|
||||
llenándose solo con lo que golpea desde internet. A los pocos minutos: **27 IPs baneadas y paquetes
|
||||
tirados por el contador**. Eso es el reemplazo de fail2ban funcionando sobre tráfico real, dentro del
|
||||
kernel y sin daemon.
|
||||
|
||||
La política vive en `scripts/servidor/cortafuegos-entrada.ron` (formato `PoliticaEntrada` del
|
||||
cortafuegos de tawasuyu) y declara los cinco puertos públicos: `22022` admin, `2345` git, `80`, `443`
|
||||
y `1137` el proxy. El reglaset se genera con `cortafuegos generate-input` **en el hub** —el binario es
|
||||
glibc y la caja es musl— y se aplica allá con `nft -f`.
|
||||
|
||||
#### 🧨 El primer baneado fui yo, en segundos
|
||||
|
||||
Aplicada la primera versión, desde fuera: `ssh` ✅, `https` ✅… y **`http`, el proxy y el git por SSH
|
||||
muertos**. Al minuto, la caja entera dejó de contestarme.
|
||||
|
||||
La causa no es una regla mal escrita: **el set `@ban4` es UNO SOLO para todos los servicios**, y la
|
||||
regla `ip saddr @ban4 drop` está antes que todo. O sea que pasarse de tasa en *un* puerto te tira en
|
||||
*todos*. Y el `nuevas_por_min: 5` del puerto de administración —correcto contra internet— es
|
||||
exactamente lo que **me** pasa a mí: cada comando remoto de esta sesión es una conexión nueva.
|
||||
|
||||
Lo que devolvió la máquina fue el **interruptor de hombre muerto**: antes de aplicar se deja
|
||||
programado un `nft flush ruleset` a 180 s, y sólo se desarma si la verificación desde fuera sale
|
||||
bien. Sin consola serie, esa es la diferencia entre un susto y un rescue.
|
||||
|
||||
⚠ **Y el tipo ya lo avisaba.** `PoliticaEntrada` tiene un campo `confiables` cuyo comentario dice,
|
||||
palabra por palabra, lo que me acababa de pasar: *«un `nuevas_por_min` chico en el puerto de SSH es
|
||||
exactamente lo que se quiere contra internet y exactamente lo que te deja afuera cuando el que abre
|
||||
seis sesiones en un minuto sos vos»*. Copié el `.ron` de ejemplo en vez de leer el tipo. Es
|
||||
[[lei-hasta-donde-me-daba-la-razon]] otra vez, y la cura fue una línea:
|
||||
`confiables: ["204.168.193.248", "154.197.1.13"]` — el hub y el worker, que se aceptan **antes** de
|
||||
la lógica de tasa y por lo tanto no pueden entrar al set.
|
||||
|
||||
#### Lo que este kernel todavía no puede, dicho en voz alta
|
||||
|
||||
`nft -c` rechazó **cinco reglas** antes de aplicar nada:
|
||||
|
||||
tcp dport 22022 ct count over 10 drop
|
||||
^^^^^^^^ Error: Could not process rule: No such file or directory
|
||||
|
||||
`ct count` es `CONFIG_NFT_CONNLIMIT`, que el kernel de hoy no trae (el `.config` lo dice:
|
||||
`# CONFIG_NFT_CONNLIMIT is not set`). Es el tope de conexiones **concurrentes** por servicio — el ban
|
||||
por tasa, que es lo que reemplaza a fail2ban, no depende de él. Las cinco reglas quedan
|
||||
**comentadas, no borradas**, en el fichero que se aplica: *lo que la política declara y el kernel no
|
||||
puede tiene que verse*. El símbolo ya entró a `recipes/linux-generic.toml` y vuelve con el próximo
|
||||
kernel; hasta entonces el mensaje —que no nombra la opción que falta— queda explicado ahí mismo.
|
||||
|
||||
#### Que sobreviva al reinicio: un servicio `oneshot`
|
||||
|
||||
`recipes/nftables.toml` declara ahora su `[[service]]` con `lifecycle = "oneshot"`: **cargar un
|
||||
reglaset no es un daemon, es un acto**. Va **primero en el genesis**, antes que sshd y los demás:
|
||||
entre que la red está y que las reglas cargan, la caja está abierta, y ese hueco se hace lo más
|
||||
corto posible. Probado de verdad — `nft flush ruleset` y después `arjectl start cortafuegos`: las 15
|
||||
reglas vuelven.
|
||||
|
||||
Su guarda sale **78 nombrando el fichero** si el reglaset no está, en vez de dejar la caja sin
|
||||
filtrar creyendo que está protegida: *un cortafuegos ausente y uno vacío se ven igual desde afuera
|
||||
hasta que alguien prueba*.
|
||||
|
||||
## 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:
|
||||
|
||||
Reference in New Issue
Block a user