Destacados

Los Comandos más utilizados en LVM

Este post presenta los comandos mas utilizados en la adminstración de volumenes LVM. Volumenes Físicos (PV) pvcreate : Inicializar un dispos...

18 abril 2024

Guía básica del cortafuegos firewalld

Mantener nuestros servidores seguros es crucial, y una pieza clave para lograrlo es la configuración de un firewall en cada uno. Un firewall añade una capa de seguridad vital, protegiendonos no solo de amenazas externas sino también de posibles ataques internos.

Las distribuciones Linux siempre han ofrecido herramientas robustas para controlar el tráfico de red. En este artículo, nos centraremos en Firewalld, un demonio de firewall dinámico que viene preinstalado en muchas distribuciones populares como Red Hat, CentOS, Fedora, AlmaLinux y Rocky Linux.

Firewall simplifica la gestión del firewall al organizar las reglas de filtrado en zonas. A estas zonas les asignamos las interfaces de red de nuestro servidor (por ejemplo eth0, enp0s3), permitiendo que el tráfico que pasa por ellas sea controlado por las reglas definidas en esa zona.

Una gran ventaja de Firewalld es su capacidad para realizar cambios de forma dinámica, lo que significa que puedes modificar las reglas del firewall sin interrumpir el tráfico de red que ya está fluyendo.

Veamos cómo gestionar Firewalld usando el comando de línea de comandos firewall-cmd.

Verificando el estado y gestionando Firewalld

Antes de empezar a configurar, es fundamental saber si Firewalld está funcionando y cómo controlarlo. En sistemas Linux modernos, usamos el comando systemctl para interactuar con los servicios.

1. ¿Cómo determinar si Firewalld está activo?

Puedes verificar el estado de Firewalld de dos maneras:

a) Usando systemctl status (más detallado):

Este comando te da una visión completa del estado del servicio Firewalld.

systemctl status firewalld

Si Firewalld está activo y funcionando, verás una salida similar a esta, donde Active: active (running) indica que está en ejecución y enabled significa que se iniciará automáticamente con el sistema.


      ● firewalld.service - firewalld - dynamic firewall daemon
      Loaded: loaded (/usr/lib/systemd/system/firewalld.service;enabled; vendor preset: enabled)
            Active: active (running) since Mon 2024-06-23 10:00:00 -04; 2h ago 
            Docs: man:firewalld(1) 
            Main PID: 1234 (firewalld) Tasks: 2 (limit: 1140) Memory: 10.5M CPU: 130ms 
            CGroup: /system.slice/firewalld.service 
            └─1234 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

b) Usando firewall-cmd --state (más conciso):

Este comando es más simple y solo te dirá si el demonio de Firewalld está corriendo.

firewall-cmd --state

Si está funcionando, la salida será running. Si no, mostrará not running.

2. ¿Cómo activar o desactivar Firewalld?

Para controlar Firewalld, usamos systemctl. Es importante diferenciar entre iniciar/detener el servicio en el momento y habilitarlo/deshabilitarlo para que se inicie con el sistema.

Para iniciar Firewalld (en la sesión actual):
systemctl start firewalld

Para detener Firewalld (en la sesión actual):

systemctl stop firewalld

¡Cuidado! Detener Firewalld dejará tu servidor sin la protección del firewall.

Para habilitar Firewalld (para que inicie automáticamente con el sistema):

systemctl enable firewalld

Para deshabilitar Firewalld (para que NO inicie automáticamente con el sistema):

systemctl disable firewalld

Comandos básicos y listado de configuración

Comencemos por verificar las zonas activas y las interfaces de red que tienen asignadas. Para ello, usamos el comando:

firewall-cmd --get-active-zones

La salida será similar a esta:

   
      public:
   
          interfaces: eth0
   

Esta salida nos indica que tenemos una zona activa llamada public y que la intefaz de red eth0 está asociada a ella. Ahora, para tener una visión completa de todos los servicios, puertos y otras reglas configuradas en la zona public, utilizamos el siguiente comando:

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

Obtendrás una salida detallada como esta:

   
      public (active)
   
        target: default
        icmp-block-inversion: no
        interfaces: eth0
        sources:
        services: dhcpv6-client ssh
        ports:
        protocols:
        masquerade: no
        forward-ports:
        source-ports:
        icmp-blocks:
        rich-rules:
   

Como puedes observar, la zona public tiene asociada la interfaz eth0. En la sección services (servicios), vemos que el tráfico para dhcpv6-client y ssh está permitido. Nota que en la sección ports (puertos) no hay ningún puerto individualmente habilitado, ya que estos servicios usan sus puertos por defecto.

Ahora, habilitemos el tráfico para algunos servicios comunes en nuestra zona public. Agregaremos los servicios web (http y https) y ftp.

Para los servicios web (http y https) usamos

   
      firewall-cmd --zone=public --add-service=http
   
      firewall-cmd --zone=public --add-service=https
   

y para el servicio FTP:

firewall-cmd --zone=public --add-service=ftp

Es una buena práctica eliminar servicios que no se usan. Por ejemplo, si tu servidor tiene una IP estática, es probable que no necesites el cliente DHCPv6. Para eliminarlo:

firewall-cmd --zone=public --remove-service=dhcpv6-client

Si volvemos a listar la configuración completa de la zona public con firewall-cmd --zone=public --list-all, veras que la sección services ahora refleja estos cambios:

   
      public (active)
   
         ...
         services: ftp http https ssh
         ...
   

Como puedes ver, los servicios ftp, http, https y ssh ahora están listados en la sección services.

¿Eso es todo? ¡No, aún no hemos terminado!

Es importante entender que los cambios que hemos realizado hasta ahora con firewall-cmd son inmediatos y afecta la configuración en tiempo de ejecución (runtime). Esto significa que el tráfico para los servicios HTTP, HTTPS y FTP ya está permitido. Sin embargo, hay un detalle crucial: si reinicias el servidor, todos estos cambios se perderán y la configuración del firewall volverá a su estado anterior.

Para hacer que estas modificaciones sean permanentes y persistan después de un reinicio, tienes dos opciones:

1. Guardar la configuración en ejecución a la configuración permanente:

Una vez que estés satisfecho con los cambios que has hecho en tiempo de ejecución, puedes guardarlos explícitamente en la configuración permanente con este comando:

firewall-cmd --runtime-to-permanent

Este comando copia todas las reglas activas actualmente a los archivos de configuración pemanente de Firewalld.

2. Realizar los cambios directamente en la configuración permanente y luego recargar:

La otra forma es añadir el argumento --permanent a cada comando que ejecutes. Esto indica a Firewalld que la modificacion se debe aplicar directamente a la configuración permanente, no solo a la configuración en ejecución.
   
      firewall-cmd --zone=public --add-service=http --permanent
      firewall-cmd --zone=public --add-service=https --permanent
      firewall-cmd --zone=public --add-service=ftp --permanent
      firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent
   

¡Importante! Cuando modificas la configuración permanente de esta manera, los cambios no se aplican inmediatamente al firewall en ejecución. Para que Firewalld active estas nuevas reglas, necesitas recargar el servicio:

firewall-cmd --reload

Ten en cuenta que al ejecutar --reload, Firewall recarga su configuración y módulos asociados. Esto puede causar una breve interrupción en el tráfico que pasa por el firewall mientras se aplican las nuevas reglas. Por lo tanto, si realizas cambios en un servidor en producción, planifica este comando con precaución.

Comandos útiles adicionales de Firewalld

a. Obtener la lista de servicios predefinidos:

firewall-cmd --get-services

La salida es una larga lista de servicios como esta (puede variar):

RH-Satellite-6 RH-Satellite-6-capsule amanda-client ... dhcp ... http https imap imaps ... ldap... ntp nrpe... ssh...

b. Añadir una regla temporal (con timeout):

Ideal para pruebas, especialmente en servidores remotos. Puedes permitir un servicio o puerto por un tiempo limitado. Por ejemplo, para abrir SSH por 15 minutos.

firewall-cmd --zone=public --add-service=ssh --timeout=15m

Después de 15 minutos, la regla se eliminará automáticamente.

c. Verificar la sintaxis de la configuración permanente:

Antes de recargar una configuración permanente, es buena idea verificar que no haya errores de sintaxis:

firewall-cmd --check-config

d. Listar puertos permitidos en una zona:

Para ver solo los puertos que tienes abiertos en una zona específica (diferente de los servicios):

firewall-cmd --zone=public --list-ports

e. Añadir un puerto específico para tráfico entrante:

Si necesitas abrir un puerto que no está asociado a un servicio predefinido (ej. puerto 566 con protocolo TCP):

firewall-cmd --zone=public --add-port=566/tcp

f. Bloquear/Eliminar un puerto específico:

Para cerrar un puerto que ya no necesitas:

firewall-cmd --zone=public --remove-port=566/tcp

g. Listar todas las zonas definidas en el sistema:

Para ver qué zonas están disponibles en tu sistema Firewalld (no solo las activas):

firewall-cmd --get-zones

Ejemplo de salida:

block dmz drop external home internal public trusted work

Recordatorio importante para los comandos adicionales:

Recuerda que, al igual que con los servicios, si deseas que los cambios realizados con estos comandos sean permanentes, debes añadir el argumento --permanent a cada comando y luego recargar Firewalld con

   firewall-cmd --reload

Referencias