15%

Ahorra 15%<\/span> 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
01.11.2024

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

Verifique que el servicio se esté ejecutando correctamente:

sudo systemctl status firewalld

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

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éstico
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 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=public

Verifique el cambio:

sudo firewall-cmd --get-default-zone

Salida esperada:

public

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

Verifique:

sudo firewall-cmd --get-default-zone

Salida esperada:

home

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

Verifique:

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 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-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úrese 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 recargue 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 (p. ej., puerto 53 para DNS):

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

Para abrir un rango de puertos (p. ej., 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 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 --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 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 --reload

Ejemplo 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 --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 reglas enriquecidas en una zona

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

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

Paso 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-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 en tiempo de ejecución vs. permanentes — Entender la diferencia

Firewalld opera con dos capas de configuración distintas:

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

Flujo de trabajo de mejores prácticas

  1. Pruebe la regla en tiempo de ejecución primero (sin --permanent) para verificar que funciona como se espera
  2. Agregue la regla permanentemente una vez confirmada
  3. 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 --reload

Alternativamente, aplique una regla permanente e inmediatamente recargue en un flujo de trabajo:

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

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

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

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

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

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

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

Problema 4: Verificar registros de Firewalld

sudo journalctl -u firewalld -f

O verifique 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 Firewalld###PPT_
15%

Ahorra 15%<\/span> 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