linux

UFW e iptables en Linux: qué son, diferencias y cómo usarlos bien

Cuando hablamos de seguridad en Linux, una de las primeras capas que conviene entender es el firewall. En la práctica, el control del tráfico de red (entrante/saliente) en Linux suele terminar pasando por netfilter, y dos nombres aparecen siempre:

  • iptables: la herramienta “clásica” (muy potente y flexible).
  • UFW (Uncomplicated Firewall): una interfaz simple para configurar reglas de firewall sin pelearte con demasiados detalles.

La duda típica es: ¿uso UFW o iptables? La respuesta correcta suele ser: depende de lo que necesites, pero es clave entender la relación entre ambos.


¿Qué es iptables?

iptables es una herramienta de línea de comandos que permite administrar reglas de filtrado de paquetes en Linux a través de netfilter (en el kernel). Con iptables puedes definir reglas precisas para:

  • permitir/bloquear tráfico por puerto, protocolo (TCP/UDP), IP origen/destino
  • manejar reglas de NAT (por ejemplo, para enmascaramiento/masquerade)
  • registrar eventos (logging)
  • construir políticas complejas con cadenas personalizadas

Concepto clave: tablas, cadenas y reglas

  • Tablas: conjuntos de reglas por propósito.
    • filter (filtrado normal: permitir/bloquear)
    • nat (traducción de direcciones)
    • mangle (modificar paquetes)
  • Cadenas: puntos del flujo por donde pasan los paquetes.
    • INPUT (paquetes que entran al servidor)
    • OUTPUT (paquetes que salen del servidor)
    • FORWARD (paquetes que atraviesan el servidor)

iptables te da control total, pero esa potencia implica más complejidad y más riesgo de equivocarte.


¿Qué es UFW?

UFW significa Uncomplicated Firewall. Es una herramienta pensada para configurar un firewall de forma simple.

En la mayoría de casos, UFW:

  • te evita escribir reglas largas,
  • te permite habilitar/deshabilitar reglas rápido,
  • y te entrega un enfoque más “administrable” para servidores comunes.

Importante: UFW no es “otro firewall distinto” al kernel: normalmente termina generando reglas que se aplican a nivel del sistema (a través de netfilter/iptables en muchos entornos).


Diferencias rápidas: ¿cuándo usar cada uno?

Usa UFW si:

  • quieres seguridad básica y clara (SSH, HTTP/HTTPS, bases de datos restringidas)
  • quieres administrar rápido sin memorizar sintaxis compleja
  • no necesitas reglas avanzadas (NAT sofisticado, marks, etc.)

Usa iptables si:

  • necesitas reglas muy específicas o avanzadas
  • vas a trabajar NAT/forwarding intensivo (routers, gateways)
  • necesitas performance/optimización fina o cadenas personalizadas complejas
  • estás integrando reglas con otras herramientas o scripts a bajo nivel

Flujo recomendado en un servidor típico

Si estás montando un VPS/servidor para web:

  1. Permitir SSH (y si puedes, cambiarlo a un puerto no estándar)
  2. Permitir HTTP/HTTPS
  3. Bloquear todo lo demás por defecto
  4. Activar logging si lo necesitas
  5. Mantener reglas mínimas y entendibles

Esto con UFW es muy fácil.


Ejemplos prácticos con UFW

Ver estado y reglas

sudo ufw status verbose
sudo ufw status numbered

Políticas por defecto (buena base)

sudo ufw default deny incoming
sudo ufw default allow outgoing

Permitir SSH (muy recomendado antes de activar)

sudo ufw allow OpenSSH
# o si usas puerto específico:
sudo ufw allow 22/tcp

Permitir HTTP y HTTPS

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Activar UFW

sudo ufw enable

Permitir acceso a un puerto solo desde una IP (ej: MariaDB solo desde tu backend)

sudo ufw allow from 203.0.113.10 to any port 3306 proto tcp

Bloquear un puerto

sudo ufw deny 8080/tcp

Eliminar reglas por número

sudo ufw status numbered
sudo ufw delete 3

Ejemplos equivalentes en iptables

Nota: la sintaxis de iptables es más larga, pero verás el nivel de control.

Política por defecto (bloquear entrada)

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

Permitir loopback (recomendado)

sudo iptables -A INPUT -i lo -j ACCEPT

Permitir conexiones ya establecidas

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Permitir SSH

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Permitir HTTP/HTTPS

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Bloquear un puerto

sudo iptables -A INPUT -p tcp --dport 8080 -j DROP

Persistencia: el “detalle” que rompe a muchos

Una trampa típica: las reglas de iptables pueden perderse tras reiniciar si no las guardas con un mecanismo de persistencia.

En distros basadas en Debian/Ubuntu, se suele usar:

  • iptables-persistent / netfilter-persistent

Con UFW, normalmente las reglas se mantienen porque UFW gestiona su configuración y se levanta al iniciar, pero igual conviene validar.


Buenas prácticas para no quedarte sin acceso (bloquearte el SSH)

  • Antes de activar reglas restrictivas, permite SSH.
  • Si estás remoto: aplica cambios con cuidado, y valida en otra sesión SSH.
  • Evita hacer deny incoming + enable sin permitir SSH.
  • Si cambias el puerto de SSH, asegúrate de abrir el nuevo puerto antes de cerrar el anterior.

¿Entonces cuál conviene?

Si tu objetivo es proteger un servidor (web, API, apps, etc.) y mantenerlo fácil de administrar, UFW suele ser suficiente y reduce errores.

Si estás en un escenario de red más complejo (NAT, gateway, reglas avanzadas), iptables te da el control que necesitas.

En un entorno real, muchos equipos usan:

  • UFW para el firewall del host
  • y iptables (o herramientas avanzadas) cuando se requiere algo más específico.

Checklist mínimo recomendado (servidor web)

  • Denegar todo entrante por defecto
  • Permitir SSH (idealmente restringido por IP si puedes)
  • Permitir 80/443
  • Revisar reglas (status verbose)
  • Confirmar persistencia tras reinicio
  • Mantener reglas simples y documentadas