Cómo Configurar un Firewall con Firewalld en Linux (Guía Completa)
Asegurar su servidor Linux contra acceso no autorizado y tráfico malicioso no es opcional — es una responsabilidad fundamental para cualquier administrador de sistemas. Ya sea que esté ejecutando un proyecto personal, una aplicación empresarial o un servidor web de producción, un firewall correctamente configurado es su primera y más crítica línea de defensa. Firewalld es una de las herramientas de gestión de firewall más poderosas y flexibles disponibles en Linux, ofreciendo gestión dinámica de reglas, control de tráfico basado en zonas y soporte de reglas enriquecidas — todo sin requerir un reinicio completo del servicio cuando se aplican cambios.
Esta guía completa lo guía a través de todo lo que necesita saber: instalar Firewalld, entender zonas, gestionar servicios y puertos, escribir reglas enriquecidas y monitorear su firewall en tiempo real. Si está alojando en un VPS o Servidor Dedicado de AlexHost, esta guía lo ayudará a asegurar su entorno y mantener una postura de seguridad fuerte y adaptativa.
¿Qué es Firewalld y por qué debería usarlo?
Firewalld es un demonio de gestión de firewall dinámico disponible en la mayoría de las principales distribuciones de Linux, incluyendo CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux, y cada vez más en Debian y Ubuntu también. A diferencia del enfoque más antiguo iptables — donde cada cambio de regla requería vaciar y recargar todo el conjunto de reglas — Firewalld aplica cambios dinámicamente en tiempo de ejecución sin interrumpir las conexiones activas.
Ventajas clave de Firewalld
- Arquitectura basada en zonas — asigne diferentes niveles de confianza a diferentes interfaces de red o rangos de IP
- Actualizaciones dinámicas de reglas — aplique cambios sin reiniciar el firewall o descartar conexiones existentes
- Abstracción de servicios — gestione el tráfico por nombre de servicio (p. ej.,
http,ssh) en lugar de números de puerto sin procesar - Reglas enriquecidas — escriba reglas complejas y condicionales dirigidas a IPs específicas, protocolos y acciones
- Integración D-Bus — permite que otras aplicaciones y servicios interactúen con el firewall de manera programática
- Soporte IPv4 e IPv6 — gestione ambas familias de protocolos desde una única interfaz
Requisitos previos
Antes de continuar, asegúrese de tener:
- Un servidor Linux ejecutando CentOS 7/8/9, RHEL, Fedora, Rocky Linux, AlmaLinux, Debian o Ubuntu
- Acceso root o
sudoal servidor - Una comprensión básica de los comandos de terminal de Linux
- Una sesión SSH activa (manténgala abierta durante todo el proceso — estará modificando reglas de firewall)
> Advertencia crítica: Siempre asegúrese de que SSH (puerto 22 por defecto) esté explícitamente permitido en sus reglas de firewall antes de habilitar Firewalld. Bloquearse a sí mismo de un servidor remoto es un error común y evitable.
Paso 1: Instalar Firewalld
Firewalld está incluido en los repositorios predeterminados de la mayoría de las principales distribuciones de Linux. Use el gestor de paquetes apropiado para su sistema.
En CentOS / RHEL / Rocky Linux / AlmaLinux
sudo yum install firewalld -yO, en versiones más nuevas usando DNF:
sudo dnf install firewalld -yEn Fedora
sudo dnf install firewalld -yEn Debian / Ubuntu
Aunque Firewalld está más comúnmente asociado con sistemas basados en RHEL, es totalmente compatible con distribuciones basadas en Debian:
sudo apt update
sudo apt install firewalld -y> Nota para usuarios de Ubuntu/Debian: Si ufw está actualmente activo en su sistema, deshabilítelo antes de habilitar Firewalld para evitar conflictos:
> “`bash
> sudo ufw disable
> “`
Paso 2: Iniciar y habilitar Firewalld
Después de la instalación, inicie el servicio Firewalld y configúrelo para que se inicie automáticamente al arrancar el sistema:
sudo systemctl start firewalld
sudo systemctl enable firewalldVerifique que el servicio se esté ejecutando correctamente:
sudo systemctl status firewalldDebería ver una salida similar a:
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since ...Si el estado muestra active (running), Firewalld está operativo y listo para configurar.
Paso 3: Entender las zonas de Firewalld
El modelo basado en zonas es la piedra angular de la arquitectura de Firewalld. Una zona define un nivel de confianza para una conexión de red o interfaz. Cada zona contiene su propio conjunto de reglas que determinan qué tráfico se permite o se deniega.
Zonas integradas de Firewalld
| Zona | Nivel de confianza | Caso de uso típico |
|---|---|---|
drop | Más bajo | Todas las conexiones entrantes se descartan sin respuesta |
block | Muy bajo | Las conexiones entrantes se rechazan con un mensaje ICMP |
public | Bajo | Zona predeterminada para redes públicas no confiables |
external | Bajo | Para interfaces orientadas al exterior con enmascaramiento NAT |
dmz | Medio | Servidores accesibles desde el exterior pero aislados internamente |
work | Medio-alto | Redes de trabajo con confianza moderada |
home | Alto | Redes domésticas donde otros hosts son confiables |
internal | Alto | Redes internas, similar a doméstico |
trusted | Más alto | Se aceptan todas las conexiones |
Verificar la zona predeterminada actual
sudo firewall-cmd --get-default-zoneListar todas las zonas disponibles
sudo firewall-cmd --get-zonesVer zonas activas actualmente e interfaces
sudo firewall-cmd --get-active-zonesEjemplo de salida:
public
interfaces: eth0Paso 4: Cambiar la zona predeterminada
Ejemplo 1 — Establecer la zona predeterminada a public (Recomendado para VPS/Servidores Dedicados)
Para la mayoría de servidores orientados a Internet, public es la zona predeterminada apropiada. Aplica un nivel de confianza conservador y solo permite el tráfico explícitamente permitido:
sudo firewall-cmd --set-default-zone=publicVerifique el cambio:
sudo firewall-cmd --get-default-zoneSalida esperada:
publicEjemplo 2 — Establecer la zona predeterminada a home
Si su servidor opera en una red privada confiable (como un laboratorio doméstico o entorno de desarrollo interno), la zona home permite una comunicación más permisiva entre hosts confiables:
sudo firewall-cmd --set-default-zone=homeVerifique:
sudo firewall-cmd --get-default-zoneSalida esperada:
homeEjemplo 3 — Establecer la zona predeterminada a work
Para servidores en una red corporativa o de trabajo donde la confianza moderada es apropiada:
sudo firewall-cmd --set-default-zone=workVerifique:
sudo firewall-cmd --get-default-zoneSalida esperada:
workPaso 5: Gestionar servicios con Firewalld
Firewalld incluye una biblioteca de definiciones de servicios predefinidas que asignan nombres de servicios a sus puertos y protocolos correspondientes. Esto hace que sea mucho más fácil gestionar reglas por intención en lugar de por números de puerto sin procesar.
Listar todos los servicios predefinidos
sudo firewall-cmd --get-servicesPermitir un servicio en una zona
Para permitir tráfico HTTP (puerto 80/TCP) en la zona public de forma permanente:
sudo firewall-cmd --zone=public --add-service=http --permanentPara permitir tráfico HTTPS (puerto 443/TCP):
sudo firewall-cmd --zone=public --add-service=https --permanentPara permitir SSH (puerto 22/TCP) — siempre asegúrese de que esto esté permitido antes de hacer otros cambios:
sudo firewall-cmd --zone=public --add-service=ssh --permanentAplicar cambios recargando Firewalld
La bandera --permanent escribe la regla en la configuración persistente pero no la aplica inmediatamente al firewall en ejecución. Siempre recargue después de hacer cambios permanentes:
sudo firewall-cmd --reloadVerificar servicios en una zona
sudo firewall-cmd --zone=public --list-servicesEjemplo de salida:
dhcpv6-client http https sshEliminar un servicio de una zona
Para eliminar HTTPS de la zona public:
sudo firewall-cmd --zone=public --remove-service=https --permanent
sudo firewall-cmd --reloadPaso 6: Gestionar puertos directamente
En casos donde un servicio no tiene una definición predefinida de Firewalld, puede abrir o cerrar puertos específicos directamente.
Abrir un puerto específico
Para abrir el puerto 8080 sobre TCP en la zona public:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reloadPara abrir un puerto UDP (p. ej., puerto 53 para DNS):
sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reloadPara abrir un rango de puertos (p. ej., 6000–6100 TCP):
sudo firewall-cmd --zone=public --add-port=6000-6100/tcp --permanent
sudo firewall-cmd --reloadCerrar un puerto específico
Para cerrar el puerto 8080:
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reloadListar todos los puertos abiertos en una zona
sudo firewall-cmd --zone=public --list-portsPaso 7: Configuración avanzada con reglas enriquecidas
Las reglas enriquecidas le dan control granular y condicional sobre el tráfico — mucho más allá de lo que permiten las reglas simples de servicio o puerto. Soportan filtrado por IP de origen, IP de destino, protocolo, puerto y acción (aceptar, rechazar, descartar, registrar).
Sintaxis de regla enriquecida
rule [family="<ipv4|ipv6>"]
[source address="<IP/CIDR>"]
[destination address="<IP/CIDR>"]
[service name="<service>"] | [port port="<port>" protocol="<tcp|udp>"]
[log [prefix="<prefix>"] [level="<level>"] [limit value="<rate>"]]
[accept|reject|drop]Ejemplo 1 — Permitir SSH solo desde una dirección IP específica
Esta es una de las configuraciones de seguridad más importantes para cualquier servidor remoto. Si gestiona su servidor desde una dirección IP fija, restrinja el acceso SSH exclusivamente a esa IP:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept' --permanent
sudo firewall-cmd --reloadEjemplo 2 — Bloquear todo el tráfico desde una dirección IP específica
Para bloquear completamente una dirección IP que está generando tráfico malicioso:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadEjemplo 3 — Permitir HTTP desde una subred específica
Para permitir tráfico HTTP solo desde una subred interna confiable (p. ej., 192.168.1.0/24):
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent
sudo firewall-cmd --reloadEjemplo 4 — Limitar la velocidad de conexiones SSH para prevenir ataques de fuerza bruta
Registre y limite los intentos de conexión SSH para reducir la exposición a ataques de fuerza bruta:
sudo firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" log prefix="SSH-ATTEMPT" level="notice" limit value="3/m" accept' --permanent
sudo firewall-cmd --reloadEjemplo 5 — Permitir un puerto específico desde una IP específica
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
sudo firewall-cmd --reloadListar todas las reglas enriquecidas en una zona
sudo firewall-cmd --zone=public --list-rich-rulesEliminar una regla enriquecida
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadPaso 8: Monitoreo y auditoría de su firewall
Revisar regularmente su configuración de firewall es esencial para mantener una postura de seguridad fuerte. Firewalld proporciona varios comandos para inspeccionar el estado actual de sus reglas.
Ver la configuración completa para la zona predeterminada
sudo firewall-cmd --list-allEjemplo de salida:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="203.0.113.50" service name="ssh" acceptVer configuración para todas las zonas
sudo firewall-cmd --list-all-zonesVer configuración para una zona específica
sudo firewall-cmd --zone=dmz --list-allVerificar si un servicio específico está permitido
sudo firewall-cmd --zone=public --query-service=httpVerificar si un puerto específico está abierto
sudo firewall-cmd --zone=public --query-port=8080/tcpPaso 9: Reglas en tiempo de ejecución vs. permanentes — Entender la diferencia
Firewalld opera con dos capas de configuración distintas:
| Capa | Bandera | Persistencia | Caso de uso |
|---|---|---|---|
| Tiempo de ejecución | *(sin bandera)* | Se pierde al recargar/reiniciar | Probar reglas temporalmente |
| Permanente | --permanent | Sobrevive a recarga y reinicio | Configuraciones de producción |
Flujo de trabajo de mejores prácticas
- Pruebe la regla en tiempo de ejecución primero (sin
--permanent) para verificar que funciona como se espera - Agregue la regla permanentemente una vez confirmada
- Recargue Firewalld para sincronizar las configuraciones en tiempo de ejecución y permanentes
# Step 1: Test at runtime
sudo firewall-cmd --zone=public --add-service=http
# Step 2: Verify it works as expected, then make it permanent
sudo firewall-cmd --zone=public --add-service=http --permanent
# Step 3: Reload to sync
sudo firewall-cmd --reloadAlternativamente, aplique una regla permanente e inmediatamente recargue en un flujo de trabajo:
sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reloadPaso 10: Asignar interfaces de red a zonas
Si su servidor tiene múltiples interfaces de red (común en Servidores Dedicados con NIC públicas y privadas), puede asignar cada interfaz a una zona diferente con diferentes niveles de confianza.
Asignar una interfaz a una zona
sudo firewall-cmd --zone=internal --add-interface=eth1 --permanent
sudo firewall-cmd --reloadCambiar la zona de una interfaz
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reloadEliminar una interfaz de una zona
sudo firewall-cmd --zone=internal --remove-interface=eth1 --permanent
sudo firewall-cmd --reloadPaso 11: Habilitar enmascaramiento de IP y reenvío de puertos
Para servidores que actúan como puertas de enlace o ejecutan NAT (Traducción de direcciones de red), Firewalld soporta enmascaramiento y reenvío de puertos de forma nativa.
Habilitar enmascaramiento (NAT)
sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reloadReenviar un puerto (p. ej., reenviar puerto externo 80 a puerto interno 8080)
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reloadReenviar tráfico a un host diferente
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.10 --permanent
sudo firewall-cmd --reloadConfiguraciones de seguridad práctica para servidores AlexHost
Si está ejecutando un servidor web, servidor de base de datos o servidor de aplicaciones en infraestructura AlexHost, aquí hay configuraciones de Firewalld de línea base recomendadas:
Configuración de servidor web de línea base
# Allow SSH (restrict to your IP in production)
sudo firewall-cmd --zone=public --add-service=ssh --permanent
# Allow HTTP and HTTPS
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# Reload to apply
sudo firewall-cmd --reload
# Verify
sudo firewall-cmd --list-all> Consejo profesional: Combine su configuración de firewall con un certificado SSL válido para asegurar que todo el tráfico web esté encriptado de extremo a extremo. AlexHost ofrece certificados SSL para todos los entornos de alojamiento.
Configuración de servidor de base de datos de línea base (MySQL/MariaDB)
# Allow MySQL only from a specific application server IP
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
# Block direct MySQL access from the public internet
sudo firewall-cmd --zone=public --remove-service=mysql --permanent 2>/dev/null
sudo firewall-cmd --reloadConfiguración de servidor cPanel/WHM de línea base
Si está usando un VPS con cPanel, necesitará abrir los puertos requeridos por cPanel y WHM:
# Web traffic
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# cPanel/WHM ports
sudo firewall-cmd --zone=public --add-port=2082/tcp --permanent # cPanel HTTP
sudo firewall-cmd --zone=public --add-port=2083/tcp --permanent # cPanel HTTPS
sudo firewall-cmd --zone=public --add-port=2086/tcp --permanent # WHM HTTP
sudo firewall-cmd --zone=public --add-port=2087/tcp --permanent # WHM HTTPS
sudo firewall-cmd --zone=public --add-port=2095/tcp --permanent # Webmail HTTP
sudo firewall-cmd --zone=public --add-port=2096/tcp --permanent # Webmail HTTPS
# Mail ports
sudo firewall-cmd --zone=public --add-service=smtp --permanent
sudo firewall-cmd --zone=public --add-service=imaps --permanent
sudo firewall-cmd --zone=public --add-service=pop3s --permanent
sudo firewall-cmd --reloadSolución de problemas comunes de Firewalld
Problema 1: Firewalld no se inicia
Verifique si hay conflictos con otras herramientas de firewall:
sudo systemctl status iptables
sudo systemctl stop iptables
sudo systemctl disable iptables
sudo systemctl start firewalldProblema 2: Las reglas no persisten después del reinicio
Asegúrese de usar la bandera --permanent y recargue:
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reloadEl comando --runtime-to-permanent guarda todas las reglas en tiempo de ejecución actual en la configuración permanente.
Problema 3: Bloqueado fuera de SSH
Si accidentalmente bloqueó el acceso SSH, necesitará acceder al servidor a través de la consola (disponible a través del panel de control VPS de AlexHost) y ejecutar:
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reloadProblema 4: Verificar registros de Firewalld
sudo journalctl -u firewalld -fO verifique el registro del sistema para mensajes relacionados con firewall:
sudo grep -i firewall /var/log/messagesHoja de referencia rápida de Firewalld
| Tarea | Comando |
|---|---|
| Verificar estado | sudo systemctl status firewalld |
| Iniciar Firewalld | sudo systemctl start firewalld |
| Detener Firewalld | ###PPT_ |
