Introduction
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,firewalldse 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 dezonasandservicios, 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
Basic concepts: areas and services
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 comandosfirewall-cmdes 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 - Add a specific port:
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í:
- Asignar la interfaz de red pública a la zona
public:
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
- 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
- Asignar la interfaz de red interna a la zona
internal:
sudo firewall-cmd --zone=internal --change-interface=eth1 --permanent
- 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 medianterich 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--reloadpara 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 atributofamilyen 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 incluyefirewall-config, una interfaz GTK que permite gestionar zonas, servicios, puertos y rich rules mediante arrastrar y soltar. Esta aplicación se instala con el paquetefirewall-configy se ejecuta desde el menú de aplicaciones o mediantesudo 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.
Common problem solution
- Los cambios no persisten:Verifique que haya utilizado la bandera
--permanentantes 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=publicpara inspeccionar las reglas activas. - IPv6 no funciona:Confirme que el kernel tenga IPv6 habilitado (
lsmod | grep ipv6) y que las reglas incluyanfamily='ipv6'cuando corresponda.
Automatización con Ansible
En entornos de infraestructura como código, firewalld se gestiona fácilmente mediante el móduloansible.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.
Good security practices
- Utilice la zona
publiccomo predeterminada para interfaces expuestas a Internet y ajuste solo los servicios necesarios. - Avoid using the area
trusteden entornos de producción; otorga acceso total y aumenta la superficie de ataque. - Revise periódicamente las reglas activas con
sudo firewall-cmd --list-ally elimine aquellos servicios o puertos que ya no se necesiten. - Combine firewalld con herramientas de monitoreo como
fail2banorpsadpara 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.
Conclusion
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.


