Configuración de FirewallD

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: https://www.alcancelibre.org

Licencia Creative Commons
© 1999-2026 Joel Barrios Dueñas. Este manual se distribuye bajo la licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional (CC BY-NC-SA 4.0). Usted es libre de compartir y adaptar el material bajo los siguientes términos: debe dar crédito al autor, no puede utilizarlo para fines comerciales y debe compartir las obras derivadas bajo la misma licencia. La licencia completa está disponible en https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.es.

Introducción

En distribuciones Linux modernas como ALDOS, AlmaLinux, Rocky Linux, Red Hat Enterprise Linux 8/9/10 y sus derivados, un muro cortafuegos bien configurado es un componente fundamental de seguridad. FirewallD emerge como la solución predeterminada, ofreciendo una administración dinámica y centrada en zonas.

FirewallD es una aplicación escrita en Python3 que funciona como un servicio dinámico para gestionar reglas de filtrado de red. Su principal ventaja reside en la capacidad de modificar la configuración sin necesidad de reiniciar el servicio, aplicando los cambios de inmediato. Comunica las reglas al núcleo de Linux (kernel) utilizando nftables ―el sucesor moderno y más eficiente de iptables― como su motor por defecto en todas las distribuciones actuales.

Provee herramientas como firewall-cmd para la terminal y firewall-config para entornos gráficos, simplificando enormemente tareas complejas como la creación de reglas de enmascaramiento (NAT), redireccionamiento de puertos (DNAT) o filtrado por origen.

Dado que FirewallD viene preinstalado en las distribuciones mencionadas, este manual se enfocará en su configuración, verificación y actualización, con un enfoque pedagógico y de seguridad proactiva.

Equipamiento lógico y verificación

FirewallD es un componente central en distribuciones basadas en RHEL. En lugar de instalarlo, es crucial verificar que se encuentre en su versión más reciente para contar con las últimas correcciones de seguridad y características.

Para actualizar FirewallD, ejecute el siguiente mandato según el gestor de paquetes de su distribución:

# Para sistemas con DNF (AlmaLinux, Rocky Linux, RHEL 8+)
dnf update firewalld

# Para sistemas con YUM (ALDOS, sistemas legacy)
yum update firewalld

Si su sistema incluye un entorno de escritorio gráfico y desea utilizar la herramienta de configuración visual, puede instalar firewall-config:

# Para sistemas con DNF
dnf install firewall-config

# Para sistemas con YUM
yum install firewall-config

Habilitar e iniciar el servicio

Tras asegurarse de tener la versión actualizada, el siguiente paso es habilitar el servicio para que inicie automáticamente con el sistema y proceder a activarlo por primera vez.

# Habilitar el servicio para que inicie en el arranque
systemctl enable firewalld

# Iniciar el servicio inmediatamente
systemctl start firewalld

Para gestionar el servicio durante la operación, utilice los mandatos estándar de systemctl o la recarga dinámica de FirewallD:

# Para detener el servicio (¡Use con precaución!)
systemctl stop firewalld

# Para reiniciar el servicio y aplicar configuraciones profundas
systemctl restart firewalld

# Para recargar únicamente las reglas de FirewallD sin reiniciar el servicio (recomendado)
firewall-cmd --reload

Zonas de FirewallD: Niveles de confianza predefinidos

El modelo de seguridad de FirewallD se basa en zonas. Una zona es un conjunto de reglas que define el nivel de confianza para las conexiones de red entrantes. Cada interfaz de red y fuente de tráfico puede asignarse a una zona específica.

A continuación se describen las zonas predefinidas, ordenadas de mayor a menor restricción:

Consultar y modificar zonas activas

Para familiarizarse con la configuración actual, utilice los siguientes mandatos de diagnóstico:

# Listar todas las zonas disponibles
firewall-cmd --get-zones

# Mostrar la zona predeterminada
firewall-cmd --get-default-zone

# Listar los servicios permitidos en la zona actual
firewall-cmd --list-services

# Mostrar todas las interfaces de red y las zonas a las que están asignadas
firewall-cmd --get-active-zones

Para cambiar la zona predeterminada del sistema, por ejemplo a home, ejecute:

firewall-cmd --set-default-zone=home

Cambios temporales versus permanentes

FirewallD distingue entre cambios en tiempo real y cambios persistentes, una característica que facilita las pruebas sin riesgo.

🔧 Consejo pedagógico: Siempre pruebe primero las reglas de forma temporal. Una vez confirmado que funcionan correctamente, aplíquelas de forma permanente.

Gestión de interfaces y zonas personalizadas

La potencia de FirewallD reside en asignar diferentes niveles de seguridad a cada interfaz de red.

Asignar interfaces a zonas

Supongamos un servidor con tres interfaces: enp0s3 (hacia Internet), enp0s8 (red interna) y enp0s9 (zona DMZ). Puede asignarlas a zonas específicas de la siguiente manera:

# Asignar interfaz externa a la zona 'public'
firewall-cmd --zone=public --add-interface=enp0s3 --permanent

# Asignar interfaz interna a la zona 'internal'
firewall-cmd --zone=internal --add-interface=enp0s8 --permanent

# Asignar interfaz DMZ a la zona 'dmz'
firewall-cmd --zone=dmz --add-interface=enp0s9 --permanent

# Aplicar los cambios
firewall-cmd --reload

Para ver un resumen completo de la configuración de una zona, incluyendo sus interfaces y reglas, utilice:

firewall-cmd --zone=public --list-all

Crear zonas personalizadas para control granular

Las zonas personalizadas son ideales para aislar servicios. Por ejemplo, para crear una zona dbadmin que restrinja el acceso a MariaDB solo a direcciones IP específicas, siga estos pasos:

# 1. Crear una nueva zona permanente
firewall-cmd --permanent --new-zone=dbadmin

# 2. Añadir el servicio 'mysql' (puerto 3306/tcp) a la zona
firewall-cmd --permanent --zone=dbadmin --add-service=mysql

# 3. Especificar las direcciones IP de origen permitidas (por ejemplo, un anfitrión de administración)
firewall-cmd --permanent --zone=dbadmin --add-source=192.168.100.121/32

# 4. Recargar FirewallD para aplicar la nueva zona
firewall-cmd --reload

# 5. Verificar la configuración de la nueva zona
firewall-cmd --zone=dbadmin --list-all

Este enfoque resulta mucho más seguro que abrir el puerto de la base de datos a toda la red.

Configuración de NAT y redireccionamiento de puertos

FirewallD simplifica la configuración de enmascaramiento (SNAT) y redireccionamiento de puertos (DNAT), funciones esenciales para puertas de enlace y servidores.

Habilitar enmascaramiento (SNAT)

El enmascaramiento permite a los equipos de una red privada salir a Internet utilizando la dirección IP pública del servidor. Para habilitarlo en la zona que da al exterior (por ejemplo, public):

# Habilitar el enmascaramiento de forma permanente en la zona 'public'
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload

Al activar esta opción, FirewallD habilita automáticamente el reenvío de paquetes IP en el núcleo. Puede verificarlo con:

sysctl net.ipv4.ip_forward

La salida debe ser net.ipv4.ip_forward = 1.

Configurar redireccionamiento de puertos (DNAT)

El DNAT se utiliza para exponer un servicio interno a través de un puerto específico del cortafuegos. La sintaxis básica es: firewall-cmd --zone=[zona] --add-forward-port=port=[puerto-externo]:proto=[protocolo]:toport=[puerto-interno]:toaddr=[IP-interna].

Ejemplo 1: Redirigir el puerto 22023 del cortafuegos al puerto SSH (22) de un servidor interno (172.16.1.2).

firewall-cmd --zone=public --add-forward-port=port=22023:proto=tcp:toport=22:toaddr=172.16.1.2 --permanent
firewall-cmd --reload

Ejemplo 2: Redirigir el puerto 3389 (RDP) del cortafuegos al mismo puerto en un equipo interno (172.16.1.3).

firewall-cmd --zone=public --add-forward-port=port=3389:proto=tcp:toport=3389:toaddr=172.16.1.3 --permanent
firewall-cmd --reload

Puede listar todos los puertos reenviados en una zona con firewall-cmd --zone=public --list-forward-ports.

Reglas de filtrado avanzado

Para escenarios que requieren un control más preciso que simplemente abrir servicios o puertos, FirewallD ofrece las normas complejas (rich rules). Estas reglas permiten filtrar por dirección IP de origen/destino, puerto, protocolo y acción (aceptar, rechazar, descartar) en una sola sentencia.

Sintaxis básica y ejemplos

La estructura de una norma compleja sigue este patrón: rule [family="ipv4|ipv6"] [source|destination address="dirección/máscara"] [port port="número" protocol="tcp|udp"] [accept|reject|drop|log].

Ejemplo 1: Rechazar explícitamente todo el tráfico proveniente de un bloque de IP específico.

firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=141.98.11.0/24 reject' --permanent
firewall-cmd --reload

Ejemplo 2: Permitir acceso al puerto 8080 únicamente desde una IP de administración (192.168.1.100).

firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.1.100/32 port port=8080 protocol=tcp accept' --permanent
firewall-cmd --reload

Impacto en los archivos de configuración

Las normas complejas se escriben de forma estructurada en el archivo XML de la zona correspondiente, usualmente /etc/firewalld/zones/public.xml. Tras añadir la regla del ejemplo 1, el archivo incluiría una entrada similar a esta:

<zone>
  ... (otras configuraciones) ...
  <rule family="ipv4">
    <source address="141.98.11.0/24"/>
    <reject/>
  </rule>
</zone>

⚠️ Advertencia de rendimiento: Añadir un gran volumen de normas complejas individuales (por ejemplo, cientos de direcciones IP) puede ralentizar la carga de las reglas y afectar el rendimiento del filtrado. Para bloquear grandes conjuntos de direcciones, resulta más eficiente utilizar conjuntos de IP (ipsets), como se describe en la siguiente sección.

Bloqueo por origen geográfico usando conjuntos de IP

Bloquear tráfico por país es una medida de seguridad agresiva pero efectiva en ciertos contextos. FirewallD, combinado con ipset, permite implementar esta funcionalidad de manera eficiente.

Procedimiento recomendado: Lista negra por bloques (hash:net)

Este método es el más común y bloquea rangos completos de direcciones IP asignados a un país.

  1. Descargar las listas de bloques por país desde un proveedor como IPDeny.

    wget http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz
    mkdir -p /usr/local/share/data-countries
    tar -xzf all-zones.tar.gz -C /usr/local/share/data-countries
  2. Crear un conjunto de IP (ipset) de tipo red dentro de FirewallD.

    firewall-cmd --permanent --new-ipset=blacklist --type=hash:net --option=family=inet --option=hashsize=4096 --option=maxelem=200000
  3. Vincular el conjunto de IP a una zona restrictiva como drop o block.

    firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist
    firewall-cmd --reload
  4. Añadir un país completo a la lista negra. Por ejemplo, para bloquear la Federación Rusa (archivo ru.zone).

    firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=/usr/local/share/data-countries/ru.zone
    firewall-cmd --reload

⚠️ Consideraciones importantes:

Alternativa: Lista negra por direcciones individuales (hash:ip)

Para un control más fino y reactivo ―similar a herramientas como Fail2ban―, cree un conjunto de IP de tipo dirección individual.

# Crear el ipset de tipo 'hash:ip'
firewall-cmd --permanent --new-ipset=blacklist-ip --type=hash:ip --option=family=inet --option=hashsize=4096 --option=maxelem=200000

# Añadir direcciones IP específicas de forma granular
firewall-cmd --permanent --ipset=blacklist-ip --add-entry=203.0.113.45
firewall-cmd --permanent --ipset=blacklist-ip --add-entry=198.51.100.128
firewall-cmd --reload

🛡️ Escenario avanzado: Cortafuegos estricto para red local con servidor intermediario transparente y filosofía de lista blanca

Este escenario práctico configura un cortafuegos de puerta de enlace con políticas estrictas de lista blanca, inspirado en las mejores prácticas de entornos corporativos de alta seguridad como los de proveedores de servicios financieros. La combinación de un cortafuegos con políticas de lista blanca y un servidor intermediario (proxy) transparente con filtrado estricto es lo que efectivamente dificulta que aplicaciones indeseadas y el malware puedan comunicarse al exterior.

🎯 Objetivos y filosofía de seguridad

  1. Defensa en profundidad: El cortafuegos (FirewallD) actúa como el primer filtro, aplicando la política de "lo que no está permitido, está denegado". El servidor intermediario (Squid) actúa como el segundo y más inteligente filtro, inspeccionando y aplicando reglas complejas de contenido.
  2. Control total de la salida: La red local (enp0s8, zona internal) carece de acceso directo a Internet. Todo el tráfico web debe pasar forzosamente por el servidor intermediario Squid.
  3. Servicios locales obligatorios: La LAN depende completamente del cortafuegos para servicios básicos (DNS, NTP) y acceso web (a través del servidor intermediario).
  4. Excepciones mínimas y justificadas: Cualquier excepción a la regla general (como acceso a un servidor de correo específico o permiso para consultas WHOIS) se concede de forma granular y explícita.

🔧 Configuración paso a paso

Paso 1: Asignación básica de interfaces y zonas

# Establecer una política muy restrictiva por defecto
firewall-cmd --set-default-zone=drop

# Asignar la interfaz externa (Internet) a la zona 'public'
firewall-cmd --zone=public --add-interface=enp0s3 --permanent

# Asignar la interfaz interna (LAN corporativa) a la zona 'internal'
firewall-cmd --zone=internal --add-interface=enp0s8 --permanent

firewall-cmd --reload

Paso 2: Habilitar NAT en la interfaz pública

# Habilitar el enmascaramiento para que la LAN pueda salir a Internet a través del servidor intermediario
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload

Paso 3: Configurar el servidor intermediario transparente y contexto de lista blanca en Squid

🔐 Refuerzo de seguridad con Squid La configuración del servidor intermediario transparente es solo la mitad de la solución. Para impedir que aplicaciones como Ultrasurf o Your-Freedom, o malware, utilicen túneles SSL/HTTPS (puerto 443) o cualquier otro puerto permitido para evadir controles, resulta imperativo configurar Squid con una política de lista blanca estricta.

La filosofía, como se describe en el manual de Squid de Alcance Libre, es: "CERRAR la salida a TODO e ir abriendo el acceso sólo a lo que realmente necesita acceder la LAN corporativa". Esto se implementa en Squid definiendo listas de control de acceso (acl) que permitan solo dominios específicos (ej: .gob.mx, .edu.mx, dominios de proveedores) y denegando explícitamente todo lo demás (http_access deny all).

Así, aunque el cortafuegos permita el puerto 443 hacia Internet, Squid bloqueará la conexión a cualquier dominio que no esté en la lista blanca, neutralizando los intentos de tunelización.

Paso 4: Restringir el acceso a servicios de correo electrónico a un anfitrión específico Se permite el tráfico hacia los puertos de correo estándar, pero sólo si el destino es la dirección IP del servidor de correo autorizado (ej. 203.0.113.10).

firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 destination address=203.0.113.10/32 port port=110 protocol=tcp accept' --permanent
firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 destination address=203.0.113.10/32 port port=143 protocol=tcp accept' --permanent
firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 destination address=203.0.113.10/32 port port=465 protocol=tcp accept' --permanent
firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 destination address=203.0.113.10/32 port port=587 protocol=tcp accept' --permanent
firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 destination address=203.0.113.10/32 port port=993 protocol=tcp accept' --permanent
firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 destination address=203.0.113.10/32 port port=995 protocol=tcp accept' --permanent

Paso 5: Permitir excepciones para anfitriones específicos de la LAN En entornos estrictos, ciertos roles o departamentos pueden requerir accesos especiales. Estas excepciones deben ser mínimas, justificadas y configuradas de la forma más granular posible.

Paso 5: Permitir excepciones para anfitriones específicos de la LAN (por dirección MAC) En entornos con IPs dinámicas (DHCP), puede ser necesario filtrar por dirección MAC, la cual identifica al adaptador de red físicamente. Es importante señalar que FirewallD carece de soporte nativo para filtrado por MAC en sus zonas o normas complejas.

La alternativa es utilizar reglas directas (direct rules), que inyectan mandatos de nftables directamente en el motor del cortafuegos, evitando la capa de abstracción de FirewallD. Esto requiere mayor precaución, ya que las reglas pueden persistir de forma distinta.

Importante sobre reglas directas:

Paso 6: Restringir servicios básicos (DNS, NTP) únicamente al servidor local

Paso 7: Filtrado de DNS hacia el exterior (mitigación de tunelización DNS) Una regla genérica que permita el tráfico a los puertos 53/TCP y 53/UDP habilita el riesgo de tunelización DNS, donde herramientas de elusión o malware encapsulan datos dentro de consultas DNS para evadir el servidor intermediario. La contramedida es una lista blanca de servidores DNS usando normas complejas. El siguiente ejemplo permite consultas DNS salientes desde la red local (172.16.1.0/24), pero exclusivamente hacia los servidores DNS de Google:

firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 destination address=8.8.8.8/32 port port=53 protocol=udp accept' --permanent
firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 destination address=8.8.8.8/32 port port=53 protocol=tcp accept' --permanent
firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 destination address=8.8.4.4/32 port port=53 protocol=udp accept' --permanent
firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 destination address=8.8.4.4/32 port port=53 protocol=tcp accept' --permanent

Nota: En nuestro escenario estricto, los pasos 6 y 7 son mutuamente excluyentes. El paso 6 (DNS local) resulta más seguro. El paso 7 se presenta como una alternativa flexible que sigue siendo segura si se requiere DNS externo.

Paso 8: Aplicar toda la configuración

firewall-cmd --reload

# Verificar el estado final de cada zona
firewall-cmd --zone=public --list-all
firewall-cmd --zone=internal --list-all

📖 Apéndice A: Conceptos Fundamentales de Cortafuegos y Red (Adaptados del obsoleto manual de Shorewall)

Los siguientes conceptos teóricos son fundamentales para comprender el funcionamiento de cualquier cortafuegos, incluido FirewallD. Se presentan aquí como material de referencia pedagógica, adaptados de documentación técnica anterior.

¿Qué es una zona desmilitarizada (DMZ)?

Una zona desmilitarizada (DMZ) es una subred física o lógica que contiene y expone servicios de una organización (como servidores web, de correo o de aplicaciones) a una red de menor confianza, usualmente Internet. El objetivo es añadir una capa de seguridad adicional a la red local (LAN): si un atacante compromete un equipo en la DMZ, todavía deberá atravesar el cortafuegos para acceder a los recursos internos.

En términos de FirewallD, la DMZ se implementa asignando una interfaz de red o un bloque de direcciones IP específico a una zona con un nivel de confianza intermedio (por ejemplo, la zona dmz), la cual tiene políticas más restrictivas hacia la zona internal que la zona internal tiene hacia Internet.

¿Qué es una Red Privada?

Una red privada utiliza direcciones IP reservadas para tal fin, tal como lo establece el RFC 1918. Estas direcciones carecen de enrutabilidad en Internet y deben ser traducidas (NAT) a una dirección IP pública para acceder a recursos externos. Los rangos reservados son:

El uso de estas direcciones es una práctica universal en redes locales corporativas y domésticas.

Conceptos de Traducción de Direcciones de Red (NAT)

El NAT es una técnica esencial para la conectividad moderna. FirewallD lo gestiona de manera integrada, pero comprender sus variantes es clave.

🔧 Nota para FirewallD: En la práctica de FirewallD, el "enmascaramiento" (masquerading) es la implementación más común de SNAT para conexiones salientes. El DNAT se usa para el reenvío de puertos (port forwarding). La distinción conceptual ayuda a entender qué tipo de regla se necesita en cada escenario descrito en las secciones prácticas de este manual.

📖 Apéndice B: Conceptos Clave del Protocolo DNS

Comprender el protocolo DNS es crucial para implementar reglas de filtrado efectivas, como las descritas en el Paso 7 del escenario avanzado.

Componentes y operación básica

Herramientas de diagnóstico

Las herramientas dig y host (del paquete bind-utils) son esenciales para diagnosticar problemas de DNS y verificar que las restricciones de cortafuegos funcionen como se espera.

# Ejemplo de consulta con dig
dig @8.8.8.8 www.alcancelibre.org

# Ejemplo de consulta inversa con host
host 8.8.8.8

Conclusión

FirewallD es una herramienta poderosa y accesible para implementar una seguridad de red robusta en sistemas Linux modernos. Su diseño basado en zonas, combinado con la flexibilidad de las normas complejas y los conjuntos de IP, permite crear desde configuraciones simples para un servidor hasta políticas estrictas de lista blanca para puertas de enlace corporativas.

La efectividad máxima se logra cuando se integra con otras herramientas como Squid, configurado bajo la misma filosofía restrictiva, creando una defensa en profundidad que controle tanto la conectividad como el contenido. Este manual, junto con los conceptos de los apéndices, proporciona una base sólida para diseñar y mantener una postura de seguridad proactiva y efectiva.

Recuerde que la seguridad es un proceso continuo. Las reglas del cortafuegos deben revisarse y actualizarse periódicamente, y siempre deben complementarse con otras prácticas como la actualización constante del sistema, la configuración adecuada de SELinux y una Política de Uso Aceptable clara para los usuarios.