Ahorre 15% en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código: Skills Comenzar
Secciones
Linux Seguridad

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 sudo al 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 -y

O, en versiones más nuevas usando DNF:

sudo dnf install firewalld -y

En 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 firewalld

Verifica que el servicio se esté ejecutando correctamente:

sudo systemctl status firewalld

Deberí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

ZonaNivel de ConfianzaCaso de Uso Típico
dropMás BajoTodas las conexiones entrantes se descartan sin respuesta
blockMuy BajoLas conexiones entrantes se rechazan con un mensaje ICMP
publicBajoZona predeterminada para redes públicas no confiables
externalBajoPara interfaces orientadas al exterior con enmascaramiento NAT
dmzMedioServidores accesibles desde el exterior pero aislados internamente
workMedio-AltoRedes de trabajo con confianza moderada
homeAltoRedes domésticas donde otros hosts son confiables
internalAltoRedes internas, similar a domésticas
trustedMás AltoSe 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-zones

Ejemplo 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=public

Verifica el cambio:

sudo firewall-cmd --get-default-zone

Salida esperada:

public

Ejemplo 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=home

Verifica:

sudo firewall-cmd --get-default-zone

Salida esperada:

home

Ejemplo 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=work

Verifica:

sudo firewall-cmd --get-default-zone

Salida esperada:

work

Paso 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-services

Permitir 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 --permanent

Para permitir tráfico HTTPS (puerto 443/TCP):

sudo firewall-cmd --zone=public --add-service=https --permanent

Para 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 --permanent

Aplicar 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-services

Ejemplo de salida:

dhcpv6-client http https ssh

Eliminar un Servicio de una Zona

Para eliminar HTTPS de la zona public:

sudo firewall-cmd --zone=public --remove-service=https --permanent
sudo firewall-cmd --reload

Paso 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 --reload

Para abrir un puerto UDP (por ejemplo, puerto 53 para DNS):

sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reload

Para abrir un rango de puertos (por ejemplo, 6000–6100 TCP):

sudo firewall-cmd --zone=public --add-port=6000-6100/tcp --permanent
sudo firewall-cmd --reload

Cerrar un Puerto Específico

Para cerrar el puerto 8080:

sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload

Listar Todos los Puertos Abiertos en una Zona

sudo firewall-cmd --zone=public --list-ports

Paso 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 --reload

Ejemplo 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 --reload

Ejemplo 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 --reload

Ejemplo 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 --reload

Ejemplo 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 --reload

Listar Todas las Rich Rules en una Zona

sudo firewall-cmd --zone=public --list-rich-rules

Eliminar 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 --reload

Paso 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-all

Ejemplo 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" accept

Ver Configuración para Todas las Zonas

sudo firewall-cmd --list-all-zones

Ver Configuración para una Zona Específica

sudo firewall-cmd --zone=dmz --list-all

Verificar si un Servicio Específico Está Permitido

sudo firewall-cmd --zone=public --query-service=http

Verificar si un Puerto Específico Está Abierto

sudo firewall-cmd --zone=public --query-port=8080/tcp

Paso 9: Reglas de Runtime vs. Permanentes — Entender la Diferencia

Firewalld opera con dos capas de configuración distintas:

CapaBanderaPersistenciaCaso de Uso
Runtime*(sin bandera)*Se pierde al recargar/reiniciarProbar reglas temporalmente
Permanente--permanentSobrevive a la recarga y reinicioConfiguraciones de producción

Flujo de Trabajo de Mejores Prácticas

  1. Prueba la regla en runtime primero (sin --permanent) para verificar que funciona como se espera
  2. Añade la regla permanentemente una vez confirmada
  3. 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 --reload

Alternativamente, aplica una regla permanente e inmediatamente recarga en un flujo de trabajo:

sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reload

Paso 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 --reload

Cambiar la Zona de una Interfaz

sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reload

Eliminar una Interfaz de una Zona

sudo firewall-cmd --zone=internal --remove-interface=eth1 --permanent
sudo firewall-cmd --reload

Paso 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 --reload

Reenviar 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 --reload

Reenviar 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 --reload

Configuraciones 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 --reload

Configuració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 --reload

Solució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 firewalld

Problema 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 --reload

El 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 --reload

Problema 4: Verificar registros de Firewalld

sudo journalctl -u firewalld -f

O verifica el registro del sistema para mensajes relacionados con firewall:

sudo grep -i firewall /var/log/messages

Hoja de Referencia Rápida de Firewalld

TareaComando
Verificar estadosudo systemctl status firewalld
Iniciar Firewalldsudo systemctl start firewalld
Detener Firewalldsudo systemctl stop firewalld
Habilitar al arranquesudo systemctl enable firewalld
Obtener zona predeterminadasudo firewall-cmd --get-default-zone
Listar todas las zonassudo firewall-cmd --get-zones
Listar zonas activassudo firewall-cmd --get-active-zones
Establecer zona predeterminadasudo firewall-cmd --set-default-zone=public
Agregar un serviciosudo firewall-cmd --zone=public --add-service=http --permanent
Eliminar un serviciosudo firewall-cmd --zone=public --remove-service=http --permanent
Abrir un puertosudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
Cerrar un puertosudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
Listar serviciossudo firewall-cmd --zone=public --list-services
Listar puertossudo firewall-cmd --zone=public --list-ports
Listar todas las reglassudo firewall-cmd --list-all
Agregar regla enriquecidasudo firewall-cmd --zone=public --add-rich-rule='...' --permanent
Guardar reglas en tiempo de ejecuciónsudo firewall-cmd --runtime-to-permanent
Recargar Firewalldsudo firewall-cmd --reload
Modo pánico (bloquear todo)sudo firewall-cmd --panic-on
Desactivar modo pánicosudo 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:

  1. Siempre permita SSH antes de habilitar el firewall para evitar bloquearse a sí mismo
  2. Use la bandera --permanent para todas las reglas de producción, y siempre continúe con --reload
  3. Restrinja servicios sensibles (SSH, bases de datos, paneles de administración) a direcciones IP específicas de confianza usando reglas enriquecidas
  4. Revise sus reglas de firewall regularmente — su postura de seguridad debe evolucionar a medida que su infraestructura cambia
  5. 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.