Firewalls: iptables, nftables, ufw, firewalld
Introducción
Linux ofrece varias herramientas para filtrar el tráfico de red. iptables es la herramienta clásica
del kernel; nftables es su sucesor moderno. ufw
(Ubuntu/Debian) y firewalld (Red Hat/CentOS) son frontends que simplifican la gestión de reglas.
iptables — El firewall clásico
Conceptos fundamentales:
- Tablas:
filter(por defecto),nat,mangle - Cadenas:
INPUT(tráfico entrante al sistema),OUTPUT(saliente desde el sistema),FORWARD(tráfico que pasa por el sistema) - Targets:
ACCEPT,DROP(silencioso),REJECT(responde con error)
# Ver reglas actuales
iptables -L -v --line-numbers
iptables -L INPUT -v --line-numbers # solo cadena INPUT
# Política por defecto de una cadena
iptables -P INPUT DROP # descartar todo lo entrante por defecto
iptables -P OUTPUT ACCEPT # aceptar todo lo saliente
iptables -P FORWARD DROP
# Permitir conexiones establecidas y relacionadas
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Permitir loopback
iptables -A INPUT -i lo -j ACCEPT
# Permitir SSH (puerto 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Permitir HTTP y HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Permitir ICMP (ping)
iptables -A INPUT -p icmp -j ACCEPT
# Bloquear una IP específica
iptables -A INPUT -s 10.0.0.5 -j DROP
# Limitar intentos de conexión (protección contra fuerza bruta)
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
# Eliminar una regla por número de línea
iptables -D INPUT 3
# Insertar regla en posición específica
iptables -I INPUT 1 -i lo -j ACCEPT
# Vaciar todas las reglas
iptables -F
# Guardar y restaurar reglas
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
nftables — El sucesor moderno
nftables reemplaza a iptables en distribuciones modernas (Debian 10+, RHEL 8+). Unifica
tablas IPv4 e IPv6 y tiene una sintaxis más coherente.
# Ver el conjunto de reglas completo
nft list ruleset
# Fichero de configuración persistente
# /etc/nftables.conf
# Ejemplo de configuración básica en /etc/nftables.conf:
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Conexiones establecidas
ct state established,related accept
# Loopback
iif lo accept
# SSH
tcp dport 22 accept
# HTTP y HTTPS
tcp dport { 80, 443 } accept
# ICMP
icmp type echo-request accept
icmpv6 type echo-request accept
}
chain output {
type filter hook output priority 0; policy accept;
}
chain forward {
type filter hook forward priority 0; policy drop;
}
}
# Aplicar y habilitar
nft -f /etc/nftables.conf
systemctl enable --now nftables
# Comandos útiles
nft add rule inet filter input tcp dport 8080 accept
nft delete rule inet filter input handle 5 # eliminar regla por handle
nft flush ruleset # vaciar todo
ufw — Frontend simple (Ubuntu/Debian)
ufw (Uncomplicated Firewall) ofrece una interfaz sencilla sobre iptables/nftables. Ideal para servidores con necesidades básicas.
# Estado del firewall
ufw status
ufw status verbose
ufw status numbered # con números de regla
# Habilitar/deshabilitar
ufw enable
ufw disable
# Política por defecto (antes de habilitar)
ufw default deny incoming
ufw default allow outgoing
# Permitir servicios por nombre
ufw allow ssh # equivale a tcp/22
ufw allow http # 80/tcp
ufw allow https # 443/tcp
# Permitir por puerto y protocolo
ufw allow 8080/tcp
ufw allow 53/udp
# Permitir desde una IP específica
ufw allow from 192.168.1.0/24
ufw allow from 10.0.0.5 to any port 22
# Denegar
ufw deny 23/tcp
ufw deny from 203.0.113.0/24
# Eliminar reglas
ufw delete allow http
ufw delete 3 # eliminar regla número 3
# Resetear todas las reglas
ufw reset
# Logs
ufw logging on
ufw logging medium # niveles: off, low, medium, high, full
tail -f /var/log/ufw.log
firewalld — Frontend con zonas (Red Hat/CentOS)
firewalld organiza las reglas en zonas (public, internal, dmz, trusted…) y las interfaces
de red se asignan a una zona. Las reglas sin --permanent son temporales; con --permanent persisten tras reboot (requieren --reload).
# Estado y zonas
firewall-cmd --state
firewall-cmd --get-active-zones
firewall-cmd --list-all # zona por defecto
firewall-cmd --list-all --zone=public
# Zona por defecto
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public
# Permitir servicios (temporal)
firewall-cmd --add-service=ssh
firewall-cmd --add-service=http
firewall-cmd --add-service=https
# Permitir servicios (permanente)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload # aplicar cambios permanentes
# Permitir por puerto
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-port=53/udp
# Eliminar servicio
firewall-cmd --permanent --remove-service=telnet
# Bloquear una IP (rich rule)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" drop'
# Ver servicios disponibles
firewall-cmd --get-services
# Activar el servicio
systemctl enable --now firewalld
¿Qué herramienta usar?
- ufw → servidores Ubuntu/Debian con necesidades simples. Fácil de usar.
- firewalld → sistemas Red Hat, CentOS, Fedora, Rocky Linux. Gestión por zonas.
- nftables directo → cuando se necesita control total o en sistemas embebidos.
- iptables → sistemas legados o scripts que aún lo requieran. Evitar en sistemas nuevos.
No mezclar ufw/firewalld con iptables/nftables directamente
en el mismo sistema.