Configuración del firewall con Firewalld

En este capítulo, se describen los conceptos, las herramientas y los métodos para configurar el firewall con herramientas basadas en firewalld. También proporciona ejemplos para mostrar la configuración del firewall que aplica la seguridad de red en un sistema.

Herramientas de configuración de firewalld

Puede configurar el firewall con una de las siguientes herramientas:

  • Mediante el comando firewall-cmd y sus diversas opciones.

  • Mediante la interfaz gráfica de usuario de configuración de firewall

    Para utilizar esta herramienta, primero debe instalar el paquete firewall-config y, a continuación, iniciarlo con el mismo comando que el nombre del paquete, por ejemplo:

    sudo dnf install firewall-config
    sudo firewall-config &
    El comando abre la herramienta de configuración, como se muestra en la siguiente figura:
    En la figura, se muestra la interfaz gráfica de usuario de configuración de firewall.
  • Cockpit es una herramienta de configuración basada en explorador que también puede utilizar para realizar configuraciones de firewall. Consulte Oracle Linux: uso de la consola web de Cockpit.

Control del servicio firewalld

En Oracle Linux, el servicio de firewall, firewalld, está activado por defecto. El servicio se controla mediante el comando systemctl.

Para iniciar el servicio:

sudo systemctl unmask firewalld
sudo systemctl start firewalld

Para asegurarse de que el servicio se inicie automáticamente cuando se inicie el sistema, ejecute el siguiente comando después de iniciar el firewall:

sudo systemctl enable firewalld

Para detener el servicio de firewall y evitar que se inicie automáticamente cuando se inicie el sistema, ejecute el siguiente comando:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

Para evitar que otros servicios inicien el servicio de firewall o mediante la interfaz D-Bus firewalld, ejecute el siguiente comando después de desactivar el firewall:

sudo systemctl mask firewalld

Para mostrar el estado actual del servicio de firewall:

sudo systemctl status firewalld

Realice lo siguiente:

  • Para Oracle Linux 8, la salida de estado es similar a:

    firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: active (running) since Wed 2022-04-20 18:33:59 BST; 2 weeks 5 days ago
         Docs: man:firewalld(1)
     Main PID: 4261 (firewalld)
        Tasks: 3 (limit: 99538)
       Memory: 4.7M
       CGroup: /system.slice/firewalld.service
               └─4261 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
  • Para Oracle Linux 9, la salida de estado es similar a:

    firewalld.service - firewalld - dynamic firewall daemon
         Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
         Active: active (running) since Thu 2022-05-05 08:41:36 GMT; 5 days ago
           Docs: man:firewalld(1)
       Main PID: 1155 (firewalld)
          Tasks: 4 (limit: 93659)
         Memory: 32.5M
            CPU: 1.438s
         CGroup: /system.slice/firewalld.service
            └─1155 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid
  • Para Oracle Linux 10, la salida de estado es similar a:

    firewalld.service - firewalld - dynamic firewall daemon
          Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
          Active: active (running) since Thu 2025-01-04 08:41:36 GMT; 5 days ago
            Docs: man:firewalld(1)
        Main PID: 1155 (firewalld)
           Tasks: 4 (limit: 93659)
          Memory: 32.5M
             CPU: 1.438s
          CGroup: /system.slice/firewalld.service
             └─1155 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

Acerca de zonas y servicios

La seguridad del firewall se implementa a través de los conceptos de zonas y servicios.

Las zonas son conjuntos predefinidos de reglas de filtrado que corresponden a niveles de confianza para el acceso a la red. Puede agregar reglas de filtrado predeterminadas de una zona reconfigurando la configuración de la zona y, por lo tanto, acotar el control del flujo de tráfico de la zona. Cuando instala Oracle Linux, se asigna automáticamente al sistema una zona predeterminada denominada public.

Las reglas de firewall se aplican mediante servicios que se asignan a una zona. Los puertos de servicio son los puntos de acceso del tráfico de red. Los servicios asignados a una zona tienen sus puertos abiertos automáticamente para recibir y enviar paquetes de red.

Para obtener más información sobre las zonas y los servicios relacionados con firewall, consulte las páginas del manual firewalld.zone(5) y firewalld.service(5).

Visualización de información sobre zonas

Al configurar el firewall para las zonas, se recomienda mostrar la zona actual y los valores de servicio, así como otra información, como parte de los pasos de configuración. Con este enfoque, puede supervisar los cambios que está introduciendo en el firewall e identificar posibles errores que harían que los cambios no fueran válidos.

Para mostrar la zona predeterminada del sistema, ejecute el siguiente comando:

firewall-cmd --get-default

Enumere todas las zonas predefinidas que se incluyen en la instalación de la siguiente manera:

firewall-cmd --get-zones

Realice lo siguiente:

  • Para Oracle Linux 8, la salida es:

    block dmz drop external home internal public trusted work
  • Para Oracle Linux 9 y Oracle Linux 10, la salida es:

    block dmz drop external home internal nm-shared public trusted work

Puede configurar cualquier zona de la lista. A medida que cambia la configuración de una zona determinada, esa zona se convierte en una zona activa. Para identificar la zona activa, escriba lo siguiente:

firewall-cmd --get-active-zone
Nota

De manera predeterminada, todas las configuraciones se implementan en la zona predeterminada. Tenga en cuenta también que una zona activa no es necesariamente la zona predeterminada. Por lo tanto, debe especificar el nombre de zona en el comando para definir la configuración de esa zona específica. De lo contrario, las definiciones se aplican a la zona predeterminada.

Visualización de la configuración de zona

Para obtener la configuración de una zona:

sudo firewall-cmd --list-all [--zone=zonename]

Sin especificar una zona, el comando muestra la configuración de la zona predeterminada. Por lo tanto, para mostrar la configuración de la zona work, debe utilizar el siguiente comando:

sudo firewall-cmd --list-all --zone=work
work
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Configuración de zonas de firewalld

En las siguientes tareas, se describe cómo utilizar el comando firewall-cmd para configurar reglas de firewall para una zona. Las reglas se registran a continuación en la jerarquía /etc/firewalld para firewalld.

Configurar el firewall significa configurar todos o algunos de los valores de una zona en valores específicos para permitir que el firewall controle el tráfico de red según las especificaciones.

Control del acceso a los servicios

La configuración de services de una zona es la forma predeterminada de configurar el firewall. Cada zona tiene servicios predefinidos asignados. Para configurar aún más este valor, puede agregar servicios a la zona o eliminar servicios de la zona.

Para mostrar los servicios predefinidos, utilice el comando firewall-cmd --list-services.

Por ejemplo, el siguiente comando muestra que la zona work tiene los servicios cockpit, dhcpv6-client y ssh asignados:

sudo firewall-cmd --list-services --zone=work
cockpit dhcpv6-client ssh

Para abrir el acceso a un nuevo servicio, utilice la opción --add-service service. Opcionalmente, incluya la opción --permanent para que la regla se mantenga tras los reinicios.

Por ejemplo, para agregar los servicios HTTP y NFS a la zona work, debe utilizar el siguiente comando:

sudo firewall-cmd --permanent --zone=work --add-service=http --add-service=nfs
sudo firewall-cmd --list-services --zone=work
cockpit dhcpv6-client ssh http nfs

Para eliminar el acceso a un servicio, utilice la opción --remove-service service:

sudo firewall-cmd --permanent --zone=work --remove-service=cockpit
sudo firewall-cmd --list-services --zone=work 
dhcpv6-client ssh http nfs

Control de acceso a puertos

El tráfico de red a través de los servicios de la zona utiliza los puertos de esos servicios. Los puertos deben estar abiertos para aceptar tráfico. Puede abrir más puertos para el acceso de red especificando el número de puerto y el protocolo asociado.

La opción --list-ports muestra los puertos y los protocolos asociados a los que ha permitido explícitamente el acceso. Sin embargo, los puertos que se han abierto como servicio no se incluyen en la salida de este comando. Por lo tanto, al enumerar los puertos, la mejor práctica es utilizar la opción --list-all para obtener información más completa.

Utilice la opción --add-port para permitir el acceso a puertos específicos. Los puertos se deben especificar con el formato port-number/port-type. Los tipos de puerto pueden ser tcp, udp, sctp o dccp. Asegúrese de que el tipo y el tráfico de red coincidan, por ejemplo:

sudo firewall-cmd --permanent --zone=work --add-port=5353/udp --add-port=3689/tcp
sudo firewall-cmd --list-all --zone=work 
work
  target: default
  icmp-clock-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh http nfs 
  ports: 5353/udp 3689/tcp
...

Del mismo modo, la opción --remove-port elimina el acceso a un puerto. Recuerde utilizar la opción --permanent para que el cambio persista.

Para obtener más información, consulte la página del manual firewall-cmd(1).

Asignación de una interfaz de red a una zona

La interfaz de red de un sistema se asigna automáticamente a la zona predeterminada. En Oracle Linux, puede configurar varias zonas con sus servicios, puertos específicos, etc. A continuación, puede activar las reglas de una zona específica para que funcionen mediante la asignación de la interfaz a esa zona. Por lo tanto, tiene la flexibilidad de cambiar fácilmente las reglas de firewall que están activas en el sistema reasignando la interfaz de red.

Supongamos que desea activar la configuración de firewall de la zona work. Debería asignar la interfaz a la zona de la siguiente manera:

sudo firewall-cmd --zone=work --change-interface=enp0s1
firewall-cmd --get-active-zone
work
  interfaces: enp0s1
Nota

No es necesario que utilice la opción --permanent para que la configuración se mantenga tras los reinicios. Si establece que la zona sea la zona predeterminada, como se explica en Changing the Default Zone, la reasignación de la interfaz se convierte en permanente.

Cambio de la zona predeterminada

Puede cambiar la zona predeterminada de un sistema de la siguiente manera:

sudo firewall-cmd --set-default-zone=work

También puede verificar que se han aplicado los cambios:

firewall-cmd --get-default-zone

Para mostrar los resultados completos y finales de la configuración:

sudo firewall-cmd --zone=work --list-all
work (active)
  target: default
  interfaces:  enp0s1
  sources:
  services: dhcpv6-client ssh http nfs
  ports: 5353/udp 3689/tcp
...

Definición de una regla por defecto para controlar el tráfico entrante

La configuración target establece el comportamiento predeterminado del firewall al gestionar el tráfico entrante. Esta configuración de zona se configura automáticamente en default para todas las zonas predefinidas. Para cambiar el comportamiento predeterminado de una zona, utilice el siguiente comando:

sudo firewall-cmd --zone=zone-name --set-target=ACCEPT|REJECT|DROP

Puede especificar las siguientes opciones:

  • ACCEPT asigna todo el tráfico entrante, excepto aquellos que ha definido para que se rechacen en otra regla.

  • REJECT bloquea todo el tráfico entrante, excepto los que ha permitido en otra regla. La máquina de origen está informada sobre la rejeción.

  • DROP es similar a REJECT, pero no se envía ningún aviso de rechazo a la máquina de origen.

Gestión del tráfico entrante según los orígenes

Puede gestionar el tráfico entrante a una zona según el origen de tráfico. Los dos siguientes valores de zona permiten especificar el origen de los paquetes:

  • source identifica el nodo o la red de envío.

  • source-ports identifica el puerto desde el que se origina el tráfico.

Para aceptar tráfico entrante de un nodo de envío, utilice el siguiente comando:

sudo firewall-cmd --zone=zone-name --add-source=IP-address                  

Tenga en cuenta que la dirección IP puede incluir la máscara de red en la notación CIDR, como 192.0.2.0/24.

Ejecute el siguiente comando para transformar el conjunto de reglas de tiempo de ejecución actual en un conjunto de reglas permanente:

sudo firewall-cmd --runtime-to-permanent

Omita este comando si está definiendo una configuración temporal que se borra si el sistema se reinicia.

La siguiente sintaxis similar se utiliza para definir el valor source-port:

sudo firewall-cmd --zone=<zone-name> --add-source-port=<portid>/<protocol>
En el anterior, <zone-name> es el nombre de zona, <portid> es el número de puerto y <protocol> es uno de los siguientes tipos de protocolo:
  • tcp
  • udp
  • sctp
  • dccp

Puede combinar diferentes valores para configurar el firewall. La zona trusted se puede configurar para aceptar tráfico HTTP del origen de red 192.0.2.0, como se muestra en el siguiente ejemplo:

sudo firewall-cmd --zone=trusted --add-source=192.0.2.0/24
sudo firewall-cmd --zone=trusted --add-service=http
sudo firewall-cmd --zone=trusted --list-all
trusted (active)
  target: ACCEPT
  sources: 192.0.2.0/24
  services: http

Creación de zonas personalizadas

Puede crear zonas y, a continuación, configurar los valores de la zona para una protección de firewall personalizada.

Uso del comando firewall-cmd

Como se muestra en el siguiente ejemplo, puede usar la CLI firewall-cmd para crear una zona vacía, lo que significa que no hay servicios predeterminados asignados. Al configurar una zona personalizada, siempre debe incluir la opción --permanent en el comando. De lo contrario, se genera un mensaje que indica error.

sudo firewall-cmd --permanent --new-zone=testzone
sudo firewall-cmd --permanent --get-zones

Realice lo siguiente:

  • Para Oracle Linux 8, la salida es:

    block dmz drop external home internal testzone public trusted work
  • Para Oracle Linux 9 y Oracle Linux 10, la salida es:

    block dmz drop external home internal nm-shared public testzone trusted work
sudo firewall-cmd --permanent --info-zone=testzone
testzone
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Sin la opción --permanent, la opción --get-zones no muestra la zona creada.

La opción --info-zone=zone-name genera la misma salida que la opción --list-all.

Para que la creación de esta zona sea persistente, agregue el siguiente comando:

sudo firewall-cmd --runtime-to-permanent

Después de crear la zona, puede agregar servicios, puertos, asignar interfaces, etc., mediante las opciones de comandos que se proporcionan en los ejemplos anteriores:

sudo firewall-cmd --zone=testzone --add-service=http
Error: INVALID ZONE: testzone
sudo firewall-cmd --permanent --zone=testzone --add-service=http

Asegúrese de utilizar la opción --permanent al utilizar estos comandos.

Uso de un archivo de configuración de zona

Todas las zonas tienen los archivos de configuración correspondientes. Para las zonas predefinidas que se instalan con el sistema operativo, los archivos de configuración están en el directorio /usr/lib/firewalld/zones.

Al configurar una zona predefinida, el archivo de configuración se copia en el directorio /etc/firewalld/zones y los cambios se almacenan en esa ubicación. Si utiliza un archivo de configuración para crear nuevas zonas, también debe utilizar /etc/firewalld/zones como directorio de trabajo.

Si está creando una zona con diferencias menores con respecto a la configuración de las zonas predefinidas, copiar un archivo de configuración existente en el directorio de trabajo es el enfoque más sencillo. Puede utilizar cualquiera de los siguientes comandos:

sudo cp /etc/firewalld/zones/existing-conf-file.xml new-zone.xml
sudo cp /usr/lib/firewalld/zones/existing-conf-file.xml /etc/firewalld/zones/new-zone.xml

A continuación, con un editor de texto, revise los valores en el nuevo archivo de configuración. El siguiente ejemplo muestra lo que puede contener el archivo de configuración de testzone. testzone acepta tráfico para un servicio (SSH) y un rango de puertos para los protocolos TCP y UDP:

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>testzone</short>
  <description>Put description here</description>
    <service name="ssh"/>
    <port port="1025-65535" protocol="tcp"/>
    <port port="1025-65535" protocol="udp"/>
</zone>