UFW o Firewalld: cuál elegir en 30 segundos
Usa UFW si administras Debian o Ubuntu y necesitas reglas simples; usa Firewalld si trabajas con AlmaLinux, Rocky Linux o RHEL, o si necesitas aplicar reglas distintas según la interfaz de red. Ambas herramientas producen el mismo resultado final —reglas de nftables en el kernel— y la elección es más una cuestión de qué viene preinstalado en tu distribución que de capacidad técnica.
| Criterio | UFW | Firewalld | nftables directo |
|---|---|---|---|
| Distribución típica | Debian, Ubuntu | AlmaLinux, Rocky, RHEL, Fedora | Cualquiera |
| Modelo mental | Lista de reglas permitir/denegar | Zonas asignadas a interfaces | Tablas, cadenas y reglas |
| Aplicar cambios | Inmediato | --permanent + --reload | Inmediato |
| Curva de aprendizaje | Baja | Media | Alta |
| Reglas por origen de red | Sí, por regla | Sí, es el concepto central | Total |
| Recarga sin cortar conexiones | Sí | Sí | Sí |
| Cuándo conviene | Un servidor, pocos servicios | Varias interfaces o redes internas | Reglas que las otras dos no expresan |
Si tu servidor expone solo SSH, HTTP y HTTPS —el caso de la mayoría de servidores VPS— UFW cubre todo lo que necesitas y con menos oportunidades de equivocarte. Firewalld gana cuando el mismo servidor tiene una interfaz pública y otra privada, y quieres que la red interna tenga permisos que la pública no tiene.
El orden que evita que te quedes fuera del servidor
Permite SSH primero, activa el firewall después. Siempre en ese orden. UFW aplica por defecto la política de denegar todo el tráfico entrante, así que si ejecutas ufw enable antes de crear la regla de SSH, tu sesión actual se corta y no puedes volver a conectarte. El propio comando avisa con el mensaje «Command may disrupt existing ssh connections. Proceed with operation (y|n)?», y esa advertencia es literal.
La secuencia segura en Ubuntu o Debian es esta:
sudo ufw allow OpenSSH
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable Después de activarlo, abre una segunda terminal y conéctate por SSH sin cerrar la primera. Si la nueva conexión funciona, las reglas están bien. Si no, todavía tienes la sesión original abierta para ejecutar sudo ufw disable y volver atrás. Cerrar la única sesión que tienes antes de comprobar que puedes abrir otra es la forma más habitual de perder un servidor.
Un truco adicional para servidores remotos sin consola de rescate: programa un desactivado automático antes de tocar nada. Si te bloqueas, el firewall se apaga solo a los cinco minutos y recuperas el acceso.
echo "ufw disable" | sudo at now + 5 minutes Si todo salió bien, cancela ese trabajo pendiente con sudo atq para ver su número y sudo atrm <número> para eliminarlo.
Instalar UFW y Firewalld
UFW viene preinstalado en Ubuntu Server desde hace años y solo hay que activarlo; Firewalld viene preinstalado y activo en AlmaLinux y Rocky Linux. Si por alguna razón falta, la instalación es un solo comando.
En Debian y Ubuntu:
sudo apt update
sudo apt install ufw -y En AlmaLinux, Rocky Linux o RHEL 9 y 10:
sudo dnf install firewalld -y
sudo systemctl enable --now firewalld Nota sobre yum: en las distribuciones Red Hat actuales el gestor de paquetes es dnf. yum sigue funcionando como alias por compatibilidad, pero es el gestor de CentOS 7, que llegó a fin de vida el 30 de junio de 2024 y ya no recibe parches de seguridad. Si tu servidor todavía corre CentOS 7, migrar a AlmaLinux o Rocky Linux es más urgente que configurar el firewall.
Configurar UFW paso a paso
Con UFW se trabaja en tres movimientos: abrir lo que necesitas, cerrar todo lo demás por defecto y activar. El comando entiende nombres de servicio (ssh, http, https), números de puerto (8080/tcp) y perfiles de aplicación registrados por los paquetes instalados.
1. Permite el acceso por SSH. Hazlo siempre antes de cualquier política restrictiva:
sudo ufw allow OpenSSH Si cambiaste el puerto de SSH, usa el número en lugar del perfil:
sudo ufw allow 2222/tcp 2. Permite los servicios que realmente expones. Para un servidor web:
sudo ufw allow http
sudo ufw allow https Para ver qué perfiles de aplicación hay disponibles en tu sistema:
sudo ufw app list 3. Define las políticas por defecto: bloquear todo lo entrante que no hayas permitido, permitir lo saliente.
sudo ufw default deny incoming
sudo ufw default allow outgoing 4. Activa el firewall y revisa el resultado numerado:
sudo ufw enable
sudo ufw status numbered La salida numerada importa porque para borrar una regla se usa su número: sudo ufw delete 3. Sin numerar, tienes que reescribir la regla completa para eliminarla.
5. Endurece SSH con limit en lugar de allow. Esta variante bloquea durante 30 segundos a cualquier IP que abra 6 o más conexiones en ese lapso, lo que descarta buena parte de los escaneos automatizados:
sudo ufw limit OpenSSH Si SSH es la única puerta de entrada, combinar ufw limit con Fail2Ban y autenticación por llave elimina prácticamente todo el riesgo de fuerza bruta.
Configurar Firewalld paso a paso
Firewalld organiza las reglas en zonas: cada interfaz de red se asigna a una zona, y cada zona tiene su propia lista de servicios y puertos permitidos. La zona public es la predeterminada en la mayoría de instalaciones y ya permite SSH, lo que hace a Firewalld algo más indulgente que UFW con los despistes.
1. Comprueba en qué zona estás y qué permite:
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all 2. Permite los servicios necesarios de forma permanente. Sin --permanent, la regla desaparece al reiniciar el servicio o el servidor:
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload 3. Abre un puerto que no corresponda a un servicio con nombre:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload 4. Usa las zonas para tratar distinto a cada red. Este es el motivo real para elegir Firewalld: puedes dejar una interfaz interna con permisos amplios y la pública restringida al mínimo.
# Ver todas las zonas disponibles
sudo firewall-cmd --get-zones
# Asignar la interfaz interna a la zona de confianza
sudo firewall-cmd --permanent --zone=internal --change-interface=eth1
# Permitir MySQL solo en la red interna, nunca en la pública
sudo firewall-cmd --permanent --zone=internal --add-service=mysql
sudo firewall-cmd --reload 5. Prueba una regla antes de hacerla permanente. Firewalld permite reglas temporales que se evaporan solas, ideal para experimentar sin riesgo:
sudo firewall-cmd --add-port=8080/tcp --timeout=300 Esa regla dura 300 segundos y desaparece. Si algo se rompe, esperas cinco minutos y el servidor vuelve a su estado anterior.
Limitar el acceso SSH a IPs concretas
Si siempre administras el servidor desde la misma oficina o desde una IP fija, restringir SSH a ese origen elimina el 100% de los intentos de fuerza bruta desde internet. Es la medida de mayor impacto y menor esfuerzo de todo el artículo, y también la más fácil de convertir en un desastre si tu IP cambia.
Con UFW:
sudo ufw delete allow OpenSSH
sudo ufw allow from 190.0.0.0/24 to any port 22 proto tcp Con Firewalld, usando una regla enriquecida (rich rule):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="190.0.0.0/24" service name="ssh" accept'
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload Antes de aplicar esto, confirma que tu IP pública es realmente fija. La mayoría de conexiones domésticas en Ecuador son dinámicas: la IP cambia al reiniciar el router o cada cierto tiempo. Si dependes de una IP dinámica, o dejas SSH abierto con limit y Fail2Ban, o montas una VPN. Ejecuta curl -4 ifconfig.me desde tu equipo para ver tu IP actual, y verifica días después si sigue siendo la misma.
Automatizar la configuración en varios servidores
Un script de arranque garantiza que todos tus servidores tengan la misma política y elimina el error humano de teclear reglas una por una. El orden dentro del script es el mismo que en manual: reglas primero, activación al final.
#!/bin/bash
set -e
# 1. Permitir el acceso administrativo ANTES de cualquier bloqueo
sudo ufw limit OpenSSH
# 2. Servicios públicos
sudo ufw allow http
sudo ufw allow https
# 3. Políticas por defecto
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 4. Activar sin pedir confirmación interactiva
sudo ufw --force enable
# 5. Mostrar el resultado para revisión
sudo ufw status verbose Guárdalo, dale permisos y ejecútalo:
chmod +x configurar_ufw.sh
./configurar_ufw.sh Dos detalles del script que importan: set -e aborta si cualquier comando falla, evitando que se apliquen políticas de bloqueo tras un error; y --force es necesario porque ufw enable pide confirmación interactiva y en un script no habría quién responda.
Verificar que las reglas hacen lo que crees
Ver la lista de reglas no prueba que funcionen: hay que comprobar el filtrado desde fuera del servidor. Un servicio puede estar escuchando en todas las interfaces y aparecer bloqueado en la configuración, y aun así ser alcanzable por una regla anterior que no habías notado.
Desde el propio servidor, para ver qué procesos escuchan y en qué dirección:
sudo ss -tulpn Presta atención a la columna de dirección local. 0.0.0.0:3306 significa que MySQL acepta conexiones desde cualquier red; 127.0.0.1:3306 significa que solo escucha localmente y ni siquiera necesita regla de firewall. Muchos servicios se aseguran mejor cambiando su bind-address que añadiendo reglas.
Desde otra máquina, para comprobar el filtrado real:
nmap -Pn tu_ip_publica Y para inspeccionar las reglas que efectivamente cargó el kernel, por debajo de UFW o Firewalld:
sudo nft list ruleset Errores comunes al configurar un firewall en Linux
| Error | Qué pasa | Cómo evitarlo |
|---|---|---|
| Activar UFW antes de permitir SSH | Pierdes el acceso remoto al instante | ufw allow OpenSSH y después ufw enable |
Olvidar --permanent en Firewalld | Las reglas desaparecen al reiniciar | Añade --permanent y luego --reload |
| Cambiar el puerto SSH sin abrirlo antes | El servicio arranca en un puerto cerrado | Abre el puerto nuevo, reinicia SSH, prueba, cierra el viejo |
| Reglas «por si acaso» demasiado amplias | Expones servicios que creías internos | Revisa con ufw status numbered cada trimestre |
| Confiar solo en el firewall | Un servicio vulnerable en un puerto abierto sigue siendo vulnerable | Suma actualizaciones, Fail2Ban y llaves SSH |
Bases de datos escuchando en 0.0.0.0 | El firewall es lo único que te separa de una fuga de datos | Configura bind-address = 127.0.0.1 en el servicio |
| Cerrar la sesión SSH sin probar otra | Descubres el problema cuando ya no hay vuelta atrás | Abre una segunda sesión antes de cerrar la primera |
Configurar un firewall en Linux es sencillo; lo que se complica es recuperarse de un error. Por eso la regla que más importa no es qué herramienta eliges, sino el orden: permite SSH, define las políticas por defecto, activa el firewall y comprueba con una segunda sesión antes de cerrar la primera. UFW resuelve el 90% de los casos en Debian y Ubuntu con menos comandos; Firewalld vale la pena cuando tienes varias interfaces de red y necesitas tratar distinto a cada una. Y ten presente el límite de ambas: un firewall reduce la superficie expuesta, pero no parchea software vulnerable ni frena un ataque volumétrico. Es una capa, no la defensa completa. Si administras un VPS o un servidor dedicado y tienes dudas durante la implementación, nuestro equipo de soporte técnico está disponible 24/7 para ayudarte.
Hosting con LiteSpeed, NVMe y soporte 24/7 desde $3/mes.