Cómo instalar, configurar y usar Firewalld en CentOS y Ubuntu


Firewalld (demonio de firewall) es una alternativa al servicio iptables, para administrar dinámicamente el firewall de un sistema con soporte para zonas de red (o firewall) y proporciona una interfaz D-Bus para administrar configuraciones. Es fácil de usar y configurar, y ahora es la herramienta de administración de firewall predeterminada en RHEL/CentOS, Fedora y varias otras distribuciones de Linux.

En este artículo, discutiremos cómo configurar el firewall del sistema con firewalld e implementar el filtrado de paquetes básico en CentOS/RHEL 7 y Ubuntu.

Los conceptos básicos sobre Firewalld

Firewalld consta de tres capas, que son:

  • capa central: responsable de manejar la configuración y los backends (enumerados a continuación).
  • Interfaz D-Bus: el medio principal para cambiar y crear la configuración del firewall.
  • backends: para interactuar con netfilter (el módulo nativo del kernel utilizado para el firewall). Incluyen iptables, ip6tables, ebtables, ipset, nft, linnftables; gerente de Redes; y módulos.

Gestiona las reglas del cortafuegos mediante la implementación de zonas de red/cortafuegos que definen el nivel de confianza de las conexiones o interfaces de red. Otras características de firewall compatibles incluyen servicios, configuración directa (utilizada para pasar directamente la sintaxis de iptables sin procesar), IPSets y tipos de ICMP.

Firewalld admite dos tipos de entornos de configuración:

  • configuración de tiempo de ejecución que solo es efectiva hasta que se reinicia la máquina o se reinicia el servicio firewalld
  • configuración permanente que se guarda y funciona de forma persistente.

La herramienta de línea de comandos firewall-cmd se utiliza para administrar el tiempo de ejecución y la configuración permanente. Alternativamente, puede usar la herramienta de configuración de la interfaz gráfica de usuario (GUI) firewall-config para interactuar con el demonio.

Además, firewalld ofrece una interfaz bien definida para que otros servicios o aplicaciones locales soliciten cambios en las reglas del firewall directamente, si se ejecutan con privilegios de root.

El archivo de configuración global para firewalld se encuentra en /etc/firewalld/firewalld.conf y las características del firewall están configuradas en formato XML.

Comprensión de las funciones importantes de Firewalld

La característica central de firewalld son las zonas de red/firewall. Todas las demás características están limitadas a una zona. Una zona de firewall describe el nivel de confianza para una conexión, interfaz o enlace de dirección de origen.

La configuración predeterminada viene con una cantidad de zonas predefinidas ordenadas de acuerdo con el nivel de confianza predeterminado de las zonas de no confiables a confiables: descartar, bloquear, públicas, externas, dmz, trabajo, hogar, internas y confiables. Se definen en archivos almacenados en el directorio/usr/lib/firewalld/zones.

Puede configurar o agregar sus zonas personalizadas usando el cliente CLI o simplemente crear o copiar un archivo de zona en/etc/firewalld/zones desde archivos existentes y editarlo.

Otro concepto importante bajo firewalld son los servicios. Un servicio se define mediante puertos y protocolos; estas definiciones representan un servicio de red dado, como un servidor web o un servicio de acceso remoto. Los servicios se definen en archivos almacenados en el directorio/usr/lib/firewalld/services/o/etc/firewalld/services /.

Si conoce los conceptos básicos de iptables/ip6tables/ebtables, también puede usar la interfaz directa (o configuración) para obtener acceso directo al firewall. Pero, para aquellos sin ningún conocimiento de iptables, puede emplear el lenguaje enriquecido para crear reglas de firewall más complejas para IPv4 e IPv6.

Cómo instalar el paquete Firewalld en Linux

En CentOS 7, el paquete firewalld viene preinstalado y puede verificarlo usando el siguiente comando.

$ rpm -qa firewalld

En Ubuntu 16.04 y 18.04, puede instalarlo usando el administrador de paquetes predeterminado como se muestra.

$ sudo apt install firewalld

Cómo administrar el servicio Firewalld en Linux

Firewalld es un servicio systemd regular que se puede administrar a través del comando systemctl.

 
$ sudo systemctl start firewalld	#start the service for the mean time
$ sudo systemctl enable firewalld	#enable the service to auto-start at boot time
$ sudo systemctl status firewalld	#view service status

Después de iniciar el servicio firewalld, también puede verificar si el demonio se está ejecutando o no, utilizando la herramienta firewall-cmd (en caso de que no esté activo, este comando dará como resultado "no se está ejecutando").

$ sudo firewall-cmd --state

Si guarda algún cambio de forma permanente, puede volver a cargar firewalld. Esto recargará las reglas del firewall y mantendrá la información del estado. La configuración permanente actual se convertirá en una nueva configuración de tiempo de ejecución.

$ sudo firewall-cmd --reload

Cómo trabajar con zonas de firewall en Firewalld

Para obtener una lista de todas las zonas y servicios de firewall disponibles, ejecute estos comandos.

$ sudo firewall-cmd --get-zones
$ sudo firewall-cmd --get-services

La zona predeterminada es la zona que se utiliza para cada función de firewall que no está delimitada explícitamente a otra zona. Puede obtener la zona predeterminada configurada para las conexiones de red y las interfaces ejecutando.

$ sudo firewall-cmd --get-default-zone

Para establecer la zona predeterminada, por ejemplo, externa, use el siguiente comando. Tenga en cuenta que agregar la opción --permanent establece la configuración de forma permanente (o habilita la consulta de información desde el entorno de configuración permanente).

$ sudo firewall-cmd --set-default-zone=external
OR
$ sudo firewall-cmd --set-default-zone=external --permanent
$ sudo firewall-cmd --reload 

A continuación, veamos cómo agregar una interfaz a una zona. Este ejemplo muestra cómo agregar su adaptador de red inalámbrica (wlp1s0) a la zona de inicio, que se usa en áreas de hogar.

$ sudo firewall-cmd --zone=home --add-interface=wlp1s0

Una interfaz solo se puede agregar a una única zona. Para moverlo a otra zona, use el conmutador --change-interface como se muestra, o elimínelo de la zona anterior usando el conmutador –remove-interface, luego agréguelo a la nueva zona.

Suponiendo que desea conectarse a una red WI-FI pública, debe volver a mover su interfaz inalámbrica a la zona pública, así:

$ sudo firewall-cmd --zone=public --add-interface=wlp1s0
$ sudo firewall-cmd --zone=public --change-interface=wlp1s0

Puede utilizar muchas zonas al mismo tiempo. Para obtener una lista de todas las zonas activas con las características habilitadas como interfaces, servicios, puertos, protocolos, ejecute:

$ sudo firewall-cmd --get-active-zones

En relación al punto anterior, si quieres encontrar más información sobre una zona en particular, es decir, todo lo agregado o habilitado en ella, usa uno de estos comandos:

$ sudo firewall-cmd --zone=home --list-all
OR
$ sudo firewall-cmd --info-zone public

Otra opción útil es --get-target , que le muestra el objetivo de una zona permanente. Un objetivo es uno de los siguientes: predeterminado, ACEPTAR, SOLTAR, RECHAZAR. Puede verificar el objetivo de varias zonas:

$ sudo firewall-cmd --permanent --zone=public --get-target  
$ sudo firewall-cmd --permanent --zone=block --get-target  
$ sudo firewall-cmd --permanent --zone=dmz --get-target  
$ sudo firewall-cmd --permanent --zone=external --get-target
$ sudo firewall-cmd --permanent --zone=drop --get-target

Cómo abrir y bloquear puertos en Firewalld

Para abrir un puerto (o una combinación de puerto/protocolo) en el firewall, simplemente agréguelo en una zona con la opción --add-port . Si no especifica explícitamente la zona, se habilitará en la zona predeterminada.

El siguiente ejemplo muestra cómo agregar los puertos 80 y 443 para permitir el tráfico web entrante a través de los protocolos HTTP y HTTPS, respectivamente:

$ sudo firewall-cmd --zone=public --permanent --add-port=80/tcp --add-port=443/tcp

A continuación, vuelva a cargar firewalld y verifique las funciones habilitadas en la zona pública una vez más, debería poder ver los puertos recién agregados.

$ sudo firewall-cmd --reload
$ sudo firewall-cmd --info-zone public

Bloquear o cerrar un puerto en el firewall es igualmente fácil, simplemente elimínelo de una zona con la opción --remove-port . Por ejemplo, para cerrar los puertos 80 y 443 en la zona pública.

$ sudo firewall-cmd --zone=public --permanent --remove-port=80/tcp --remove-port=443/tcp

En lugar de utilizar un puerto o una combinación de puerto/protocolo, puede utilizar el nombre del servicio al que se asigna un puerto como se explica en la siguiente sección.

Cómo abrir y bloquear servicios en Firewalld

Para abrir un servicio en el firewall, habilítelo usando la opción --add-service . Si se omite la zona, se utilizará la zona predeterminada.

El siguiente comando habilitará permanentemente el servicio http en la zona pública.

$ sudo firewall-cmd --zone=public --permanent --add-service=http 
$ sudo firewall-cmd --reload 

La opción --remove-service puede usarse para deshabilitar un servicio.

$ sudo firewall-cmd --zone=public --permanent --remove-service=http 
$ sudo firewall-cmd --reload 

Cómo habilitar y deshabilitar el enmascaramiento de IP usando Firewalld

El enmascaramiento de IP (también conocido como IPMASQ o MASQ) es un mecanismo NAT (traducción de direcciones de red) en redes Linux que permite a sus hosts en una red, con direcciones IP privadas comunicarse con Internet utilizando la IP pública asignada de su servidor Linux (puerta de enlace IPMASQ) habla a.

Es un mapeo de uno a muchos. El tráfico de sus hosts invisibles aparecerá en otras computadoras en Internet como si proviniera de su servidor Linux.

Puede habilitar el enmascaramiento de IP en una zona deseada, por ejemplo, la zona pública. Pero antes de hacer eso, primero verifique si el enmascaramiento está activo o no (un "no" significa que está deshabilitado y un "sí" significa lo contrario).

$ sudo firewall-cmd --zone=public --query-masquerade
$ sudo firewall-cmd --zone=public --add-masquerade

Un caso de uso típico para el enmascaramiento es realizar el reenvío de puertos. Suponiendo que desea SSH desde una máquina remota a un host en su red interna con la IP 10.20.1.3, en la que el demonio sshd está escuchando en el puerto 5000.

Puede reenviar todas las conexiones al puerto 22 en su servidor Linux al puerto deseado en su host de destino emitiendo:

$ sudo firewall-cmd --zone=public --add-forward-port=port=22=proto=tcp:toport=5000:toaddr=10.20.1.3

Para deshabilitar el enmascaramiento en una zona, use el interruptor --remove-masquerade .

$ sudo firewall-cmd --zone=public --remove-masquerade

Cómo habilitar y deshabilitar el mensaje IMCP en Firewalld

Los mensajes ICMP (Protocolo de mensajes de control de Internet) son solicitudes de información o respuestas a solicitudes de información o en condiciones de error.

Puede habilitar o deshabilitar los mensajes ICMP en el firewall, pero antes de eso, primero enumere todos los tipos de icmp admitidos.

$ sudo firewall-cmd --get-icmptypes

Para agregar o eliminar un tipo de bloque que desee.

$ sudo firewall-cmd --zone=home --add-icmp-block=echo-reply
OR
$ sudo firewall-cmd --zone=home --remove-icmp-block=echo-reply

Puede ver todos los tipos de icmp agregados en una zona usando el interruptor --list-icmp-blocks .

$ sudo firewall-cmd --zone=home --list-icmp-blocks

Cómo utilizar la interfaz directa para pasar comandos de iptables sin procesar

El firewall-cmd también proporciona opciones directas ( --direct ) para que usted obtenga un acceso más directo al firewall. Esto es útil para aquellos con conocimientos básicos de iptables.

Importante: solo debe usar las opciones directas como último recurso cuando no sea posible usar las opciones de cmd de firewall habituales explicadas anteriormente.

Aquí hay un ejemplo de cómo pasar la regla de iptables sin procesar, usando el modificador --add-rules . Puede eliminar fácilmente estas reglas reemplazando --add-rule por --remove-rule :

$ sudo firewall-cmd --direct --add-rule ipv4 filter IN_public_allow 0 -m tcp -p tcp --dport 80 -j ACCEPT

Para obtener más información sobre iptables, consulte esta guía: Cómo configurar un firewall de Iptables para habilitar el acceso remoto a los servicios en Linux.

Si no está familiarizado con la sintaxis de iptables, puede optar por el "lenguaje enriquecido" de firewalld para crear reglas de firewall más complejas de una manera fácil de entender, como se explica a continuación.

Cómo utilizar lenguaje enriquecido en Firewalld

El lenguaje enriquecido (también conocido como reglas enriquecidas) se utiliza para agregar reglas de firewall más complejas para IPv4 e IPv6 sin el conocimiento de la sintaxis de iptables.

Extiende las características de la zona (servicio, puerto, icmp-block, masquerade y forward-port) que hemos cubierto. Admite direcciones de origen y destino, registros, acciones y límites para registros y acciones.

El --add-rich-rule se usa para agregar reglas enriquecidas. Este ejemplo muestra cómo permitir nuevas conexiones IPv4 e IPv6 para el servicio http y el registro 1 por minuto mediante auditoría:

$ sudo firewall-cmd --add-rich-rule='rule service name="http" audit limit value="1/m" accept'

Para eliminar la regla agregada, reemplace la opción --add-rich-rule por --remove-rich-rule .

$ sudo firewall-cmd --remove-rich-rule='rule service name="http" audit limit value="1/m" accept'

Esta función también permite bloquear o permitir el tráfico desde una dirección IP específica. El siguiente ejemplo muestra cómo rechazar conexiones desde la IP 10.20.1.20.

$ sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.254" reject'

Cómo habilitar y deshabilitar el modo de pánico en Firewalld

El modo de pánico es un modo especial en firewalld donde todos los paquetes entrantes y salientes se eliminan, y las conexiones activas expirarán una vez activadas.
Puede habilitar este modo en situaciones de emergencia donde existe una amenaza para su entorno de red.

Para consultar el modo de pánico, use la opción --query-panic .

$ sudo firewall-cmd --query-panic

Para habilitar el modo de pánico, use la opción --panic-on . Puede probar si está funcionando usando el comando ping como se muestra. Debido a que el paquete se descartó, el nombre www.google.com no se puede resolver, de ahí el error que se muestra.

$ sudo firewall-cmd --panic-on
$ ping -c 2 www.google.com

Para deshabilitar el modo de pánico, use la opción --panic-off .

$ sudo firewall-cmd --panic-off

Cómo bloquear Firewalld

Recuerde, mencionamos en los conceptos básicos sobre firewalld que las aplicaciones o servicios locales pueden alterar la configuración del firewall si se ejecutan con privilegios de root. Puede controlar qué aplicaciones pueden solicitar cambios en el firewall, especificando luego en una lista blanca de bloqueo.

Esta función está desactivada de forma predeterminada, puede activarla o desactivarla con el interruptor --lockdown-on o --lockdown de forma receptiva.

$ sudo firewall-cmd --lockdown-on
OR
$ sudo firewall-cmd --lockdown-off

Tenga en cuenta que se recomienda habilitar o deshabilitar esta función editando el archivo de configuración principal, porque es posible que firewall-cmd no exista en la lista blanca de bloqueo cuando habilita el bloqueo.

$ sudo vim /etc/firewalld/firewalld.conf

Busque el parámetro Lockdown y cambie su valor de no (significa desactivado) a yes (significa activado).

Lockdown=yes

Para que esta configuración sea permanente, recargue firewalld.

$ sudo firewall-cmd --reload

Firewalld es un reemplazo fácil de usar para el servicio iptables, que usa iptables como backend. En este artículo, mostramos cómo instalar el paquete firewalld, explicamos las características importantes de firewalld y discutimos cómo configurarlas en el tiempo de ejecución y los entornos de configuración permanente.

Si tiene alguna pregunta o comentario, no dude en comunicarse con nosotros a través del formulario de comentarios a continuación. Puede consultar la página del manual de firewalld (man firewalld) o la documentación de firewalld en el sitio web del proyecto, para obtener más información.