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:
- Permitir SSH (y si puedes, cambiarlo a un puerto no estándar)
- Permitir HTTP/HTTPS
- Bloquear todo lo demás por defecto
- Activar logging si lo necesitas
- 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+enablesin 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

