Firewalld: Complete guide to managing the firewall in Linux

Introducción

En los entornos Linux modernos, la seguridad perimetral es un pilar fundamental para proteger servidores, estaciones de trabajo y dispositivos en la nube. Entre las diversas herramientas disponibles, firewalld se ha convertido en la solución predeterminada en distribuciones como RHEL, CentOS Stream, Fedora y openSUSE. Este servicio ofrece una interfaz dinámica y basada en zonas que permite administrar el firewall de forma más intuitiva que el tradicional iptables, sin perder la potencia y flexibilidad que los administradores esperan.

¿Qué es Firewalld?

Firewalld es un daemon que proporciona una capa de abstracción sobre el framework de netfilter/iptables del kernel Linux. En lugar de manipular directamente las cadenas y reglas de iptables, firewalld trabaja con conceptos de zonas y servicios, lo que simplifica la creación y modificación de políticas de seguridad. Cada zona representa un nivel de confianza (por ejemplo, public, internal, dmz) y contiene un conjunto de servicios permitidos y puertos específicos. Cuando se cambia la zona de una interfaz de red, firewalld aplica automáticamente las reglas correspondientes, sin necesidad de reiniciar el servicio.

Instalación y activación

En la mayoría de las distribuciones basadas en RPM, firewalld viene preinstalado. Si no está presente, se puede instalar con el gestor de paquetes correspondiente:

  • RHEL / CentOS Stream: sudo dnf install firewalld
  • Fedora: sudo dnf install firewalld
  • openSUSE: sudo zypper install firewalld
  • Debian / Ubuntu (opcional): sudo apt install firewalld

Tras la instalación, habilite e inicie el daemon:

  • sudo systemctl enable --now firewalld

Para verificar su estado:

  • sudo systemctl status firewalld

Conceptos básicos: zonas y servicios

Firewalld agrupa las interfaces de red en zonas. Cada zona define qué tráfico está permitido de forma predeterminada. Algunas zonas comunes son:

  • drop: descarta todo el tráfico entrante sin respuesta.
  • block: rechaza el tráfico entrante con un mensaje ICMP de prohibición.
  • public: zona recomendada para redes no confiables; permite solo servicios seleccionados (por ejemplo, ssh).
  • internal: para redes internas de confianza; permite más servicios.
  • dmz: zona desmilitarizada para servidores accesibles desde Internet.
  • trusted: acepta todo el tráfico.

Los servicios son definiciones predefinidas de puertos y protocolos (por ejemplo, ssh, http, https) que facilitan la apertura de puertos sin necesidad de recordar números específicos. Puede listar los servicios disponibles con:

  • sudo firewall-cmd --get-services

Comandos esenciales de firewall-cmd

La herramienta de línea de comandos firewall-cmd es la interfaz principal para interactuar con firewalld. Algunos de los comandos más útiles incluyen:

  • Listar la zona predeterminada: sudo firewall-cmd --get-default-zone
  • Listar todas las zonas y sus configuraciones: sudo firewall-cmd --list-all-zones
  • Obtener la zona activa de una interfaz: sudo firewall-cmd --get-zone-of-interfaces=eth0
  • Cambiar la zona de una interfaz (de forma inmediata): sudo firewall-cmd --zone=public --change-interface=eth0
  • Agregar un servicio a una zona (de forma permanente): sudo firewall-cmd --zone=public --add-service=http --permanent
  • Agregar un puerto específico: sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
  • Eliminar una regla: sudo firewall-cmd --zone=public --remove-service=ssh --permanent
  • Recargar la configuración para aplicar cambios permanentes: sudo firewall-cmd --reload

Nota: sin la bandera --permanent, los cambios son temporales y se pierden al recargar o reiniciar el servicio.

Trabajando con zonas de forma práctica

Supongamos que tiene un servidor web que debe estar accesible desde Internet, pero solo permitir SSH desde la red interna. Puede proceder así:

  1. Asignar la interfaz de red pública a la zona public:
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
  1. Permitir HTTP y HTTPS en la zona pública:
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
  1. Asignar la interfaz de red interna a la zona internal:
sudo firewall-cmd --zone=internal --change-interface=eth1 --permanent
  1. Permitir SSH solo en la zona interna:
sudo firewall-cmd --zone=internal --add-service=ssh --permanent

Finalmente, recargue la configuración:

sudo firewall-cmd --reload

Con este enfoque, el tráfico web está expuesto al mundo, mientras que el acceso remoto mediante SSH queda restringido a la red de confianza.

Reglas personalizadas y rich rules

Cuando los servicios predefinidos no son suficientes, firewalld permite crear reglas personalizadas mediante rich rules. Estas reglas ofrecen gran flexibilidad, permitiendo especificar direcciones IP de origen o destino, puertos, protocolos e incluso acciones de registro.

Ejemplo: permitir tráfico HTTP solo desde la red 203.0.113.0/24:

sudo firewall-cmd --zone=public --add-rich-rule='rule family=\'ipv4\' source address=\'203.0.113.0/24\' service value=\'http\' accept' --permanent

Ejemplo: registrar y descartar paquetes de una IP sospechosa:

sudo firewall-cmd --zone=public --add-rich-rule='rule family=\'ipv4\' source address=\'198.51.100.55\' drop' --permanent
sudo firewall-cmd --zone=public --add-rich-rule='rule family=\'ipv4\' source address=\'198.51.100.55\' log level=\'notice\' prefix=\'FIREWALL DROP: \'' --permanent

Después de agregar cualquier rich rule, recuerde ejecutar --reload para que surta efecto.

IPv6 y firewalld

Firewalld soporta tanto IPv4 como IPv6 de forma simultánea. Las reglas pueden especificarse explícitamente para una familia de protocoles usando el atributo family en las rich rules, o bien se pueden crear zonas separadas para cada versión de IP. Por ejemplo, para permitir tráfico ICMPv6 esencial en la zona pública:

sudo firewall-cmd --zone=public --add-rich-rule='rule family=\'ipv6\' icmp-type name=\'destination-unreachable\' accept' --permanent

Es importante revisar que las políticas de IPv6 no queden inadvertidamente más permisivas que las de IPv4, ya que muchos ataques se dirigen específicamente a la pila IPv6 cuando está menos monitorizada.

Interfaz gráfica: firewall-config

Para aquellos que prefieren una herramienta visual, firewalld incluye firewall-config, una interfaz GTK que permite gestionar zonas, servicios, puertos y rich rules mediante arrastrar y soltar. Esta aplicación se instala con el paquete firewall-config y se ejecuta desde el menú de aplicaciones o mediante sudo firewall-config. Aunque la línea de comandos es más adecuada para automatización y servidores sin entorno gráfico, la GUI resulta útil en estaciones de trabajo y para realizar auditorías rápidas de la configuración actual.

Solución de problemas comunes

  • Los cambios no persisten: Verifique que haya utilizado la bandera --permanent antes de recargar.
  • Conflictos con Docker o libvirt: Estos servicios crean sus propias zonas (por ejemplo, docker, libvirt). Asegúrese de no sobrescribir esas zonas manualmente; en su lugar, ajuste las reglas dentro de la zona correspondiente.
  • Reglas de rich rule no se aplican: Revise la sintaxis; los atributos deben estar entre comillas simples y los valores entre comillas simples también. Use sudo firewall-cmd --list-rich-rules --zone=public para inspeccionar las reglas activas.
  • IPv6 no funciona: Confirme que el kernel tenga IPv6 habilitado (lsmod | grep ipv6) y que las reglas incluyan family='ipv6' cuando corresponda.

Automatización con Ansible

En entornos de infraestructura como código, firewalld se gestiona fácilmente mediante el módulo ansible.posix.firewalld. Un ejemplo de tarea que abre el puerto 8080/tcp en la zona pública de forma permanente:

- name: Abrir puerto 8080/tcp en zona pública
ansible.posix.firewalld:
zone: public
port: 8080/tcp
immediate: yes
permanent: yes
state: enabled

De manera similar, se pueden eliminar servicios, agregar rich rules o recargar el daemon con el mismo módulo, lo que permite mantener la configuración del firewall sincronizada entre todos los servidores de un clúster.

Buenas prácticas de seguridad

  • Utilice la zona public como predeterminada para interfaces expuestas a Internet y ajuste solo los servicios necesarios.
  • Evite usar la zona trusted en entornos de producción; otorga acceso total y aumenta la superficie de ataque.
  • Revise periódicamente las reglas activas con sudo firewall-cmd --list-all y elimine aquellos servicios o puertos que ya no se necesiten.
  • Combine firewalld con herramientas de monitoreo como fail2ban o psad para bloquear automáticamente direcciones IP maliciosas.
  • Documente cada cambio importante (por qué se abrió un puerto, quién lo autorizó) en un wiki o en los comentarios de los archivos de configuración.
  • Mantenga el sistema actualizado; las actualizaciones del kernel y de firewalld pueden incluir mejoras de rendimiento y parches de seguridad.

Conclusión

Firewalld representa una evolución significativa respecto al manejo tradicional de iptables, ofreciendo una capa de abstracción que simplifica la administración del firewall sin sacrificar potencia. Su modelo basado en zonas y servicios, junto con la capacidad de crear rich rules personalizadas, lo convierte en una herramienta ideal tanto para administradores novatos como para expertos que requieren políticas de seguridad granulares. Al adoptar las buenas prácticas descritas y aprovechar la integración con systemd, podrá mantener su infraestructura Linux protegida de manera consistente y eficiente.