Saltar al contenido
Infrastructure 2024-12-29 13 min de lectura

Guía Definitiva para Configurar Firewalls en Linux: UFW y Firewalld

Un firewall bien configurado es la primera línea de defensa de cualquier servidor: decide qué tráfico entra y cuál se descarta antes de que llegue a tus aplicaciones. En Linux, dos herramientas dominan este espacio: UFW (Uncomplicated Firewall), el estándar en Debian y Ubuntu por su sintaxis simple, y Firewalld, el estándar en AlmaLinux, Rocky Linux y RHEL, con un modelo de zonas más flexible. Ninguna de las dos filtra tráfico por sí misma: son interfaces que traducen tus órdenes a reglas de nftables, el motor de filtrado que vive dentro del kernel de Linux. Esta guía cubre la configuración de ambas y, sobre todo, el orden exacto de comandos que evita el error más costoso al configurar firewalls en Linux: quedarte fuera de tu propio servidor.

Guía Definitiva para Configurar Firewalls en Linux: UFW y Firewalld
#Infrastructure#Linux#Firewall#Seguridad
T
Equipo Terranode
Editorial

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.

CriterioUFWFirewalldnftables directo
Distribución típicaDebian, UbuntuAlmaLinux, Rocky, RHEL, FedoraCualquiera
Modelo mentalLista de reglas permitir/denegarZonas asignadas a interfacesTablas, cadenas y reglas
Aplicar cambiosInmediato--permanent + --reloadInmediato
Curva de aprendizajeBajaMediaAlta
Reglas por origen de redSí, por reglaSí, es el concepto centralTotal
Recarga sin cortar conexiones
Cuándo convieneUn servidor, pocos serviciosVarias interfaces o redes internasReglas 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:

bash
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.

bash
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:

bash
sudo apt update
sudo apt install ufw -y

En AlmaLinux, Rocky Linux o RHEL 9 y 10:

bash
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:

bash
sudo ufw allow OpenSSH

Si cambiaste el puerto de SSH, usa el número en lugar del perfil:

bash
sudo ufw allow 2222/tcp

2. Permite los servicios que realmente expones. Para un servidor web:

bash
sudo ufw allow http
sudo ufw allow https

Para ver qué perfiles de aplicación hay disponibles en tu sistema:

bash
sudo ufw app list

3. Define las políticas por defecto: bloquear todo lo entrante que no hayas permitido, permitir lo saliente.

bash
sudo ufw default deny incoming
sudo ufw default allow outgoing

4. Activa el firewall y revisa el resultado numerado:

bash
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:

bash
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:

bash
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:

bash
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:

bash
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.

bash
# 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:

bash
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:

bash
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):

bash
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.

bash
#!/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:

bash
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:

bash
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:

bash
nmap -Pn tu_ip_publica

Y para inspeccionar las reglas que efectivamente cargó el kernel, por debajo de UFW o Firewalld:

bash
sudo nft list ruleset

Errores comunes al configurar un firewall en Linux

ErrorQué pasaCómo evitarlo
Activar UFW antes de permitir SSHPierdes el acceso remoto al instanteufw allow OpenSSH y después ufw enable
Olvidar --permanent en FirewalldLas reglas desaparecen al reiniciarAñade --permanent y luego --reload
Cambiar el puerto SSH sin abrirlo antesEl servicio arranca en un puerto cerradoAbre el puerto nuevo, reinicia SSH, prueba, cierra el viejo
Reglas «por si acaso» demasiado ampliasExpones servicios que creías internosRevisa con ufw status numbered cada trimestre
Confiar solo en el firewallUn servicio vulnerable en un puerto abierto sigue siendo vulnerableSuma actualizaciones, Fail2Ban y llaves SSH
Bases de datos escuchando en 0.0.0.0El firewall es lo único que te separa de una fuga de datosConfigura bind-address = 127.0.0.1 en el servicio
Cerrar la sesión SSH sin probar otraDescubres el problema cuando ya no hay vuelta atrásAbre 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.

¿Listo para llevar tu sitio al siguiente nivel?

Hosting con LiteSpeed, NVMe y soporte 24/7 desde $3/mes.

Ver planes de hosting

Preguntas frecuentes