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.

Antes de activar un firewall en un servidor remoto, asegurarse de que SSH queda permitido. Probar siempre con reglas temporales antes de hacerlas permanentes. En caso de bloqueo accidental, un acceso físico o consola KVM permite recuperar el sistema.

Fail2ban: instalación, jail.local, filtros y acciones

Índice de la sección

Índice del curso