Parte: 1 — Redes y seguridad de redes · Fuente: Documentación del kernel Linux (netfilter); Michael Lucas, PF/firewalls ⏱️ Duración estimada: 130 min · Nivel: Intermedio
Entender los tipos de firewall (sin estado, con estado, de aplicación) y construir conjuntos de reglas reales en Linux con iptables y su sucesor nftables. El alumno aprenderá a filtrar tráfico por defecto-denegar, permitir servicios concretos, hacer seguimiento de conexiones y a persistir y auditar las reglas.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Tipos de firewall | Elegir la tecnología adecuada |
| 2 | Arquitectura netfilter | Entender dónde actúa cada regla |
| 3 | Tablas y cadenas (filter, nat) | Ubicar la lógica correcta |
| 4 | Estados de conexión (conntrack) | Reglas simples y seguras |
| 5 | Política por defecto | Base de un firewall robusto |
| 6 | nftables vs. iptables | Sintaxis moderna unificada |
| 7 | Persistencia y logging | Reglas duraderas y auditables |
Un firewall sin estado juzga cada paquete por separado: mira direcciones, puertos y flags, y decide. Suena razonable hasta que intentas escribir una regla para "permitir que mis usuarios naveguen". Sin estado necesitas dos reglas —salida al 443 y entrada desde el 443— y esa segunda regla abre un agujero enorme, porque cualquier atacante que ponga el 443 como puerto de origen atraviesa tu filtro. Un firewall con estado en cambio recuerda las conexiones que ha visto nacer, y por eso puede expresar la intención real: "permite lo que salga y lo que sea respuesta a algo que salió".
En Linux esa memoria es conntrack, y clasifica cada paquete en cuatro estados.
NEW es un intento de conexión nuevo. ESTABLISHED pertenece a una conexión ya
aceptada. RELATED es tráfico asociado a otra conexión existente —el caso clásico es
el canal de datos de FTP, o un ICMP unreachable que corresponde a una conexión
conocida—. E INVALID es lo que no encaja en ningún flujo conocido y casi siempre se
descarta. Con esas cuatro piezas, un firewall de host completo cabe en cuatro reglas, y
eso no es una simplificación de manual: es la forma correcta de escribirlo.
iptables y nftables no son el firewall: son la interfaz para programar
netfilter, el subsistema del kernel que intercepta los paquetes en cinco puntos
—PREROUTING, INPUT, FORWARD, OUTPUT y POSTROUTING—. Saber en qué gancho actúa
cada cadena es lo que evita el desconcierto más común del principiante: una regla en
INPUT no filtra el tráfico que el equipo enruta hacia otra máquina, porque ese
tráfico pasa por FORWARD y nunca toca INPUT. Del mismo modo, el NAT de destino se
hace en PREROUTING —antes de decidir la ruta, porque cambia el destino— y el NAT de
origen en POSTROUTING, justo antes de salir.
Las reglas se evalúan en orden dentro de cada cadena y la primera coincidencia
decide, así que el orden no es un detalle de estilo: una regla permisiva colocada arriba
anula todo lo que venga después. Y al final está la política por defecto, que en un
firewall serio es DROP: se deniega todo y se abre lo justificado, no al revés.
Escribir la política de INPUT en DROP sin haber permitido antes el tráfico
ESTABLISHED y el interfaz de loopback es, por cierto, la forma más rápida y clásica
de perder el acceso SSH a un servidor remoto.
nftables sustituye a la familia entera de herramientas antiguas —iptables,
ip6tables, arptables, ebtables— por una sola sintaxis y un solo motor. Sus mejoras
no son cosméticas: los conjuntos (sets) y mapas permiten expresar "estos
cuarenta puertos" o "estas redes" en una única regla en lugar de cuarenta, con
evaluación eficiente en lugar de lineal; una misma tabla inet cubre IPv4 e IPv6 sin
duplicar el conjunto de reglas —y olvidar IPv6 es un agujero real, porque un servidor
con IPv6 activo y sin filtrar está expuesto aunque su IPv4 esté impecable—; y las
actualizaciones son atómicas, así que no hay ventana con el firewall a medio cargar.
Dos hábitos completan el cuadro. Persistencia: las reglas viven en memoria y
desaparecen al reiniciar, así que hay que guardarlas explícitamente
(nft list ruleset > /etc/nftables.conf, iptables-save, o el mecanismo de la
distribución). Y logging: registrar lo que se descarta, con límite de tasa para no
inundar el disco, es lo que convierte al firewall en una fuente de detección y no solo
en un muro mudo.
NEW, ESTABLISHED, RELATED); es el estándar actual.INPUT, OUTPUT, FORWARD).DROP en INPUT/FORWARD.| Término | Definición concisa |
|---|---|
| Firewall sin estado | Juzga cada paquete de forma aislada; exige reglas de vuelta inseguras |
| Firewall con estado | Recuerda las conexiones vistas y permite sus respuestas |
| conntrack | Subsistema del kernel Linux que sigue el estado de las conexiones |
NEW |
Paquete que inicia una conexión nueva |
ESTABLISHED |
Paquete perteneciente a una conexión ya aceptada |
RELATED |
Tráfico asociado a otra conexión (datos de FTP, ICMP correspondiente) |
INVALID |
Paquete que no encaja en ningún flujo conocido; se descarta |
| netfilter | Subsistema del kernel que intercepta paquetes; el motor real |
PREROUTING / POSTROUTING |
Ganchos antes y después de la decisión de ruta (NAT) |
INPUT / OUTPUT / FORWARD |
Tráfico hacia, desde y a través del equipo |
| Política por defecto | Veredicto si ninguna regla coincide; en un firewall serio, DROP |
| DROP vs. REJECT | Descartar en silencio o responder con un error explícito |
| nftables | Sustituto moderno y unificado de iptables/ip6tables/arptables/ebtables |
| Set / mapa | Estructura de nftables que agrupa puertos o redes en una sola regla |
Tabla inet |
Tabla de nftables que cubre IPv4 e IPv6 con un solo conjunto de reglas |
sudo apt install iptables nftables.sudo apt install conntrack.iptables-persistent (Debian/Ubuntu) o servicio nftables.⚠️ Nota: trabaja en una VM con consola alternativa (no solo SSH). Ten a mano una tarea programada que limpie las reglas por si te bloqueas:
bash echo "iptables -F" | at now + 5 minutes
bash
sudo iptables -L -n -v
bash
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
bash
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
bash
sudo iptables -A INPUT -j LOG --log-prefix "FW-DROP: " --log-level 4
sudo iptables -P INPUT DROP
bash
sudo conntrack -L
bash
sudo netfilter-persistent save
bash
sudo nft add table inet filtro
sudo nft add chain inet filtro entrada '{ type filter hook input priority 0; policy drop; }'
bash
sudo nft add rule inet filtro entrada iif lo accept
sudo nft add rule inet filtro entrada ct state established,related accept
sudo nft add rule inet filtro entrada tcp dport {22, 80} ct state new accept
sudo nft add rule inet filtro entrada log prefix "FW-DROP: " drop
bash
sudo nft list ruleset | sudo tee /etc/nftables.conf
sudo systemctl enable --now nftables
-s 192.168.56.0/24).-m limit o ct count) para mitigar fuerza bruta.journalctl -k.conntrack -E para observar en vivo la creación y cierre de conexiones.Configura en una VM un firewall stateful con política por defecto-denegar en INPUT que permita: loopback, conexiones establecidas, SSH solo desde tu subred de laboratorio y HTTP desde cualquier origen; registra y descarta el resto. Entrega el ruleset (nft list ruleset o iptables-save) y una evidencia de que un escaneo Nmap externo solo ve los puertos permitidos.
Criterio de aceptación: desde otra VM, nmap -Pn muestra 22 (solo desde la subred autorizada) y 80 abiertos y el resto filtered; los intentos denegados aparecen en el log del kernel.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
Te quedas sin SSH al aplicar -P INPUT DROP |
No permitiste established/SSH antes de la política; añade esas reglas primero y usa un at de rescate |
| Reglas se pierden al reiniciar | No persististe; usa netfilter-persistent save o /etc/nftables.conf |
| El orden de las reglas no funciona | Las cadenas se evalúan de arriba a abajo; coloca los ACCEPT específicos antes del DROP general |
| iptables y nftables se pisan | Ambos activos a la vez; en sistemas modernos usa solo nftables (iptables suele ser el backend nft) |
| Logging llena el disco | Sin límite de tasa en LOG; añade -m limit --limit 5/min |
❓ ¿iptables está obsoleto?
Está siendo reemplazado por nftables, que es el framework recomendado. En muchas distros iptables ya es un frontend sobre nftables. Aprende ambos: verás iptables en sistemas heredados.
❓ ¿Qué es conntrack y por qué importa? Es el subsistema de seguimiento de conexiones. Permite escribir reglas simples ("permite lo establecido") en lugar de reglas espejo para cada dirección del tráfico.
❓ ¿Dónde va la política por defecto?
Al final. Primero los ACCEPT específicos y las reglas de established; la última palabra es DROP para todo lo no permitido.
❓ ¿Un firewall de host reemplaza al perimetral? No, se complementan. Defensa en profundidad: firewall perimetral + firewall de host + segmentación.
iptables(8), nft(8), conntrack(8).Clase 033 — Enumeración de servicios de red