Un cortafuegos correctamente configurado es uno de los aspectos más importantes de la seguridad general del sistema.
FirewallDis es una completa solución de firewall que administra las reglas de iptables del sistema y proporciona una interfaz D-Bus para operar sobre ellas. A partir de CentOS 7, FirewallD reemplaza a 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 7 y le explicamos los conceptos básicos de FirewallD.
Requisitos previos #
Antes de comenzar con este tutorial, asegúrese de haber iniciado sesión en su servidor con una cuenta de usuario con privilegios de sudo o con el usuario raíz. 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.
Conceptos básicos de cortafuegos #
FirewallD utiliza 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 se permite o no se permite hacia y desde el sistema.
FirewallD se puede configurar y administrar usando el firewall-cmd
utilidad de línea de comandos.
Zonas de cortafuegos #
Las zonas son conjuntos predefinidos de reglas que especifican qué tráfico debe permitirse en función del nivel de confianza en 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.
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 es persistente en los reinicios. Cuando se inicia el servicio 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, debe usar --permanent
opción.
Instalar y habilitar FirewallD #
-
Firewalld está instalado de forma predeterminada en CentOS 7, pero si no está instalado en su sistema, puede instalar el paquete escribiendo:
sudo yum install firewalld
-
El servicio Firewalld está deshabilitado de forma predeterminada. Puede comprobar el estado del cortafuegos con:
sudo firewall-cmd --state
Si acaba de instalar o nunca activó antes, el comando imprimirá
not running
. De lo contrario, verárunning
. -
Para iniciar el servicio FirewallD y habilitarlo en el arranque, escriba:
sudo systemctl start firewalld
sudo systemctl enable firewalld
Trabajando con Firewalld Zones #
Después de habilitar el servicio FirewallD por primera vez, public
La zona se establece como una 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(s) interfaz(es) de red, escriba:
sudo firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
El resultado anterior nos dice que ambas interfaces eth0
y eth1
están asignados a la zona pública.
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 configurada como predeterminada, utilizada tanto por eth0
y eth1
interfaces Además, se permiten las conexiones relacionadas con el 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 la Zona de una Interfaz #
Puede cambiar fácilmente la Zona de interfaz usando --zone
opción en combinación con --change-interface
opción. El siguiente comando asignará el eth1
interfaz a la zona 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
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 casa, debe ejecutar el siguiente comando:
sudo firewall-cmd --set-default-zone=home
Verifique los cambios con:
sudo firewall-cmd --get-default-zone
home
Apertura de un puerto o número de servicio
Con FirewallD puede permitir el tráfico de puertos específicos 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
Si desea mantener el puerto 80 abierto después de reiniciar, deberá escribir el mismo comando una vez más, pero esta vez con --permanent
opción:
sudo firewall-cmd --permanent --zone=public --add-service=http
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 cuando se agrega un servicio. Simplemente use --remove-service
en lugar de --add-service
opción:
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 está ejecutando una aplicación como Plex Media Server para la cual no existe un servicio apropiado disponible?
En situaciones como estas, tienes dos opciones. Puede abrir los puertos apropiados o definir un nuevo servicio FirewallD.
Por ejemplo, el servidor Plex escucha en el puerto 32400 y usa TCP, para abrir el puerto en la zona pública para la sesión actual use --add-port=
opción:
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 --list-ports
opción:
sudo firewall-cmd --zone=public --list-ports
32400/tcp
Para mantener el puerto 32400
abierto después de un reinicio, agregue la regla a la configuración permanente ejecutando el mismo comando usando --permanent
opción.
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=32400/tcp
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, podemos 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..
Puerto de reenvío 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 --add-masquerade
cambiar. Por ejemplo, para habilitar el enmascaramiento para external
tipo de zona:
sudo firewall-cmd --zone=external --add-masquerade
- Reenviar tráfico de un puerto a otro en el mismo servidor
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 otro servidor
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 el 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
Si desea que el reenvío sea permanente, simplemente agregue el --permanent
opción.
Creación de un conjunto de reglas con FirewallD #
En el siguiente ejemplo, le mostraremos cómo configurar su firewall si estuviera ejecutando un servidor web. Suponemos que su servidor tiene solo una interfaz eth0
y desea permitir el tráfico entrante solo en los puertos SSH, HTTP y HTTPS.
-
Cambia la zona por defecto a dmz
Usaremos la zona dmz (desmilitarizada) porque por defecto solo permite tráfico SSH. Para cambiar la zona por defecto a dmz y asignarla al
eth0
interfaz, ejecute los siguientes comandos:sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0
-
Abrir puertos HTTP y HTTPS:
Para abrir puertos HTTP y HTTPS, agregue reglas de servicio permanentes a la zona dmz:
sudo firewall-cmd --permanent --zone=dmz --add-service=http
sudo firewall-cmd --permanent --zone=dmz --add-service=https
Haga que los cambios sean efectivos inmediatamente recargando el firewall:
sudo firewall-cmd --reload
-
Verifica los cambios
Para comprobar los ajustes de configuración de la zona dmz, escriba:
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:
El resultado anterior nos dice que dmz es la zona predeterminada, se aplica a
eth0
Los puertos de interfaz y ssh (22) http (80) y https (443) están abiertos.