Un firewall es un método para monitorear y filtrar el tráfico de red entrante y saliente. Funciona mediante la definición de un conjunto de reglas de seguridad que determinan si permitir o bloquear tráfico específico. Un firewall correctamente configurado es uno de los aspectos más importantes de la seguridad general del sistema.
CentOS 8 se envía con un demonio de cortafuegos 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 #
- Conceptos básicos de Firewalld #
- Zonas Firewalld #
- Servicios de firewall #
- Configuración permanente y de tiempo de ejecución de Firewalld #
- Habilitar FirewallD #
- Zonas Firewalld #
- Cambiar el destino de zona #
- Asignar una interfaz a una zona diferente #
- Cambiar la zona predeterminada #
- Crear nuevas zonas #
- Servicios Firewalld #
- Crear un nuevo Servicio FirewallD #
- Abrir puertos e IP de origen #
- Abrir una IP de origen #
- Abrir un puerto de origen #
- Puertos de reenvío #
- Reenviar el tráfico de un puerto a otro en la dirección IP #
- Reenviar el tráfico a otra dirección IP #
- Reenviar el tráfico a otro servidor en un puerto diferente #
- Conclusión #
Requisitos previos #
Para configurar el servicio de firewall, debe iniciar sesión como usuario root o usuario con privilegios sudo.
Conceptos básicos de Firewalld #
firewalld utiliza los conceptos de zonas y servicios. En función de las zonas y los servicios que configure, puede controlar el tráfico permitido o bloqueado hacia y desde el sistema.
Firewalld se puede configurar y administrar mediante la utilidad de línea de comandos firewall-cmd
.
En CentOS 8, iptables es reemplazado por nftables como el servidor de seguridad predeterminado para el demonio firewalld.
Zonas Firewalld #
Las zonas son conjuntos predefinidos de reglas que especifican el nivel de confianza de las redes a las que está conectado el equipo. Puede asignar interfaces de red y fuentes a una zona.
A continuación se muestran las zonas proporcionadas por FirewallD ordenadas de acuerdo con el nivel de confianza de la zona de no confiable a confiable:
- soltar: Todas las conexiones entrantes se eliminan sin ninguna notificación. Solo se permiten conexiones salientes.bloque
- : Se rechazan todas las conexiones entrantes con un mensaje
icmp-host-prohibited
paraIPv4
yicmp6-adm-prohibited
para IPv6n. Solo se permiten las conexiones salientes. - público: Para uso en áreas públicas no confiables. No confía en otros equipos de la red, pero puede permitir las conexiones entrantes seleccionadas.
- externo: Para su uso en redes externas con enmascaramiento NAT habilitado cuando su sistema actúa como una puerta de enlace o enrutador. Solo se permiten las conexiones entrantes seleccionadas.
- interno: Para su uso en redes internas cuando su sistema actúa como una puerta de enlace o enrutador. Otros sistemas de la red son generalmente de confianza. Solo se permiten las conexiones entrantes seleccionadas.
- dmz: Se utiliza para equipos ubicados en la zona desmilitarizada que tienen acceso limitado al resto de la red. Solo se permiten las conexiones entrantes seleccionadas.
- trabajo: Utilizado para máquinas de trabajo. Otros equipos de la red son generalmente de confianza. Solo se permiten las conexiones entrantes seleccionadas.
- hogar: Se utiliza para máquinas domésticas. Otros equipos de la red son generalmente de confianza. Solo se permiten las conexiones entrantes seleccionadas.
- confianza: Se aceptan todas las conexiones de red. Confíe en todos los ordenadores de la red.
Servicios de firewall #
Los servicios Firewalld son reglas predefinidas que se aplican dentro de una zona y definen la configuración necesaria para permitir el tráfico entrante de 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.
Configuración permanente y de tiempo de ejecución de Firewalld #
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 de 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 con la utilidad firewall-cmd
, los cambios se aplican a la configuración de tiempo de ejecución. Para que los cambios sean permanentes, añada la opción --permanent
al comando.
Para aplicar los cambios en ambos conjuntos de configuración, puede utilizar uno de los dos métodos siguientes:
-
Cambiar la configuración de tiempo de ejecución y hacerla permanente:
sudo firewall-cmd <options>
sudo firewall-cmd --runtime-to-permanent
-
Cambiar la configuración permanente y recargar el demonio firewalld:
sudo firewall-cmd --permanent <options>
sudo firewall-cmd --reload
Habilitar FirewallD #
En CentOS 8, firewalld está instalado y habilitado de forma predeterminada. Si por alguna razón no está instalado en su sistema, puede instalar e iniciar el demonio escribiendo:
sudo dnf install firewalld
sudo systemctl enable firewalld --now
Puede comprobar el estado del servicio de firewall con:
sudo firewall-cmd --state
Si el firewall está habilitado, el comando debería imprimir running
. De lo contrario, verá not running
.
Zonas Firewalld #
Si no la ha cambiado, la zona predeterminada se establece en public
y todas las interfaces de red se asignan a esta zona.
La zona predeterminada 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
La salida a continuación muestra que las interfaces eth0
y eth1
están asignadas a la zona public
:
public interfaces: eth0 eth1
Puede imprimir la configuración de la 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:
De la salida anterior, podemos ver que la zona pública está activa y utiliza el destino predeterminado, que es REJECT
. La salida también muestra que la zona es utilizada por las interfaces eth0
y eth1
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 lista enorme con la configuración de todas las zonas disponibles.
Cambiar el destino de zona #
El destino define el comportamiento predeterminado de la zona para el tráfico entrante que no se especifica. Se puede configurar en una de las siguientes opciones: default
, ACCEPT
, REJECT
, y DROP
.
Para establecer el destino de la zona, especifique la zona con la opción --zone
y el destino con la opción --set-target
.
Por ejemplo, para cambiar el destino de la zona public
a DROP
, debe ejecutar:
sudo firewall-cmd --zone=public --set-target=DROP
Asignar 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 varias interfaces en su máquina.
Para asignar una interfaz a una zona diferente, especifique la zona con la opción --zone
y la interfaz con la opción --change-interface
.
Por ejemplo, el siguiente comando asigna la interfaz eth1
a la zona work
:
sudo firewall-cmd --zone=work --change-interface=eth1
Verifique los cambios escribiendo:
sudo firewall-cmd --get-active-zones
work interfaces: eth1public interfaces: eth0
Cambiar la zona predeterminada #
Para cambiar la zona predeterminada, use la opción --set-default-zone
seguida del nombre de la zona que desea establecer predeterminada.
Por ejemplo, para cambiar la zona predeterminada a home
, ejecute el siguiente comando:
sudo firewall-cmd --set-default-zone=home
Verifique los cambios con:
sudo firewall-cmd --get-default-zone
home
Crear 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
, abriremos el puerto 11211
y permitiremos el acceso solo desde la dirección IP 192.168.100.30
:
-
Crear la zona:
sudo firewall-cmd --new-zone=memcached --permanent
-
Añadir 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
-
Recarga el demonio firewalld para activar los cambios:
sudo firewall-cmd --reload
Servicios Firewalld #
Con firewalld puede permitir tráfico para puertos y/o fuentes específicos en función de reglas predefinidas llamadas servicios.
Para obtener una lista de todos los servicios disponibles predeterminados, escriba:
sudo firewall-cmd --get-services
Puede encontrar más información sobre cada servicio abriendo el asociado .archivo xml dentro del directorio /usr/lib/firewalld/services
. Por ejemplo, el servicio HTTP se define de la siguiente manera:
<?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
--zone
.Para verificar que el servicio se agregó correctamente, use la opción --list-services
:
sudo firewall-cmd --zone=public --list-services
ssh dhcpv6-client http
Para mantener abierto el puerto 80 después de un reinicio, ejecute el mismo comando una vez más con la opción --permanent
, o ejecute:
sudo firewall-cmd --runtime-to-permanent
Utilice la opción --list-services
junto con la opción --permanent
para verificar los cambios:
sudo firewall-cmd --permanent --zone=public --list-services
ssh dhcpv6-client http
La sintaxis para eliminar el servicio es la misma que cuando se agrega uno. Simplemente use --remove-service
en lugar de la bandera --add-service
:
sudo firewall-cmd --zone=public --remove-service=http --permanent
El comando anterior elimina el servicio http
de la configuración permanente de la zona pública.
Crear un nuevo Servicio FirewallD #
Como ya hemos mencionado, los servicios predeterminados se almacenan en el directorio /usr/lib/firewalld/services
. La forma más sencilla de crear un nuevo servicio es copiar un archivo de servicio existente al directorio /etc/firewalld/services
, 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 el servidor Multimedia Plex, puede usar el archivo de servicio SSH:
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/plexmediaserver.xml
Abra el archivo plexmediaserver.xml
recién creado y cambie el nombre corto y la descripción del servicio dentro de las etiquetas <short>
y <description>
. La etiqueta más importante que debe cambiar es la etiqueta port
, 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 servicio plexmediaserver
en sus zonas al igual que cualquier otro servicio.
Abrir puertos e IP de origen #
Firewalld también le permite habilitar rápidamente todo el tráfico desde una dirección IP de confianza o en un puerto específico sin crear una definición de servicio.
Abrir una IP de origen #
Para permitir todo el tráfico entrante desde una dirección IP (o rango) específico, especifique la zona con la opción --zone
y la IP de origen con la opción --add-source
.
Por ejemplo, para permitir todo el tráfico entrante de 192.168.1.10 en la zona public
, ejecute:
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 con 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 cuando se agrega una. Simplemente use --remove-source
en lugar de la opción --add-source
:
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 la opción --zone
y el puerto y el protocolo con la opción --add-port
.
Por ejemplo, para abrir el puerto 8080
en la zona pública para la sesión actual de la herida ejecutar:
sudo firewall-cmd --zone=public --add-port=8080/tcp
El protocolo puede ser tcp
, udp
, sctp
, o dccp
.
Verificar 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 con la bandera --permanent
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 la opción --add-port
.
sudo firewall-cmd --zone=public --remove-port=8080/tcp
Puertos de reenvío #
Para reenviar tráfico de un puerto a otro, habilite primero el enmascaramiento para la zona deseada con la opción --add-masquerade
. Por ejemplo, para habilitar el enmascaramiento para la zona external
, escriba:
sudo firewall-cmd --zone=external --add-masquerade
Reenviar el tráfico de un puerto a otro en la dirección IP #
En el siguiente ejemplo, nos están desviando el tráfico desde el puerto 80
puerto 8080
en el mismo servidor:
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
Reenviar el tráfico a otra dirección IP #
En el siguiente ejemplo, nos están desviando el tráfico desde el puerto 80
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 el tráfico a otro servidor en un puerto diferente #
En el siguiente ejemplo, nos están desviando el tráfico desde el puerto 80
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
Conclusión #
Ha aprendido a configurar y administrar el servicio firewalld en su sistema CentOS 8.
Asegúrese de permitir todas las conexiones entrantes que sean necesarias para el funcionamiento adecuado de su sistema, al tiempo que limita todas las conexiones innecesarias.