Cómo Configurar un Firewall con Firewalld en Linux (Guía Completa)
Asegurar tu 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és ejecutando un proyecto personal, una aplicación empresarial o un servidor web de producción, un firewall correctamente configurado es tu primera y más crítica línea de defensa. Firewalld es una de las herramientas de gestión de firewall más potentes 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 te guía a través de todo lo que necesitas saber: instalar Firewalld, entender zonas, gestionar servicios y puertos, escribir reglas enriquecidas y monitorear tu firewall en tiempo real. Si estás alojando en un VPS o Servidor Dedicado de AlexHost, esta guía te ayudará a asegurar tu entorno y mantener una postura de seguridad fuerte y adaptable.
¿Qué es Firewalld y por qué deberías 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 — asigna diferentes niveles de confianza a diferentes interfaces de red o rangos de IP
- Actualizaciones de reglas dinámicas — aplica cambios sin reiniciar el firewall ni descartar conexiones existentes
- Abstracción de servicios — gestiona el tráfico por nombre de servicio (p. ej.,
http,ssh) en lugar de números de puerto sin procesar - Reglas enriquecidas — escribe reglas complejas y condicionales dirigidas a IPs, protocolos y acciones específicas
- Integración D-Bus — permite que otras aplicaciones y servicios interactúen con el firewall de forma programática
- Soporte IPv4 e IPv6 — gestiona ambas familias de protocolos desde una única interfaz
Requisitos previos
Antes de continuar, asegúrate 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 (mantenla abierta durante todo el proceso — estarás modificando las reglas del firewall)
> Advertencia crítica: Siempre asegúrate de que SSH (puerto 22 por defecto) esté explícitamente permitido en tus reglas de firewall antes de habilitar Firewalld. Bloquearte a ti mismo en un servidor remoto es un error común y evitable.
Paso 1: Instalación de Firewalld
Firewalld está incluido en los repositorios predeterminados de la mayoría de las principales distribuciones de Linux. Utiliza el gestor de paquetes apropiado para tu 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 -y
En Debian / Ubuntu
Aunque Firewalld se asocia más comúnmente 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 tu sistema, desactívalo antes de habilitar Firewalld para evitar conflictos:
> “`bash
> sudo ufw disable
> “`
Paso 2: Iniciar y habilitar Firewalld
Después de la instalación, inicia el servicio Firewalld y configúralo para que se lance automáticamente al iniciar el sistema:
sudo systemctl start firewalld
sudo systemctl enable firewalldVerifica que el servicio se esté ejecutando correctamente:
sudo systemctl status firewalldDeberías 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: Entendiendo 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ésticas |
trusted | Más Alto | Se aceptan todas las conexiones |
Verificar la Zona Predeterminada Actual
sudo firewall-cmd --get-default-zone
Listar Todas las Zonas Disponibles
sudo firewall-cmd --get-zones
Ver Zonas Activas Actualmente e Interfaces
sudo firewall-cmd --get-active-zonesEjemplo de salida:
public
interfaces: eth0
Paso 4: Cambiar la Zona Predeterminada
Ejemplo 1 — Establecer la Zona Predeterminada en 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=publicVerifica el cambio:
sudo firewall-cmd --get-default-zoneSalida esperada:
publicEjemplo 2 — Establecer la Zona Predeterminada en home
Si tu servidor opera en una red privada de confianza (como un laboratorio doméstico o entorno de desarrollo interno), la zona home permite una comunicación más permisiva entre hosts de confianza:
sudo firewall-cmd --set-default-zone=homeVerifica:
sudo firewall-cmd --get-default-zoneSalida esperada:
homeEjemplo 3 — Establecer la Zona Predeterminada en work
Para servidores en una red corporativa o de trabajo donde es apropiada una confianza moderada:
sudo firewall-cmd --set-default-zone=workVerifica:
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 facilita mucho la gestión de 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úrate 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 recarga después de hacer cambios permanentes:
sudo firewall-cmd --reload
Verificar 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 (por ejemplo, puerto 53 para DNS):
sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reloadPara abrir un rango de puertos (por ejemplo, 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 Rich Rules
Rich rules te dan control granular y condicional sobre el tráfico — mucho más allá de lo que permiten las reglas simples de servicio o puerto. Admiten filtrado por IP de origen, IP de destino, protocolo, puerto y acción (accept, reject, drop, log).
Sintaxis de Rich Rule
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 desde una Dirección IP Específica Únicamente
Esta es una de las configuraciones de seguridad más importantes para cualquier servidor remoto. Si administras tu servidor desde una dirección IP fija, restringe el acceso SSH a esa IP exclusivamente:
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 de confianza (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 Velocidad de Conexiones SSH para Prevenir Ataques de Fuerza Bruta
Registra y limita 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 Rich Rules en una Zona
sudo firewall-cmd --zone=public --list-rich-rulesEliminar una Rich Rule
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 tu Firewall
Revisar regularmente tu configuración de firewall es esencial para mantener una postura de seguridad sólida. Firewalld proporciona varios comandos para inspeccionar el estado actual de tus 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 de Runtime vs. Permanentes — Entender la Diferencia
Firewalld opera con dos capas de configuración distintas:
| Capa | Bandera | Persistencia | Caso de Uso |
|---|---|---|---|
| Runtime | *(sin bandera)* | Se pierde al recargar/reiniciar | Probar reglas temporalmente |
| Permanente | --permanent | Sobrevive a la recarga y reinicio | Configuraciones de producción |
Flujo de Trabajo de Mejores Prácticas
- Prueba la regla en runtime primero (sin
--permanent) para verificar que funciona como se espera - Añade la regla permanentemente una vez confirmada
- Recarga Firewalld para sincronizar las configuraciones de runtime 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, aplica una regla permanente e inmediatamente recarga en un flujo de trabajo:
sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reloadPaso 10: Asignación de Interfaces de Red a Zonas
Si tu servidor tiene múltiples interfaces de red (común en Servidores Dedicados con NICs públicas y privadas), puedes 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: Habilitación de IP Masquerading y Port Forwarding
Para servidores que actúan como puertas de enlace o ejecutan NAT (Network Address Translation), Firewalld admite masquerading y port forwarding de forma nativa.
Habilitar Masquerading (NAT)
sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reloadReenviar un Puerto (por ejemplo, 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 la infraestructura de 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 Pro: Combine su configuración de firewall con un Certificado SSL válido para garantizar que todo el tráfico web esté cifrado de extremo a extremo. AlexHost ofrece certificados SSL para todos los entornos de hosting.
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á utilizando un VPS con cPanel, deberá 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 inicia
Verifica 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úrate de usar la bandera --permanent y recargar:
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reloadEl comando --runtime-to-permanent guarda todas las reglas de tiempo de ejecución actuales en la configuración permanente.
Problema 3: Bloqueado fuera de SSH
Si accidentalmente bloqueaste el acceso SSH, necesitarás acceder al servidor a través de la consola (disponible en el 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 verifica 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 | sudo systemctl stop firewalld |
| Habilitar al arranque | sudo systemctl enable firewalld |
| Obtener zona predeterminada | sudo firewall-cmd --get-default-zone |
| Listar todas las zonas | sudo firewall-cmd --get-zones |
| Listar zonas activas | sudo firewall-cmd --get-active-zones |
| Establecer zona predeterminada | sudo firewall-cmd --set-default-zone=public |
| Agregar un servicio | sudo firewall-cmd --zone=public --add-service=http --permanent |
| Eliminar un servicio | sudo firewall-cmd --zone=public --remove-service=http --permanent |
| Abrir un puerto | sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent |
| Cerrar un puerto | sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent |
| Listar servicios | sudo firewall-cmd --zone=public --list-services |
| Listar puertos | sudo firewall-cmd --zone=public --list-ports |
| Listar todas las reglas | sudo firewall-cmd --list-all |
| Agregar regla enriquecida | sudo firewall-cmd --zone=public --add-rich-rule='...' --permanent |
| Guardar reglas en tiempo de ejecución | sudo firewall-cmd --runtime-to-permanent |
| Recargar Firewalld | sudo firewall-cmd --reload |
| Modo pánico (bloquear todo) | sudo firewall-cmd --panic-on |
| Desactivar modo pánico | sudo firewall-cmd --panic-off |
Conclusión
Firewalld es una herramienta de gestión de firewall excepcionalmente capaz y flexible que proporciona a los administradores de sistemas Linux un control preciso y dinámico sobre el tráfico de red. Al dominar zonas, servicios, reglas de puertos y reglas enriquecidas, puede construir una arquitectura de seguridad en capas y adaptativa que proteja su servidor contra acceso no autorizado, ataques de fuerza bruta y amenazas a nivel de red.
Los principios clave a llevar adelante:
- Siempre permita SSH antes de habilitar el firewall para evitar bloquearse a sí mismo
- Use la bandera
--permanentpara todas las reglas de producción, y siempre continúe con--reload - Restrinja servicios sensibles (SSH, bases de datos, paneles de administración) a direcciones IP específicas de confianza usando reglas enriquecidas
- Revise sus reglas de firewall regularmente — su postura de seguridad debe evolucionar a medida que su infraestructura cambia
- Pruebe las reglas en tiempo de ejecución primero, luego hágalas permanentes una vez verificadas
Ya sea que esté administrando un único VPS o una flota de Servidores Dedicados, AlexHost proporciona la infraestructura, el rendimiento y el acceso root completo que necesita para implementar configuraciones de seguridad de nivel empresarial. Combine su configuración de Firewalld con Certificados SSL para comunicaciones cifradas y explore Paneles de Control VPS para una gestión de servidor simplificada — todo disponible en la plataforma confiable y de alto rendimiento de AlexHost.
en todos los servicios de hosting