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-2022 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.
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
.
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
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.
De modo predeterminado Firewalld tiene diferentes tipos de zonas. Cada una tiene un distinto nivel de seguridad.
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
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
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
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:
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 internal:
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:
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:
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:
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.
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:
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
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