Configuración de Firewalld con firewall-cmd – El cortafuegos de Linux

¿Qué es un Firewall y qué es Firewalld?

Firewalld es una herramienta de administración de firewalls (o cortafuegos) basada en la interfaz de línea de comandos (CLI) y en la interfaz gráfica de usuario (GUI). Se incluye como parte del paquete firewalld en muchas distribuciones Linux y está disponible para descargar e instalar en otras.

Firewalld ofrece una forma más fácil y potente de configurar el firewall que las herramientas anteriores, como iptables. En lugar de trabajar con reglas individuales, firewalld utiliza zonas para agrupar reglas de firewall. Esto hace que firewalld sea más fácil de usar, ya que permite a los administradores crear y administrar reglas de firewall en una sola zona en lugar de tener que configurarlas individualmente.

Firewalld también es compatible con Network Manager, lo que significa que puede ser usado para administrar firewalls en ambientes donde se cambian frecuentemente las conexiones de red, como laptops y servidores virtualizados.

Si no sabes lo que es un firewall, te diré que es un elemento de seguridad de comunicaciones que se encarga de permitir o denegar cierto tráfico de red entre:

  • una IP origen y una IP destino
  • un puerto origen y un puerto destino
  • y un protocolo de red

Por lo tanto, Firewalld proporciona un cortafuegos gestionado dinámicamente con soporte para zonas de red que define y controla el nivel de confianza de las conexiones o interfaces de red. Tiene soporte para configuraciones de firewall IPv4, IPv6, para ethernet bridges y vlans.

Por ejemplo, se puede abrir una regla de firewall para permitir el tráfico desde cualquier usuario de Internet hasta la IP y puerto que utiliza el servidor WEB.

Firewalld es el cortafuegos de Linux que se viene utilizando desde RedHat 7. Hasta RedHat 6 se estaba utilizando iptables.

Con el comando firewall-cmd podemos permitir o denegar el tráfico de red a nivel de puerto, protocolo de red o servicio del sistema en nuestro propio servidor para todas las redes o para una en concreto.

Instalación, arranque y parada de Firewalld

Para poder utilizar Firewalld debemos tener instalado el paquete RPM firewalld y el servicio arrancado. Si no lo tuviésemos instalado, lo haríamos con el comando dnf install -y firewalld (en Linux RedHat).

Una vez instalado, arrancaremos firewalld con systemctl start firewalld. Con systemctl enable firewalld arrancará el servicio automáticamente con el boot del sistema.

[root@server1 ~]# rpm -qa |grep -i firewalld
firewalld-filesystem-0.8.2-7.el8_4.noarch
firewalld-0.8.2-7.el8_4.noarch
[root@server1 ~]# 

[root@server1 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-08-07 11:37:34 CEST; 7min ago
     Docs: man:firewalld(1)
 Main PID: 1136 (firewalld)
    Tasks: 2 (limit: 14088)
   Memory: 7.0M
   CGroup: /system.slice/firewalld.service
           └─1136 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

Aug 07 11:37:32 server1 systemd[1]: Starting firewalld - dynamic firewall daemon...
Aug 07 11:37:34 server1 systemd[1]: Started firewalld - dynamic firewall daemon.
Aug 07 11:37:34 server1 firewalld[1136]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.
[root@server1 ~]# 

Si por alguna razón deseamos parar el firewall, pararemos el servicio:

systemctl stop firewalld

Comprobaremos el estado del firewall de la siguiente manera:

systemctl status firewalld
firewall-cmd --state

Zonas de Firewalld

Firewalld utiliza diferentes zonas de red para configurar diferentes reglas de firewalls en cada una de ellas. Las zonas de red de firewalld disponibles por defecto son las siguientes:

[root@server1 ~]# firewall-cmd --get-zones 
block dmz drop external home internal libvirt nm-shared public trusted work
[root@server1 ~]# 

El uso de cada una de estas zonas es el siguiente:

  • drop: Se corta el tráfico de cualquier conexión entrante. Sólo son posibles las conexiones hacia el destino.
  • block: Cualquier conexión de red entrante se rechaza con un mensaje icmp-host-prohibited para IPv4 e icmp6-adm-prohibited para IPv6. Solo son posibles las conexiones de red iniciadas dentro de este sistema.
  • public: Solamente se aceptan las conexiones entrantes configuradas.
  • external: Para uso en redes externas con el enmascaramiento habilitado, como los routers. Solamente se aceptan las conexiones entrantes configuradas.
  • dmz (o zona desmilitarizada): Se refiere a las conexiones que vienen desde Internet. Solamente se acepta el tráfico entrante configurado en el firewall. Por ejemplo, hacia el puerto del servidor WEB.
  • work: Se utiliza para la red del trabajo. Solamente se aceptan las conexiones entrantes configuradas.
  • home: Se utiliza para la red de casa. Solamente se aceptan las conexiones entrantes configuradas.
  • internal: Se utiliza para la configuración de las redes internas. Solamente se aceptan las conexiones entrantes configuradas.
  • trusted: Todas las conexiones son aceptadas.

Configurar la zona del firewall con la que queremos trabajar

Cada servidor va a utilizar una zona del firewall con la que va a trabajar en función de su rango de red. Para configurar la zona del firewall que nos interesa, utilizaremos firewall-cmd de la siguiente manera:

[root@server1 ~]# firewall-cmd --set-default-zone=public 
success
[root@server1 ~]# firewall-cmd --get-active-zones
libvirt
  interfaces: virbr0
public
  interfaces: ens33 ens37
[root@server1 ~]# 

El comando firewall-cmd es muy amplio y podemos consultar todas sus opciones en el man del comando. Se pueden hacer configuraciones específicas a nivel de tarjeta de red por ejemplo.

Sin embargo, esta guía es orientativa para saber cómo funciona el firewall de Linux.

Permitir o denegar el tráfico de servicios del sistema en Firewalld

En Firewalld podemos permitir el tráfico a nivel de servicio o especificando una IP, un puerto y el protocolo de comunicaciones. A continuación vamos a ver el primer método:

[root@server1 ~]# firewall-cmd --add-service=ssh --permanent 
Warning: ALREADY_ENABLED: ssh
success
[root@server1 ~]#

[root@server1 ~]# firewall-cmd --reload 
success

[root@server1 ~]#

[root@server1 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33 ens37
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[root@server1 ~]# 

Es muy importante incluir la directiva –permanent para que la regla se mantenga después de reiniciar el firewall. También podemos observar que una vez que hemos configuado la regla, tenemos que recargarlas para que se apliquen (–reload).

Si quisiéramos eliminar una regla de FW a nivel de servicio, lo haríamos de la siguiente manera:

[root@server1 ~]# firewall-cmd --remove-service=ssh --permanent 
success
[root@server1 ~]# firewall-cmd --reload 
success
[root@server1 ~]# 

Permitir o denegar servicios por IP, puerto y protocolo de red en Firewalld

Igual que antes hemos habilitado el tráfico a través de un servicio de Linux, también lo podemos hacer a través de su IP, puerto y protocolo de red. Lo haremos de la siguiente manera:

[root@server1 ~]# firewall-cmd --add-port=12345/tcp --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server1 ~]# firewall-cmd --list-all --zone=public 
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33 ens37
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 12345/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[root@server1 ~]# 

Para eliminar un puerto sería:

[root@server1 ~]# firewall-cmd --remove-port=12345/tcp --permanent
success
[root@server1 ~]# firewall-cmd --reload 
success
[root@server1 ~]# firewall-cmd --list-all --zone=public 
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33 ens37
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[root@server1 ~]# 

Como siempre, llamaremos aplicaremos las reglas con el parámetro –reload.

Redirección de puertos con firewall-cmd

Es habitual redirigir puertos en entornos profesionales donde un firewall tiene que manejar muchísimos servicios. Con firewall-cmd también podemos redirigir puertos.

firewall-cmd --zone="public" --add-forward-port=port=22:proto=tcp:toport=2222

En el ejemplo anterior hemos redirigido el puerto 22 al 2222.

Pero todavía podemos complicar un poco más la redirección, apuntando hacia otro servidor:

firewall-cmd --zone=public --add-masquerade
firewall-cmd --zone="public" --add-forward-port=port=22:proto=tcp:toport=2222:toaddr=192.168.23.4

Si queremos eliminar esta redirección:

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

Reglas enriquecidas de Firewalld (rich rules)

Podemos configurar reglas de firewall más complejas en firewalld con el lenguaje enriquecido (ver guía). Con el comando man firewalld.richlanguage también podremos acceder a la ayuda de este tipo de configuración del firewall.

Algunos ejemplos:

  • Permitir todo el tráfico IPV4 desde la IP 192.168.23.4:
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.23.4 accept'
  • Denegar el tráfico TCP y puerto 22 desde la IP 192.168.23.4:
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.23.4" port port=22 protocol=tcp reject'
  • Permitir el tráfico IPV4 desde la IP 192.168.23.4 y redirigir el puerto 22 TCP al 2222:
firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=192.168.23.4 forward-port port=22 protocol=tcp to-port=2222'
  • Permitir el tráfico IPV4 y redirigir el tráfico del puerto 80 al 8080 del servidor 192.168.23.4:
firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=192.168.23.4'
  • Revisar las rich rules configuradas en firewalld:
firewall-cmd --list-rich-rules

Administrar las reglas de firewalls con Cockpit

Hace tiempo ya os hablé de Cockpit para administrar ciertos aspectos de Linux desde una interfaz WEB. Pues bien, firewalld es uno de esos componentes que podemos administrar desde Cockpit.

Administrar firewalld desde Cockpit
Configurar reglas de firewall con cockpit

Te puede interesar

COMPÁRTEME

Deja un comentario