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.
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.
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
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
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:
drop
DROP.block
drop, pero notifica al remitente el rechazo de la conexión mediante un paquete ICMP.REJECT.public
ssh, dhcpv6-client.REJECT.external
ssh.REJECT.dmz
ssh.REJECT.work
ssh, dhcpv6-client, ipp-client.REJECT.home
work, diseñada para redes domésticas.ssh, dhcpv6-client, ipp-client, mdns, samba-client.REJECT.internal
ssh, dhcpv6-client, ipp-client, mdns, samba-client.REJECT.trusted
ACCEPT.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
FirewallD distingue entre cambios en tiempo real y cambios persistentes, una característica que facilita las pruebas sin riesgo.
Cambios temporales: Se aplican de inmediato pero se pierden al recargar el servicio o reiniciar el sistema.
firewall-cmd --zone=public --add-port=8080/tcp
Cambios permanentes: Se guardan en disco pero requieren una recarga para activarse. Utilice la opción --permanent.
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --reload
🔧 Consejo pedagógico: Siempre pruebe primero las reglas de forma temporal. Una vez confirmado que funcionan correctamente, aplíquelas de forma permanente.
La potencia de FirewallD reside en asignar diferentes niveles de seguridad a cada interfaz de red.
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
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.
FirewallD simplifica la configuración de enmascaramiento (SNAT) y redireccionamiento de puertos (DNAT), funciones esenciales para puertas de enlace y servidores.
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.
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.
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.
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
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.
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.
Este método es el más común y bloquea rangos completos de direcciones IP asignados a un país.
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
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
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
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:
firewall-config puede volverse lenta o difícil de usar con listas muy grandes.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
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.
enp0s8, zona internal) carece de acceso directo a Internet. Todo el tráfico web debe pasar forzosamente por el servidor intermediario Squid.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.
firewall-cmd --zone=internal --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=172.16.1.1 --permanentfirewall-cmd --zone=internal --add-port=3128/tcp --permanentPaso 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.
172.16.1.100 pueda realizar consultas WHOIS (puerto 43/TCP) a servidores externos.
firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 source address=172.16.1.100/32 port port=43 protocol=tcp accept' --permanentPaso 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.
Permitir consultas WHOIS desde una IP específica (ejemplo original mantenido):
sudo firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 source address=172.16.1.100/32 port port=43 protocol=tcp accept' --permanent
🔓 Excepción de acceso completo por dirección MAC (Alta Gerencia): Para otorgar acceso sin restricciones al dispositivo del presidente ejecutivo, identificado por su MAC AA:BB:CC:11:22:33.
# Regla directa para aceptar todo el tráfico desde una MAC específica en la zona 'internal'
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter IN_internal 0 -m mac --mac-source AA:BB:CC:11:22:33 -j ACCEPT
⚠️ Advertencia Técnica: Esta regla directa se añade a la cadena
IN_internalque procesa el tráfico entrante a la zona. El parámetro-m maccarga el módulo del núcleo para coincidir con la dirección MAC fuente. Verifique la MAC correcta conip link show.
📝 Permiso por MAC a área de contabilidad para segmentos de red específicos: Para permitir que el equipo del área de contabilidad (con MAC DD:EE:FF:44:55:66) acceda exclusivamente a bloques de IP específicos.
# Permitir acceso desde una MAC específica hacia dos bloques de IP hipotéticos
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter IN_internal 0 -m mac --mac-source DD:EE:FF:44:55:66 -d 203.101.160.0/20 -j ACCEPT
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter IN_internal 0 -m mac --mac-source DD:EE:FF:44:55:66 -d 200.94.64.0/19 -j ACCEPT
Nota pedagógica: Observe cómo en las reglas directas se combina el filtro por MAC (
-m mac --mac-source) con el filtro por destino (-d). El orden de las reglas es crítico: estas reglasACCEPTdeben preceder a cualquier regla general deDROPoREJECTen la misma cadena.
Importante sobre reglas directas:
sudo firewall-cmd --direct --get-all-rules.--permanent. Para una regla temporal, omita dicho indicador, pero recuerde que no se sincronizan con el estado de las zonas de FirewallD.--remove-rule.Paso 6: Restringir servicios básicos (DNS, NTP) únicamente al servidor local
firewall-cmd --zone=internal --add-service=dns --permanent
firewall-cmd --zone=internal --add-service=ntp --permanentPaso 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
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.
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.
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:
10.0.0.0 – 10.255.255.255 (CIDR: 10.0.0.0/8)172.16.0.0 – 172.31.255.255 (CIDR: 172.16.0.0/12)192.168.0.0 – 192.168.255.255 (CIDR: 192.168.0.0/16)El uso de estas direcciones es una práctica universal en redes locales corporativas y domésticas.
El NAT es una técnica esencial para la conectividad moderna. FirewallD lo gestiona de manera integrada, pero comprender sus variantes es clave.
--add-masquerade. Cambia la dirección IP de origen de los paquetes salientes.--add-forward-port. Cambia la dirección IP de destino de los paquetes entrantes.🔧 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.
Comprender el protocolo DNS es crucial para implementar reglas de filtrado efectivas, como las descritas en el Paso 7 del escenario avanzado.
www.alcancelibre.org) a una dirección IP. Un servidor DNS responde con la dirección correspondiente.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
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.