Un firewall es un método para monitorear y filtrar el tráfico de red entrante y saliente. Funciona definiendo un conjunto de reglas de seguridad que determinan si se permite o bloquea un tráfico específico. Un cortafuegos correctamente configurado es uno de los aspectos más importantes de la seguridad general del sistema.
CentOS 8 viene con un demonio de firewall llamado firewalld. Es una solución completa con una interfaz D-Bus que le permite administrar el firewall del sistema de forma dinámica.
En este tutorial, hablaremos sobre cómo configurar y administrar el firewall en CentOS 8. También explicaremos los conceptos básicos de FirewallD.
Requisitos previos #
Para configurar el servicio de firewall, debe iniciar sesión como root o usuario con privilegios sudo.
Conceptos básicos de cortafuegos #
firewalld utiliza los conceptos de zonas y servicios. Según las zonas y los servicios que configurará, puede controlar qué tráfico se permite o bloquea hacia y desde el sistema.
Firewalld se puede configurar y administrar usando el firewall-cmd
utilidad de línea de comandos.
En CentOS 8, iptables se reemplaza por nftables como el servidor de seguridad predeterminado para el demonio firewalld.
Zonas de cortafuegos #
Las zonas son conjuntos predefinidos de reglas que especifican el nivel de confianza de las redes a las que está conectada su computadora. Puede asignar interfaces de red y fuentes a una zona.
A continuación se muestran las zonas proporcionadas por FirewallD ordenadas según el nivel de confianza de la zona, de no confiable a confiable:
- soltar :Todas las conexiones entrantes se interrumpen sin ninguna notificación. Solo se permiten conexiones salientes.
- bloquear :Todas las conexiones entrantes se rechazan con un
icmp-host-prohibited
mensaje paraIPv4
yicmp6-adm-prohibited
para IPv6n. Solo se permiten conexiones salientes. - público :Para uso en áreas públicas no confiables. No confía en otras computadoras en la red, pero puede permitir conexiones entrantes seleccionadas.
- externo :para uso en redes externas con enmascaramiento de NAT habilitado cuando su sistema actúa como puerta de enlace o enrutador. Solo se permiten conexiones entrantes seleccionadas.
- interno :Para usar en redes internas cuando su sistema actúa como puerta de enlace o enrutador. Por lo general, se confía en otros sistemas de la red. Solo se permiten conexiones entrantes seleccionadas.
- dmz :Se usa para computadoras ubicadas en su zona desmilitarizada que tienen acceso limitado al resto de su red. Solo se permiten conexiones entrantes seleccionadas.
- trabajo :Utilizado para máquinas de trabajo. Por lo general, se confía en otras computadoras en la red. Solo se permiten conexiones entrantes seleccionadas.
- casa :Utilizado para máquinas domésticas. Por lo general, se confía en otras computadoras en la red. Solo se permiten conexiones entrantes seleccionadas.
- de confianza :Se aceptan todas las conexiones de red. Confíe en todas las computadoras de la red.
Servicios de cortafuegos #
Los servicios de firewall son reglas predefinidas que se aplican dentro de una zona y definen la configuración necesaria para permitir el tráfico entrante para un servicio específico. Los servicios le permiten realizar fácilmente varias tareas en un solo paso.
Por ejemplo, el servicio puede contener definiciones sobre la apertura de puertos, el reenvío de tráfico y más.
Firewalld Runtime y configuración permanente #
Firewalld utiliza dos conjuntos de configuración separados, tiempo de ejecución y configuración permanente.
La configuración de tiempo de ejecución es la configuración en ejecución real y no persiste al reiniciar. Cuando se inicia el demonio firewalld, carga la configuración permanente, que se convierte en la configuración de tiempo de ejecución.
De forma predeterminada, al realizar cambios en la configuración de Firewalld mediante firewall-cmd
utilidad, los cambios se aplican a la configuración de tiempo de ejecución. Para hacer que los cambios sean permanentes, agregue el --permanent
opción al comando.
Para aplicar los cambios en ambos conjuntos de configuración, puede utilizar uno de los dos métodos siguientes:
-
Cambie la configuración del tiempo de ejecución y hágala permanente:
sudo firewall-cmd <options>
sudo firewall-cmd --runtime-to-permanent
-
Cambie la configuración permanente y vuelva a cargar el demonio firewalld:
sudo firewall-cmd --permanent <options>
sudo firewall-cmd --reload
Habilitando FirewallD #
En CentOS 8, firewalld está instalado y habilitado de manera predeterminada. Si por alguna razón no está instalado en su sistema, puede instalar e iniciar el daemon escribiendo:
sudo dnf install firewalld
sudo systemctl enable firewalld --now
Puede verificar el estado del servicio de firewall con:
sudo firewall-cmd --state
Si el firewall está habilitado, el comando debe imprimir running
. De lo contrario, verá que not running
.
Zonas de cortafuegos #
Si no la ha cambiado, la zona predeterminada se establece en public
y todas las interfaces de red están asignadas a esta zona.
La zona por defecto es la que se usa para todo lo que no está asignado explícitamente a otra zona.
Puede ver la zona predeterminada escribiendo:
sudo firewall-cmd --get-default-zone
public
Para obtener una lista de todas las zonas disponibles, escriba:
sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Para ver las zonas activas y las interfaces de red asignadas a ellas:
sudo firewall-cmd --get-active-zones
El siguiente resultado muestra que las interfaces eth0
y eth1
se asignan al public
zona:
public
interfaces: eth0 eth1
Puede imprimir los ajustes de configuración de zona con:
sudo firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Del resultado anterior, podemos ver que la zona pública está activa y usa el objetivo predeterminado, que es REJECT
. El resultado también muestra que la zona es utilizada por eth0
y eth1
interfaces y permite el tráfico de cliente DHCP y SSH.
Si desea comprobar las configuraciones de todas las zonas disponibles escriba:
sudo firewall-cmd --list-all-zones
El comando imprime una enorme lista con la configuración de todas las zonas disponibles.
Cambiando el objetivo de la zona #
El objetivo define el comportamiento predeterminado de la zona para el tráfico entrante que no se especifica. Se puede establecer en una de las siguientes opciones:default
, ACCEPT
, REJECT
y DROP
.
Para establecer el objetivo de la zona, especifique la zona con --zone
opción y el objetivo con --set-target
opción.
Por ejemplo, para cambiar el public
objetivo de la zona para DROP
ejecutarías:
sudo firewall-cmd --zone=public --set-target=DROP
Asignación de una interfaz a una zona diferente #
Puede crear conjuntos específicos de reglas para diferentes zonas y asignarles diferentes interfaces. Esto es especialmente útil cuando tiene múltiples interfaces en su máquina.
Para asignar una interfaz a una zona diferente, especifique la zona con --zone
y la interfaz con --change-interface
opción.
Por ejemplo, el siguiente comando asigna el eth1
interfaz para el work
zona:
sudo firewall-cmd --zone=work --change-interface=eth1
Verifique los cambios escribiendo:
sudo firewall-cmd --get-active-zones
work
interfaces: eth1
public
interfaces: eth0
Cambiando la Zona Predeterminada #
Para cambiar la zona predeterminada, use --set-default-zone
opción seguida del nombre de la zona que desea establecer como predeterminada.
Por ejemplo, para cambiar la zona predeterminada a home
ejecutaría el siguiente comando:
sudo firewall-cmd --set-default-zone=home
Verifique los cambios con:
sudo firewall-cmd --get-default-zone
home
Creando nuevas Zonas #
Firewalld también le permite crear sus propias zonas. Esto es útil cuando desea crear reglas por aplicación.
En el siguiente ejemplo, crearemos una nueva zona llamada memcached
, abre el puerto 11211
y permitir el acceso solo desde el 192.168.100.30
dirección IP:
-
Crea la zona:
sudo firewall-cmd --new-zone=memcached --permanent
-
Agregue las reglas a la zona:
sudo firewall-cmd --zone=memcached --add-port=11211/udp --permanent
sudo firewall-cmd --zone=memcached --add-port=11211/tcp --permanent
sudo firewall-cmd --zone=memcached --add-source=192.168.100.30/32 --permanent
-
Vuelva a cargar el demonio firewalld para activar los cambios:
sudo firewall-cmd --reload
Servicios de cortafuegos #
Con firewalld, puede permitir el tráfico de puertos y/o fuentes específicas en función de reglas predefinidas denominadas servicios.
Para obtener una lista de todos los servicios predeterminados disponibles, escriba:
sudo firewall-cmd --get-services
Puede encontrar más información sobre cada servicio abriendo el archivo .xml asociado dentro de /usr/lib/firewalld/services
directorio. Por ejemplo, el servicio HTTP se define así:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="80"/>
</service>
Para permitir el tráfico HTTP entrante (puerto 80) para interfaces en la zona pública, solo para la sesión actual (configuración de tiempo de ejecución), escriba:
sudo firewall-cmd --zone=public --add-service=http
Si está modificando la zona predeterminada, puede omitir --zone
opción.
Para verificar que el servicio se agregó correctamente, use --list-services
opción:
sudo firewall-cmd --zone=public --list-services
ssh dhcpv6-client http
Para mantener el puerto 80 abierto después de un reinicio, ejecute el mismo comando una vez más con --permanent
opción, o ejecutar:
sudo firewall-cmd --runtime-to-permanent
Usa los --list-services
junto con el --permanent
opción para verificar sus cambios:
sudo firewall-cmd --permanent --zone=public --list-services
ssh dhcpv6-client http
La sintaxis para eliminar un servicio es la misma que para agregar uno. Simplemente use --remove-service
en lugar de --add-service
bandera:
sudo firewall-cmd --zone=public --remove-service=http --permanent
El comando anterior elimina el http
servicio desde la configuración permanente de la zona pública.
Creación de un nuevo FirewallD Service #
Como ya hemos mencionado, los servicios predeterminados se almacenan en el /usr/lib/firewalld/services
directorio. La forma más sencilla de crear un nuevo servicio es copiar un archivo de servicio existente en /etc/firewalld/services
directorio, que es la ubicación de los servicios creados por el usuario y modificar la configuración del archivo.
Por ejemplo, para crear una definición de servicio para Plex Media Server, puede usar el archivo de servicio SSH:
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/plexmediaserver.xml
Abra el plexmediaserver.xml
recién creado y cambie el nombre abreviado y la descripción del servicio dentro del <short>
y <description>
etiquetas La etiqueta más importante que debe cambiar es el port
etiqueta, que define el número de puerto y el protocolo que desea abrir.
En el siguiente ejemplo, estamos abriendo puertos 1900
UDP y 32400
TCP.
<?xml version="1.0" encoding="utf-8"?>
<service version="1.0">
<short>plexmediaserver</short>
<description>Plex is a streaming media server that brings all your video, music and photo collections together and stream them to your devices at anytime and from anywhere.</description>
<port protocol="udp" port="1900"/>
<port protocol="tcp" port="32400"/>
</service>
Guarde el archivo y vuelva a cargar el servicio FirewallD:
sudo firewall-cmd --reload
Ahora puede usar el plexmediaserver
servicio en sus zonas igual que cualquier otro servicio.
Puertos de apertura e IP de origen #
Firewalld también le permite habilitar rápidamente todo el tráfico desde una dirección IP confiable o en un puerto específico sin crear una definición de servicio.
Abrir una fuente IP #
Para permitir todo el tráfico entrante desde una dirección IP específica (o rango), especifique la zona con --zone
y la IP de origen con --add-source
opción.
Por ejemplo, para permitir todo el tráfico entrante de 192.168.1.10 en el public
zona, ejecutar:
sudo firewall-cmd --zone=public --add-source=192.168.1.10
Hacer que la nueva regla sea persistente:
sudo firewall-cmd --runtime-to-permanent
Verifique los cambios usando el siguiente comando:
sudo firewall-cmd --zone=public --list-sources
192.168.1.10
La sintaxis para eliminar una IP de origen es la misma que para agregar una. Solo usa --remove-source
en lugar de --add-source
opción:
sudo firewall-cmd --zone=public --remove-source=192.168.1.10
Abrir un puerto de origen #
Para permitir todo el tráfico entrante en un puerto determinado, especifique la zona con --zone
opción y el puerto y el protocolo con --add-port
opción.
Por ejemplo, para abrir el puerto 8080
en la zona pública de la sesión actual, ejecute:
sudo firewall-cmd --zone=public --add-port=8080/tcp
El protocolo puede ser tcp
, udp
, sctp
o dccp
.
Verifique los cambios:
sudo firewall-cmd --zone=public --list-ports
8080
Para mantener el puerto abierto después de un reinicio, agregue la regla a la configuración permanente ejecutando el mismo comando usando --permanent
flag o ejecutando:
sudo firewall-cmd --runtime-to-permanent
La sintaxis para eliminar un puerto es la misma que cuando se agrega un puerto. Simplemente use --remove-port
en lugar de --add-port
opción.
sudo firewall-cmd --zone=public --remove-port=8080/tcp
Puertos de reenvío #
Para reenviar el tráfico de un puerto a otro puerto, primero habilite el enmascaramiento para la zona deseada usando --add-masquerade
opción. Por ejemplo, para habilitar el enmascaramiento para el external
zona, escriba:
sudo firewall-cmd --zone=external --add-masquerade
Reenviar tráfico de un puerto a otro en la dirección IP #
En el siguiente ejemplo, reenviamos el tráfico desde el puerto 80
al puerto 8080
en el mismo servidor:
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
Reenviar tráfico a otra dirección IP #
En el siguiente ejemplo, reenviamos el tráfico desde el puerto 80
al puerto 80
en un servidor con IP 10.10.10.2
:
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=10.10.10.2
Reenviar tráfico a otro servidor en un puerto diferente #
En el siguiente ejemplo, reenviamos el tráfico desde el puerto 80
al puerto 8080
en un servidor con IP 10.10.10.2
:
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.10.10.2
Para que la regla de reenvío sea persistente, utilice:
sudo firewall-cmd --runtime-to-permanent