La regla que nunca disparaThe rule that never fires
No es la sintaxis: es el orden. Y el orden es invisible en un fichero de texto.Not syntax — order. And order is invisible in a text file.
table inet filter { chain input { type filter hook input priority filter; policy drop; ct state established,related counter accept tcp dport { 80, 443 } counter accept ip saddr 10.10.0.0/24 tcp dport 443 acceptno puede casar jamáscan never match } }
Todo lo que la última regla aceptaría, la de encima ya lo aceptó. Aquí, con cuatro reglas, se ve. Ahora ponla en la línea 411 de 800, detrás de dos jump, en una tabla que heredaste. Nada está roto, nft -c la da por buena — y la regla simplemente está muerta.
Everything the last rule would accept, the one above already accepted. With four rules you can see it. Now put it at line 411 of 800, behind two jumps, in a table you inherited. Nothing is broken, nft -c is happy — and the rule is simply dead.
Empieza desde una tabla vacía, no un fichero en blancoStart from an empty table, not a blank file
Un editor completo: compón tablas, cadenas y reglas eligiendo hooks, prioridades, coincidencias y veredictos de menús. Lo que emite es exactamente el nft que habrías escrito tú.A full editor: compose tables, chains and rules by picking hooks, priorities, matches and verdicts from menus. What it emits is exactly the nft you would have written by hand.
Qué hace eFeFlowWhat eFeFlow does
Todo se deriva de tus reglas, nunca se escribe a mano. Y todo es deshacible.Everything is derived from your rules, never authored — and all of it is undoable.
Construye desde ceroBuild from scratch
Parte de una tabla vacía y compón tablas, cadenas y reglas visualmente. eFeFlow escribe el nft correcto según avanzas. Ni fichero en blanco ni sintaxis que memorizar.Start from an empty table and compose tables, chains and rules visually. eFeFlow writes correct nft as you go. No blank file, no syntax to memorise.
Simula un paqueteSimulate a packet
Descríbelo, míralo recorrer tus cadenas regla a regla por cada hook, y ve exactamente cuál lo decide: el mismo veredicto que produce tu ruleset exportado.Describe one, watch it walk your chains rule by rule through every hook, and see exactly which rule decides it — the same verdict your exported ruleset produces.
Encuentra reglas que nunca casanFind rules that can never match
Reglas eclipsadas, destinos DNAT en conflicto, cadenas que confían en conntrack pero nunca descartan invalid — deducido de tus reglas, nunca supuesto.Shadowed rules, conflicting DNAT targets, chains that trust conntrack but never drop invalid — derived from your rules, never guessed.
Importa lo que ya corresImport what you already run
Pega nft list ruleset y te demuestra el round-trip línea a línea antes de importar nada. El porcentaje no es una promesa, es una prueba.Paste nft list ruleset and it proves the round-trip line by line before importing a thing. The percentage isn't a promise, it's proof.
Aplica con redApply with a net
El rollback commit-confirm se arma en el firewall, así que la regla que te corta el acceso no puede impedirte deshacerla. No vuelvas a dejarte fuera.The commit-confirm rollback arms on the firewall, so the rule that cuts you off cannot stop you undoing it. Never lock yourself out again.
Exporta nft de verdadExport real nft source
No un formato propio. Lo que sale es exactamente lo que habrías escrito a mano, con cuatro formatos de exportación.Not a config format of its own. What comes out is exactly what you'd have written by hand — with four export formats.
¿Qué regla va a aceptar este paquete?Which rule is going to accept this packet?
Describe el paquete y míralo ir: hook a hook, cadena a cadena, regla a regla, hasta un veredicto.Describe the packet and watch it go — hook by hook, chain by chain, rule by rule, to a verdict.
La regla que no sabías que estaba muertaThe rule you didn't know was dead
Se deduce por subsunción: la regla A eclipsa a la B cuando todo paquete que casa con B ya casa con A, y A va antes y es terminal.Worked out by subsumption: rule A shadows B when every packet matching B already matches A, and A comes first and is terminal.
- Shadowed — una regla que ya decide otra anteriora rule an earlier one already decides
- Conflict — reglas DNAT solapadas con destinos distintosoverlapping DNAT rules with different targets
- Dormant — una tabla entera cargada y sin aplicarsea whole table loaded and not running
- Unbounded set — un set que llena el tráfico sin
sizenitimeouta set filled by traffic with nosizeortimeout - Full set — un set al 90% de su
size, tras el cual el kernel rechaza en silencioa set at 90% of itssize, past which the kernel silently refuses - Merge — reglas que solo difieren en el puerto, sustituibles por un setrules differing only by port, replaceable by one set lookup
- Unused — un set cargado que ninguna regla consumea set loaded that no rule consumes
- Hardening — una cadena que confía en conntrack y nunca descarta
invalida chain that trusts conntrack but never dropsinvalid - Resilience — una regla de log sin límite de tasaa log rule with no rate limit
- Cold — reglas que, según el kernel, no han casado nadarules the kernel says have matched nothing
Las mismas preguntas, sin ventanaThe same questions, without a window
Todo lo que decide algo vive en src/core/ y nunca toca el DOM — así el mismo motor entra en tu CI, antes de que un ruleset llegue a una máquina.Everything that decides anything lives in src/core/ and never touches the DOM — so the same engine drops into your CI, before a ruleset reaches a machine.
$ efeflow lint fw.nft fw.nft:103 error conflict Conflicting DNAT targets for the same destination port ip saddr 198.51.100.0/24 tcp dport 8443 dnat to 10.20.0.31:443 fw.nft:71 warn shadowed Rule 11 is shadowed by rule 9 and can never match ip saddr 10.10.0.0/24 tcp dport 443 accept 31 rules in 7 chains across 2 tables · round-trip 75/75 = 100% 1 error 2 warnings 3 hints
--json para lo que no es una persona, --fail-on error|warn|hint para mover el umbral. No sustituye a nft -c, y no lo pretende — donde el de verdad existe, se lo pasa.--json for what isn't a person, --fail-on error|warn|hint to move the threshold. It doesn't replace nft -c, and doesn't pretend to — where the real thing exists, it hands off to it.
Aplicar sin miedoApply without fear
La regla que te deja fuera no puede impedirte deshacerlaThe rule that locks you out can't stop you undoing it
Aplicar es la única operación que puede dejarte fuera de una máquina. Y tiene una forma cruel: la regla que te corta el acceso es la que te impide revertirla. Por eso la red de seguridad no vive en esta ventana; se arma en el propio firewall.Applying is the one operation that can lock you out of a machine — and it fails cruelly: the rule that cuts your access is the one that stops you reverting it. So the safety net doesn't live in this window; it arms on the firewall itself.
nft -c antes de escribir un byte.The real apply dialog. All three guarantees in one window: replaces only your tables, rolls itself back after 60s unless you confirm, and runs nft -c before a byte is written.Rollback en la máquinaRollback on the machine
Antes de escribir nada, eFeFlow copia allí el ruleset en marcha y lanza un temporizador desacoplado que lo restaura salvo que confirmes. Conservar lo aplicado es deliberado; perder la conexión, la ventana o el portátil lo revierte. Los routers lo llaman commit-confirm desde hace treinta años.Before writing anything, eFeFlow copies the running ruleset there and starts a detached timer that restores it unless you confirm. Keeping a change is deliberate; losing the connection, the window or the laptop reverts it. Routers have called it commit-confirm for thirty years.
Solo tus tablasOnly your tables
Reemplaza solo las tablas de tu proyecto, no flush ruleset — que en una máquina con Docker, libvirt, kubernetes o fail2ban borraría las suyas sin que nadie las reponga.It replaces only your project's tables, never flush ruleset — which on a box also running Docker, libvirt, kubernetes or fail2ban would wipe theirs with nothing to put them back.
nft -c primeronft -c first
Se ejecuta en la máquina antes de escribir un solo byte, y se niega por ti si algo no cuadra. Nada llega a producción si no lo pides tú.It runs on the machine before a single byte is written, and refuses on your behalf if something is off. Nothing reaches production unless you ask.
Beta, pero ya no sin kilometrajeBeta — but no longer with no mileage
Se descargaron 4.337 rulesets de repositorios públicos; los 3.038 que nft acepta se cargaron en una instancia de netfilter vacía y se listaron de vuelta. El nuestro se cargó igual, y el kernel no distingue los dos listados. El corpus encontró 18 fallos reales, y prueba también los hallazgos: por cada regla que el analizador da por muerta, el simulador construye un paquete y la comprueba. Discreparon cero. Trata lo que genera como un borrador que revisas; valida con nft -c antes de aplicar.4,337 rulesets were fetched from public repos; the 3,038 nft accepts were loaded into an empty netfilter instance and listed back — ours loaded the same way, and the kernel can't tell the two listings apart. The corpus found 18 real defects, and it proves the findings too: for every rule the analyser calls dead, the simulator builds a packet and checks it. They disagreed zero times. Treat what it generates as a draft you review; validate with nft -c before applying.
DescargarDownload
Libre y de código abierto bajo licencia MIT. App de escritorio nativa para cada plataforma.Free and open source under the MIT licence. Native desktop app for every platform.