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:
@@ -0,0 +1,86 @@
|
||||
(
|
||||
// Política de ENTRADA de la caja `takana` (2.29.29.217) — SDD 28 §6.32.
|
||||
// Formato: `PoliticaEntrada` del cortafuegos de tawasuyu (shared/cortafuegos/SDD-ENTRADA.md).
|
||||
//
|
||||
// cortafuegos generate-input --policy scripts/servidor/cortafuegos-entrada.ron
|
||||
// cortafuegos check-input --policy … (valida con `nft -c`)
|
||||
// cortafuegos apply-input --policy … --yes (root; deniega TODO lo no listado)
|
||||
//
|
||||
// ⚠️ APLICAR ESTO SIN RED DE SEGURIDAD PUEDE DEJARTE FUERA: la caja NO tiene consola serie
|
||||
// (hcloud), así que una regla mal puesta sólo se arregla por `hcloud server enable-rescue`.
|
||||
// Se aplica con interruptor de hombre muerto: aplicar → comprobar desde fuera → confirmar, y
|
||||
// si nadie confirma, un `nft flush ruleset` programado devuelve la máquina a como estaba.
|
||||
//
|
||||
// Esto es lo que REEMPLAZA a fail2ban, que no se mudó de gioser: el ban por IP lo hace el
|
||||
// kernel con sets dinámicos, sin daemon que lea logs. Necesita `CONFIG_NF_TABLES` — el kernel
|
||||
// de la caja no lo traía y por eso hubo que reconstruirlo (§6.30/§6.31).
|
||||
// ── QUIÉN NUNCA SE BANEA ────────────────────────────────────────────────────────────────
|
||||
// ⚠️ MEDIDO EL 2026-09-15, Y EL TIPO YA LO AVISABA: sin esto, el primer baneado fui yo. El
|
||||
// `nuevas_por_min: 5` de administración es lo correcto contra internet y es exactamente lo que
|
||||
// te deja afuera cuando el que abre seis sesiones por minuto sos vos — cada comando remoto es
|
||||
// una conexión nueva. Y como el set `@ban4` es UNO SOLO para todos los servicios, caer en él
|
||||
// por el puerto de ssh te tira TAMBIÉN el https, el proxy y el git: el `ip saddr @ban4 drop`
|
||||
// está antes que todo. La caja quedó inaccesible en segundos y la devolvió el interruptor de
|
||||
// hombre muerto.
|
||||
//
|
||||
// `confiables` acepta ANTES de la lógica de tasa, así que estas fuentes no pueden entrar al set.
|
||||
confiables: [
|
||||
// gioser: el hub que administra, cosecha y respalda esta caja. Se va a borrar cuando la
|
||||
// mudanza termine, y entonces esta línea sale con él.
|
||||
"204.168.193.248",
|
||||
// dev.gioser.net: el worker de la granja.
|
||||
"154.197.1.13",
|
||||
],
|
||||
drop_estados_invalidos: true,
|
||||
icmp_echo_por_seg: 10,
|
||||
syn_nuevas_por_seg: 200,
|
||||
servicios: [
|
||||
(
|
||||
puerto: 22022,
|
||||
proto: Tcp,
|
||||
descripcion: "ssh de ADMINISTRACIÓN — el único acceso a la caja",
|
||||
// Apretado a propósito: por acá no entra nadie más que el operador, y es el puerto
|
||||
// que fail2ban cuidaba en gioser.
|
||||
conexiones_max: 10,
|
||||
nuevas_por_min: 5,
|
||||
ban_timeout_seg: 600,
|
||||
),
|
||||
(
|
||||
puerto: 2345,
|
||||
proto: Tcp,
|
||||
descripcion: "ssh del gitea (git clone/push)",
|
||||
// Más holgado que el de administración: un `git clone` abre varias conexiones y los
|
||||
// clones legítimos vienen a ráfagas.
|
||||
conexiones_max: 20,
|
||||
nuevas_por_min: 15,
|
||||
ban_timeout_seg: 600,
|
||||
),
|
||||
(
|
||||
puerto: 80,
|
||||
proto: Tcp,
|
||||
descripcion: "http — caddy (redirección y ACME)",
|
||||
conexiones_max: 200,
|
||||
nuevas_por_min: 60,
|
||||
ban_timeout_seg: 600,
|
||||
),
|
||||
(
|
||||
puerto: 443,
|
||||
proto: Tcp,
|
||||
descripcion: "https — los siete dominios mudados",
|
||||
conexiones_max: 200,
|
||||
nuevas_por_min: 120,
|
||||
ban_timeout_seg: 600,
|
||||
),
|
||||
(
|
||||
puerto: 1137,
|
||||
proto: Tcp,
|
||||
descripcion: "squid — el proxy de salida, con usuarios reales detrás",
|
||||
// ⚠️ EL MÁS HOLGADO DE TODOS, Y NO ES DESCUIDO: cada pestaña de un navegador es un
|
||||
// CONNECT nuevo. Un límite pensado para ssh acá BANEA A UN USUARIO LEGÍTIMO, que es
|
||||
// peor que no tener regla — el abuso que esto para es un flood, no un navegador.
|
||||
conexiones_max: 300,
|
||||
nuevas_por_min: 300,
|
||||
ban_timeout_seg: 300,
|
||||
),
|
||||
],
|
||||
)
|
||||
Reference in New Issue
Block a user