Configuración de Firewalld

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: https://www.alcancelibre.org/

Licencia de este documento: Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2024 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Introducción.

La instalación mínima de AlmaLinux 8 y Red Hat™ Enterprise Linux 8 carece de muro cortafuegos. Es importante configurar uno.

Firewalld es un servicio dinámico de muro cortafuegos que provee una administración dinámica con soporte para zonas y asignación de niveles de confianza a éstas últimas. Tiene soporte para IPv4 e IPv6 así como también dispositivos puente tipo Ethernet.

Es el muro cortafuegos predeterminado de CentOS 8 y Red Hat Enterprise Linux 8. Resulta una solución práctica y rápida para poner en marcha un muro cortafuegos y cumple con lo requerido para la mayoría de los fines. Si lo que se busca es una solución más robusta y extensible, probablemente prefiera utilizar Shorewall. Las únicas ventajas que tiene Firewalld sobre Shorewall son las herramientas de configuración y la comunicación con otras aplicaciones —como NetworkManager— a través de D-BUS.

Utiliza iptables y ebtables para comunicarse con Netfilter y dispone de una herramienta de configuración de fácil uso para la terminal denominada firewall-cmd.

URL: https://github.com/t-woerner/firewalld/

Una vez instalado, puede ejecutar lo siguiente para consultar la ayuda rápida de firewall-cmd:

firewall-cmd --help

Una vez instalado, puede ejecutar lo siguiente para consultar el manual detallado de firewall-cmd:

man 1 firewall-cmd

Pulse «q» para salir de la página de manual.

Si se instaló el escritorio gráfico, existe también una herramienta gráfica para la configuración de Firewalld denominada firewall-config.

Equipamiento lógico necesario.

Firewalld sólo viene instalado de modo predeterminado si realizó la instalación utilizando el DVD. Si realizó la instalación mínima, por favor ejecute lo siguiente:

yum -y install firewalld

Si instaló el escritorio gráfico, ejecute lo siguiente si quiere utilizar la herramienta gráfica de configuración:

yum -y install firewall-config

Habilitar e iniciar el servicio.

Una vez instalado, habilite el servicio ejecutando lo siguiente:

systemctl enable firewalld

Inicie el servicio por primera vez ejecutando lo siguiente:

systemctl start firewalld

Ejecute lo siguiente si requiere reiniciar el servicio

systemctl restart firewalld

O bien ejecute lo siguiente si sólo requiere volver a leer la configuración:

firewall-cmd --reload

Procedimientos.

Zonas de Firewalld.

De modo predeterminado Firewalld tiene diferentes tipos de zonas. Cada una tiene un distinto nivel de seguridad.

drop
Descripción: Para redes públicas. Se descartan los paquetes de red entrantes no solicitados. Los paquetes entrantes que están relacionados con las conexiones de red salientes son aceptados. Se permite el tráfico de salida. Ésta sería la zona más segura. Ideal para paranoicos.
Servicios habilitados: ninguno.
Política predeterminada: DROP.
block
Descripción: Para redes públicas. Se rechazan los paquetes de red entrantes no solicitados. Los paquetes entrantes que están relacionados con las conexiones de red salientes son aceptados. Se permite el tráfico de salida.
Servicios habilitados: ninguno.
Política predeterminada: REJECT.
public
Descripción: Es la zona predeterminada. Para redes públicas. Sólo se aceptan algunas conexiones entrantes selectas y el resto son rechazadas. Es ideal para áreas públicas.
Servicios habilitados: ssh y dhcpv6-client.
Política predeterminada: REJECT.
external
Descripción: Para redes externas.Sólo se aceptan algunas conexiones entrantes selectas y el resto son rechazadas. Es ideal para redes externas con enmascaramiento habilitado especialmente para ruteadores.
Servicios habilitados: ssh.
Política predeterminada: REJECT.
dmz
Descripción: Para en sistemas zona desmilitarizada con acceso limitado a la red interna. Sólo se aceptan algunas conexiones entrantes selectas y el resto son rechazadas.
Servicios habilitados: ssh.
Política predeterminada: REJECT.
work
Descripción: Para trabajo u oficina. Se confía en los sistemas que coexisten en la misma red pero sólo se aceptan algunas conexiones entrantes selectas y el resto son rechazadas.
Servicios habilitados: ssh, ipp-client y dhcpv6-client.
Política predeterminada: REJECT.
home
Descripción: Para el hogar. Se confía en los sistemas que coexisten en la misma red pero sólo se aceptan algunas conexiones entrantes selectas y el resto son rechazadas. Básicamente igual que work.
Servicios habilitados: ssh, ipp-client, mdns, samba-client y dhcpv6-client.
Política predeterminada: REJECT.
internal
Descripción: Para redes internas. Se confía en los sistemas que coexisten en la misma red pero sólo se aceptan algunas conexiones entrantes selectas y el resto son rechazadas.
Servicios habilitados: ssh, ipp-client, mdns, samba-client y dhcpv6-client.
Política predeterminada: REJECT.
trusted
Descripción: Todas las conexiones son aceptadas.
Servicios habilitados: todos.
Política predeterminada: ACCEPT.

Consultar valores predeterminados.

Ejecute lo siguiente para ver la lista de zonas de firewalld:

firewall-cmd --get-zones

La salida seguramente será:

block dmz drop external home internal public trusted work

Ejecute lo siguiente para verificar cuál es la zona utilizada por firewalld:

firewall-cmd --get-default-zone

La salida seguramente será:

public

Ejecute lo siguiente para ver la lista de servicios habilitados en la zona actual:

firewall-cmd --list-services

La salida seguramente será:

dhcpv6-client ssh

Cambios temporales y cambios permanentes.

Firewalld permite aplicar cambios temporales y permanentes que facilitan el poder realizar pruebas y restaurar configuración en caso de ser necesario.

Los cambios realizados con firewall-cmd sin la opción —permanent aplicarán de inmediato sin guardarse en la configuración. Ésto es lo que lo convierte en un cortafuegos dinámico. Ejemplo:

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

Los cambios realizados con firewall-cmd con la opción —permanent se guardan de inmediato en la configuración pero sólo aplicarán hasta ejecutar firewall-cmd con la opción --reload. Ejemplo:

firewall-cmd --permanent --zone=public --add-port=10000/tcp

Cambiar la zona predeterminada.

Ejecute lo siguiente para cambiar la zona predeterminada a home:

firewall-cmd --set-default-zone=home

La salida seguramente será:

success

El cambio aplica automáticamente y se abren los puertos predeterminados de la zona.

Ejecute lo siguiente para ver la lista de servicios habilitados en la zona actual:

firewall-cmd --list-services

La salida seguramente será:

dhcpv6-client ipp-client mdns samba-client ssh

Vuelva a definir la zona public como la predeterminada:

firewall-cmd --set-default-zone=public

Asociar interfaces de red a zonas específicas.

Ejecute lo siguiente para asociar el primer dispositivo de red del sistema —enp0s3 si es una máquina virtual— a la zona public:

firewall-cmd --zone=public --add-interface=enp0s3

Ejecute lo siguiente para hacer permanente el cambio:

firewall-cmd --permanent --zone=public --add-interface=enp0s3

Ejecute lo siguiente para asociar el segundo dispositivo de red del sistema —enp0s8 si es una máquina virtual— a la zona internal:

firewall-cmd --zone=internal --add-interface=enp0s8

Ejecute lo siguiente para hacer permanente el cambio:

firewall-cmd --permanent --zone=internal --add-interface=enp0s8

Ejecute lo siguiente para asociar el tercer dispositivo de red del sistema —enp0s9 si es una máquina virtual— a la zona dmz:

firewall-cmd --zone=dmz --add-interface=enp0s9

Ejecute lo siguiente para hacer permanente el cambio:

firewall-cmd --permanent --zone=dmz --add-interface=enp0s9

Ejecute lo siguiente para determinar qué interfaces están asociadas a cada zona:

firewall-cmd --get-active-zone

La salida seguramente será la siguiente:

dmz
  interfaces: enp0s9
internal
  interfaces: enp0s8
public
  interfaces: enp0s3

Ejecute lo siguiente para listar todo lo que está configurado en la zona public:

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

La salida debe ser similar a la siguiente:

public (active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Ejecute lo siguiente para listar todo lo que está configurado en la zona internal:

firewall-cmd --zone=internal --list-all

La salida debe ser similar a la siguiente:

internal (active)
  interfaces: enp0s8
  sources:
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Ejecute lo siguiente para listar todo lo que está configurado en la zona dmz:

firewall-cmd --zone=dmz --list-all

La salida debe ser similar a la siguiente:

dmz (active)
  interfaces: enp0s9
  sources:
  services: ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Configuración de NAT.

Ejecute lo siguiente para habilitar el enmascaramiento de IP (NAT) y permitir a los anfitriones detrás de la zona public para salir hacia Internet.

firewall-cmd --zone=public --add-masquerade --permanent

Para aplicar el cambio es necesario volver a cargar la configuración:

firewall-cmd --reload

Lo anterior automáticamente activa en el núcleo de Linux la función de reenvío de paquetes para IPv4. Ejecute lo siguiente para validar ésto:

sysctl net.ipv4.ip_forward

La salida debe ser igual a la siguiente.

net.ipv4.ip_forward = 1

Ejecute lo siguiente para listar todo lo que está configurado en la zona public:

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

La salida debe ser similar a la siguiente:

internal (active)
  interfaces: enp0s8
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: yes
  forward-ports:
  icmp-blocks:
  rich rules:

Configuración de DNAT.

Para hacer DNAT de un puerto en el exterior hacia el puerto de un anfitrión en la red local primero hay que activar el enmascaramiento de la zona pública. Ejecute lo siguiente:

firewall-cmd --permanent --zone=public --add-masquerade

Para aplicar el cambio es necesario volver a cargar la configuración:

firewall-cmd --reload

Hecho lo anterior, puede utilizar la siguiente sintaxis para redireccionar puertos desde el exterior hacia la red de área local:

firewall-cmd --zone=[zona] --add-forward-port=port=[puerto]:proto=[protocolo]:toport=[puerto]:toaddr=[dirección IP]

En el siguiente ejemplo se hace DNAT del puerto 22023 del cortafuegos hacia el puerto 22 de un anfitrión en la red local con dirección IP 172.16.1.2:

firewall-cmd --permanent --zone=public --add-forward-port=port=22023:proto=tcp:toport=22:toaddr=172.16.1.2

Para aplicar el cambio es necesario volver a cargar la configuración:

firewall-cmd --reload

En el siguiente ejemplo se hace DNAT del puerto 3389 del cortafuegos hacia el puerto 3389 de un anfitrión en la red local con dirección IP 172.16.1.3:

firewall-cmd --permanent --zone=public --add-forward-port=port=3389:proto=tcp:toport=3389:toaddr=172.16.1.2

Para aplicar el cambio es necesario volver a cargar la configuración:

firewall-cmd --reload

Ejecute lo siguiente para listar todo lo que está configurado en la zona public:

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

La salida debe ser similar a la siguiente:

public (active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: yes
  forward-ports: port=3389:proto=tcp:toport=3389:toaddr=172.16.1.3
    port=22023:proto=tcp:toport=22:toaddr=172.16.1.2
  icmp-blocks:
  rich rules:

Apertura de puertos y servicios.

Ejecute lo siguiente para ver la lista de servicios disponibles en firewalld:

firewall-cmd --get-services

La salida debe ser similar a la siguiente.

RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client
dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http
https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps
libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy
pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba
samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-
server wbem-https

Para abrir un servicio del muro cortafuegos hacia una zona utilice la siguiente sintaxis:

firewall-cmd [--permanent] --zone=[zona} --add-service=[servicio]

En el siguiente ejemplo se abre el servicio http (puerto 80/tcp) del servidor hacia el tráfico proveniente de la zona public:

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

Ejecute lo siguiente para hacer permanente el cambio:

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

En el siguiente ejemplo se abre el servicio http (puerto 80/tcp) del servidor hacia el tráfico proveniente de la zona internal:

firewall-cmd --zone=internal --add-service=http

Ejecute lo siguiente para hacer permanente el cambio:

firewall-cmd --permanent --zone=internal --add-service=http

Si algún servicio está ausente de la lista de servicios de firewalld, puede abrir puertos específicos utilizando la siguiente sintaxis:

firewall-cmd --zone=[zona] --add-port=[puerto]/[protocolo]

En el siguiente ejemplo se abre el puerto 10000/tcp del servidor para el tráfico proveniente de la zona public:

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

Ejecute lo siguiente para hacer permanente el cambio:

firewall-cmd --permanent --zone=public --add-port=10000/tcp

En el siguiente ejemplo se abre el rango de puertos entre el 30300/tcp y el 30310/tcp del servidor para el tráfico proveniente de la zona public:

firewall-cmd --zone=public --add-port=30300-30310/tcp

Ejecute lo siguiente para hacer permanente el cambio:

firewall-cmd --permanent --zone=public --add-port=30300-30310/tcp

Ejecute lo siguiente para listar todo lo que está configurado en la zona public:

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

La salida debe ser similar a la siguiente:

public (active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http ssh
  ports: 30300-30310/tcp 10000/tcp
  masquerade: yes
  forward-ports: port=3389:proto=tcp:toport=3389:toaddr=172.16.1.3
    port=22023:proto=tcp:toport=22:toaddr=172.16.1.2
  icmp-blocks:
  rich rules:

Bloquear el tráfico ICMP.

El protocolo ICMP (Internet Control Message Protocol) es utilizado para solicitar la información de destination-unreachable, echo-reply, echo-request, parameter-problem, redirect, router-advertisement, router-solicitation, source-quench y time-exceeded. Entre otras cosas, este protocolo es responsable de las respuestas de echo hechas con ping. De modo predeterminado Firewalld permite el tráfico ICMP. Hay escenarios donde puede ser conveniente bloquear el tráfico ICMP para impedir ataques DDoS a través de este protocolo.

Ejecute lo siguiente para ver la lista de tipos ICMP que puede gestionar Firewalld:

firewall-cmd --get-icmptypes

La salida debe ser la siguiente:

destination-unreachable echo-reply echo-request parameter-problem redirect
router-advertisement router-solicitation source-quench time-exceeded

Ejecute lo siguiente para consultar si esa bloqueada la respuesta de echo en la zona public:

firewall-cmd --zone=public --query-icmp-block=echo-reply

La respuesta seguramente será que no:

no

Ejecute lo siguiente para activar el bloque de la respuesta de echo en la zona public.

firewall-cmd --zone=public --add-icmp-block=echo-reply

Vuelva a consultar si esa bloqueada la respuesta de echo en la zona public:

firewall-cmd --zone=public --query-icmp-block=echo-reply

La respuesta seguramente será que Sí:

yes

Para hacer permanente el cambio ejecute lo siguiente:

firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply

A partir de este momento quedará bloqueada la respuesta de los pings hechas hacia el muro cortafuegos desde la zona pública.

Cambiar la zona asociada a una interfaz.

El siguiente ejemplo considera que se cambiará la asociación de la interfaz enp0s3 de la zona public hacia la zona drop. Ésta última es mucho más segura. La zona public tiene como política predeterminada rechazar paquetes —REJECT—, es decir rechaza conexiones pero confirma que el anfitrión existe. La zona drop tiene como política externa tiene como política predeterminada descartar paquetes —DROP—, es decir hace parecer que ni siquiera existe el anfitrión.

De modo predeterminado la zona public tiene habilitados los servicios ssh y dhcpv6-client. La zona drop carece de servicios habilitados. Por tanto lo primero que habrá que hacer es determinar si se requerirá acceso por SSH y soporte para DHCP.

El procedimiento realizará los cambios permanentes sin aplicarlos de inmediato. Los cambios será aplicados hasta el final.

Primero defina de modo permanente los servicios y puertos que serán abiertos en la zona drop:

firewall-cmd --permanent --zone=drop --add-icmp-block=echo-reply
firewall-cmd --permanent --zone=drop --add-port=10000/tcp
firewall-cmd --permanent --zone=drop --add-port=30300-30310/tcp
firewall-cmd --permanent --zone=drop --add-service=dhcpv6-client
firewall-cmd --permanent --zone=drop --add-service=http
firewall-cmd --permanent --zone=drop --add-service=ssh

¿Va a requerir enmascaramiento de IP? ¿Va a redirigir puertos desde redes públicas hacia redes privadas? Ejecute lo siguiente:

firewall-cmd --permanent --zone=drop --add-masquerade

¿Qué puertos va a redirigir y hacia qué anfitriones en la red privada? Ejecute lo siguiente:

firewall-cmd --permanent --zone=drop --add-forward-port=port=22023:proto=tcp:toport=22:toaddr=172.16.1.2

firewall-cmd --permanent --zone=drop --add-forward-port=port=3389:proto=tcp:toport=3389:toaddr=172.16.1.2

Elimine la tarjeta de la zona actual de modo permanente:

firewall-cmd --permanent --zone=external --remove-interface=enp0s3

Elija una zona adecuada a sus necesidades para la interfaz de red.

Ejecute lo siguiente para asociar la interfaz de red a la zona seleccionada de modo permanente:

firewall-cmd --permanent --zone=drop --add-interface=enp0s3

Hasta aquí sólo se han realizado cambios en la configuración sin aplicarlos. Para aplicar los cambios es necesario volver a cargar la configuración ejecutando lo siguiente:

firewall-cmd --reload

Valide el cambio de interfaz ejecutando lo siguiente:

firewall-cmd --get-active-zone

La salida seguramente será la siguiente:

drop
  interfaces: enp0s9
internal
  interfaces: enp0s8
public
  interfaces: enp0s3

Valide los puertos, servicios y enmascaramiento habilitados en la zona drop ejecutando lo siguiente.

firewall-cmd --zone=drop --list-all

La salida debe ser similar a la siguiente:

drop (active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http ssh
  ports: 30300-30310/tcp 10000/tcp
  masquerade: yes
  forward-ports: port=3389:proto=tcp:toport=3389:toaddr=172.16.1.3
    port=22023:proto=tcp:toport=22:toaddr=172.16.1.2
  icmp-blocks:
  rich rules:

Cambiar la política predeterminada de una zona.

La zona public proporciona una seguridad muy buena. Sin embargo, si se desea un muro cortafuegos más estricto, probablemente prefiera cambiar la política predeterminada de REJECT a DROP. Este procedimiento es una alternativa al cambio de zona de una interfaz, descrito anteriormente.

Consulte cual es la nueva política predeterminada:

firewall-cmd --permanent --zone=public --get-target

La salida debe ser la siguiente.

default

Ejecute lo siguiente para cambiar la política a drop:

firewall-cmd --permanent --zone=public --set-target=DROP

Para aplicar el cambio es necesario volver a cargar la configuración:

firewall-cmd --reload

Consulte cual es la nueva política predeterminada:

firewall-cmd --permanent --zone=public --get-target

La salida debe ser la siguiente.

DROP

Cerrar todas las conexiones.

Puede haber escenarios en los cuales surja una emergencia que requiera cerrar todas las conexiones. Ejecute lo siguiente para activar el modo pánico:

firewall-cmd --panic-on

Puede ejecutar lo siguiente para desactivar el modo pánico y restablecer todas las conexiones:

firewall-cmd --panic-off

Ejecute lo siguiente para verificar si está activo o desactivado el modo pánico:

firewall-cmd --query-panic