Introducción
Un firewall configurado correctamente es uno de los aspectos más importantes de la seguridad general del sistema.
FirewallD es una solución de firewall completa que administra las reglas de iptables del sistema y proporciona una interfaz D-Bus para operar en ellas. A partir de CentOS 7, FirewallD reemplaza iptables como la herramienta de administración de firewall predeterminada.
En este tutorial, le mostramos cómo configurar un firewall con FirewallD en su sistema CentOS 8 y explicamos los conceptos básicos de FirewallD.
Prerrequisitos
Antes de comenzar este tutorial, asegúrese de haber iniciado sesión en el servidor con una cuenta de usuario con privilegios de sudo o con el usuario root. La mejor práctica es ejecutar comandos administrativos como usuario sudo en lugar de root. Si no tiene un usuario sudo en su sistema CentOS, puede crear uno siguiendo estas instrucciones.
Si desea instalar y configurar FirewallD en un servidor remoto, continúe leyendo, de lo contrario, omita el primer párrafo "Conexión al servidor" y lea el siguiente.
Conexión al servidor
Para acceder al servidor, necesita conocer la dirección IP. También necesitará su nombre de usuario y contraseña para la autenticación. Para conectarse al servidor como root, escriba el siguiente comando:
ssh root@IP_DEL_SERVER
A continuación, deberá ingresar la contraseña del usuario root.
Si no está utilizando el usuario root, puede iniciar sesión con otro nombre de usuario utilizando el mismo comando, luego cambie root a su nombre de usuario:
ssh nome_utente@IP_DEL_SERVER
Luego se le pedirá que ingrese su contraseña de usuario.
El puerto estándar para conectarse a través de ssh es 22, si su servidor usa un puerto diferente, deberá especificarlo usando el parámetro -p, luego escriba el siguiente comando:
ssh nome_utente@IP_DEL_SERVER -p PORTA
Conceptos básicos de Firewalld
FirewallD usa los conceptos de zonas y servicios, en lugar de cadenas y reglas de iptables. Según las zonas y los servicios que configurará, puede controlar qué tráfico está permitido o no hacia y desde el sistema.
FirewallD se puede configurar y administrar mediante la utilidad de firewall-cmd
Zonas de Firewalld
Las zonas son conjuntos de reglas predefinidos que especifican qué tráfico debe permitirse en función del nivel de confianza en las redes a las que está conectada la computadora. Las interfaces de red y las fuentes se pueden asignar a una zona.
Las siguientes son las zonas proporcionadas por FirewallD ordenadas por el nivel de confianza de la zona de no confiable a confiable:
- descartar: todas las conexiones entrantes se descartan sin ninguna notificación. Solo se permiten conexiones salientes.
- block: Todas las conexiones entrantes se niegan con un mensaje
icmp-host-prohibited
IPv4
eicmp6-adm-prohibited
para IPv6n. Solo se permiten conexiones salientes. - público: para uso en áreas públicas no confiables. No confía en otros equipos de la red, pero puede permitir determinadas conexiones entrantes.
- externo: para usar en redes externas con el enmascaramiento NAT habilitado cuando el sistema actúa como puerta de enlace o enrutador. Solo se permiten las conexiones entrantes seleccionadas.
- interno: para uso en redes internas cuando el sistema actúa como puerta de enlace o enrutador. Otros sistemas en la red son generalmente confiables. Solo se permiten las conexiones entrantes seleccionadas.
- dmz: utilizado 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. Otras computadoras en la red son generalmente confiables. Solo se permiten las conexiones entrantes seleccionadas.
- hogar: utilizado para máquinas domésticas. Otras computadoras en la red son generalmente confiables. Solo se permiten las conexiones entrantes seleccionadas.
- confiable: 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 requerida para permitir el tráfico entrante para un servicio específico.
Tiempo de ejecución de Firewalld y configuración permanente
Firewalld usa dos conjuntos de configuración separados, tiempo de ejecución y configuración persistente.
La configuración en tiempo de ejecución es la configuración en ejecución real y no es persistente al reiniciar. Cuando se inicia el servicio Firewalld, carga la configuración permanente, que se convierte en la configuración del tiempo de ejecución.
De forma predeterminada, cuando realiza cambios en la configuración de Firewalld mediante la firewall-cmd
, los cambios se aplican a la configuración del tiempo de ejecución. Para que los cambios sean permanentes, debe usar la opción --permanent
Instalar y habilitar FirewallD
Firewalld está instalado de forma predeterminada en CentOS 8, pero si no está instalado en su sistema, puede instalar el paquete escribiendo:
sudo dnf install firewalld
El servicio Firewalld está deshabilitado de forma predeterminada. Puede verificar el estado del firewall con:
sudo firewall-cmd --state
Si acaba de instalar o nunca lo ha activado antes, el comando imprimirá not running
. De lo contrario, verá running
.
Para iniciar el servicio FirewallD y habilitarlo al inicio, escriba:
sudo systemctl start firewalld
sudo systemctl enable firewalld
Trabajar con zonas de Firewalld
Después de habilitar el servicio FirewallD por primera vez, la public
se establece como la zona predeterminada. 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
De forma predeterminada, a todas las interfaces de red se les asigna la zona predeterminada. Para comprobar qué zonas utiliza su tipo de interfaz de red:
sudo firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
El resultado anterior nos dice que las eth0
y eth1
están asignadas a la zona pública.
Puede imprimir los ajustes de 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:
En el resultado anterior, podemos ver que la zona pública está activa y configurada como predeterminada, utilizada por las interfaces eth0
y eth1
Además, se permiten conexiones relacionadas con el cliente DHCP y SSH.
Si desea verificar 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 la zona de una interfaz
Usted puede cambiar fácilmente la zona de interfaz mediante la --zone
opción en combinación con el --change-interface
opción. El siguiente comando asignará la eth1
al espacio de trabajo:
sudo firewall-cmd --zone=work --change-interface=eth1
Verifique los cambios escribiendo:
sudo firewall-cmd --get-active-zones
work
interfaces: eth1
public
interfaces: eth0
Cambiar la zona predeterminada
Para cambiar la zona predeterminada, use la --set-default-zone
seguida del nombre de la zona que desea establecer como predeterminada.
Por ejemplo, para cambiar la zona predeterminada a casa, debe ejecutar el siguiente comando:
sudo firewall-cmd --set-default-zone=home
Verifique los cambios con:
sudo firewall-cmd --get-default-zone
home
Abrir un puerto o servicio
Con FirewallD puede permitir el tráfico para puertos específicos según reglas predefinidas llamadas servicios.
Para obtener una lista de todos los servicios predefinidos disponibles, escriba:
sudo firewall-cmd --get-services
....
ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex plexmediaserver pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client....
Puede encontrar más información sobre cada servicio abriendo el archivo.xml asociado dentro del /usr/lib/firewalld/services
. Por ejemplo, el servicio HTTP se define así:
Para permitir el tráfico HTTP entrante (puerto 80
) para interfaces en el área 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á editando la zona predeterminada, puede --zone
la opción --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
Si desea mantener el puerto 80 abierto después de reiniciar, debe escribir el mismo comando nuevamente, pero esta vez con la opción --permanent
sudo firewall-cmd --permanent --zone=public --add-service=http
Use --list-services
junto con la --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 para agregar un servicio. Simplemente use --remove-service
lugar de la opción --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.
¿Qué sucede si ejecuto una aplicación como Plex Media Server para la que no hay disponible un servicio adecuado?
En situaciones como estas, tiene dos opciones. Puede abrir los puertos apropiados o definir un nuevo servicio de FirewallD.
Por ejemplo, el servidor Plex está escuchando en el puerto 32400 y usa TCP, para abrir el puerto en el área pública para la sesión actual use la --add-port=
:
sudo firewall-cmd --zone=public --add-port=32400/tcp
Los protocolos pueden ser tcp
o udp
.
Para verificar que el puerto se agregó correctamente, use la opción --list-ports
sudo firewall-cmd --zone=public --list-ports
32400/tcp
Para mantener el puerto 32400
abierto después del reinicio, agregue la regla a la configuración persistente ejecutando el mismo comando con la opción --permanent
La sintaxis para eliminar un puerto es la misma que para agregar un puerto. Simplemente use --remove-port
lugar de la opción --add-port
sudo firewall-cmd --zone=public --remove-port=32400/tcp
Cree un nuevo servicio de FirewallD
Como ya hemos mencionado, los servicios predeterminados se almacenan en el /usr/lib/firewalld/services
. La forma más sencilla de crear un nuevo servicio es copiar un archivo de servicio existente en el /etc/firewalld/services
, que es la ruta a los servicios creados por el usuario, y cambiar la configuración del archivo.
Por ejemplo, para crear una definición de servicio para Plex Media Server, podemos usar el archivo de servicio SSH:
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/plexmediaserver.xml
Abra el plexmediaserver.xml
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 port
, que define el número de puerto y el protocolo que desea abrir.
En el siguiente ejemplo, estamos abriendo los puertos 1900
UDP y 32400
TCP.
sudo vi /etc/firewalld/services/plexmediaserver.xml
Edite el archivo de esta manera:
<?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 cierre el archivo.
Vuelva a cargar el servicio FirewallD:
sudo firewall-cmd --reload
Ahora puede utilizar el plexmediaserver
en sus áreas como cualquier otro servicio.
Reenvío de puertos con Firewalld
Para reenviar el tráfico de un puerto a otro puerto o dirección, primero habilite el enmascaramiento para la zona deseada usando el interruptor --add-masquerade
Por ejemplo, para habilitar el enmascaramiento para el external
de zona:
sudo firewall-cmd --zone=external --add-masquerade
- Reenviar el tráfico de un puerto a otro en el mismo servidor
En el siguiente ejemplo, estamos reenviando el tráfico del puerto 80
al 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 otro servidor
En el siguiente ejemplo, estamos reenviando tráfico desde el puerto 80
al puerto 80
en un servidor con IP 10.12.12.22
:
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=10.12.12.22
- Reenviar el tráfico a otro servidor en un puerto diferente
En el siguiente ejemplo, estamos reenviando tráfico desde el puerto 80
al puerto 8080
en un servidor con IP 10.12.12.22
:
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.12.12.22
Si desea que el reenvío sea permanente, agregue la opción --permanent
Cree un conjunto de reglas con FirewallD
En el siguiente ejemplo, le mostraremos cómo configurar el firewall si está ejecutando un servidor web. Supongamos que su servidor tiene solo una eth0
y desea permitir el tráfico entrante solo en los puertos SSH, HTTP y HTTPS.
- Cambie la zona predeterminada a dmz.
Usaremos la zona DMZ (desmilitarizada) porque por defecto solo permite tráfico SSH. Para cambiar la zona predeterminada en dmz y asignarla a la eth0
, ejecute los siguientes comandos:
sudo firewall-cmd --set-default-zone=dmz
- Abra los puertos HTTP y HTTPS:
Para abrir los puertos HTTP y HTTPS, agregue reglas de servicio persistentes a la zona dmz:
sudo firewall-cmd --permanent --zone=dmz --add-service=http
Haga que los cambios surtan efecto inmediatamente volviendo a cargar el firewall:
sudo firewall-cmd --reload
- Revisa los cambios
Para verificar el tipo de configuración de la zona dmz:
sudo firewall-cmd --zone=dmz --list-all
dmz (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
La salida anterior nos dice que dmz es la zona predeterminada, se aplica a la eth0
y los puertos ssh (22) http (80) y https (443) están abiertos.
Conclusión
Ha aprendido a configurar y administrar el servicio FirewallD en su sistema CentOS.
Asegúrese de permitir todas las conexiones entrantes necesarias para que el sistema funcione correctamente, mientras limita todas las conexiones innecesarias.