Introducción a FirewallD en CentOS

Actualizado el 25 de agosto, 2016. Por BlueHosting.

FirewallD es un controlador frontend para la tabla iptables que se usa para implementar reglas de tráfico de red persistentes. Provee una línea de comando e interfaces gráficas y está disponible en los repositorios de la mayoría de las distribuciones Linux.

Trabajar con FirewallD tiene dos diferencias principales cuando se compara a trabajar directamente con iptables:

  1. FirewallD utiliza zonas y servicios en lugar de cadenas y reglas.
  2. FirewallD administra los grupos de reglas dinámicamente, permitiendo actualizaciones sin tener que romper las sesiones y conexiones.

Nota:
FirewallD es simplemente un contenedor de iptables que permite un manejo más sencillo que las reglas para iptables, y no es un remplazo de este último. Aunque los comandos de iptables pueden ser utilizados en FirewallD, se recomienda usar solo comandos FirewallD dentro de esta utilidad.

Esta guía presentará FirewallD, sus nociones con respecto a las zonas y servicios y le mostrará los pasos básicos de configuración.

Instalar y gestionar FirewallD

FirewallD está incluido por defecto en CentOS 7 y en Fedora 20+, pero viene desactivado. Controlarlo es igual que con otras unidades de systemd.

  1. Para iniciar el servicio y habilitar la ejecución de FirewallD al inicio del servidor:

    sudo systemctl start firewalld
    sudo systemctl enable firewalld
    

    Para detenerlo y deshabilitarlo:

    sudo systemctl stop firewalld
    sudo systemctl disable firewalld
    
  2. Verifique el estatus del firewall. La salida debe decirle si se está ejecutando o no (running o not running).

    sudo firewall-cmd --state
    
  3. Para ver el estatus del demonio FirewallD:

    sudo systemctl status firewalld
    

Salida de ejemplo:

    firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
       Active: active (running) since Wed 2015-09-02 18:03:22 UTC; 1min 12s ago
     Main PID: 11954 (firewalld)
       CGroup: /system.slice/firewalld.service
           └─11954 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
  1. Para volver a cargar una configuración de FirewallD:
    sudo firewall-cmd --reload
    

Configurar FirewallD

FirewallD está configurado a través de archivos XML. Con la excepción de configuraciones muy particulares, no tendrá que lidiar con los archivos XML ya que podrá usar en cambio firewall-cmd.

Los archivos de configuración están ubicados en dos directorios:

  • /usr/lib/FirewallD tiene las configuraciones predeterminadas como las zonas por defecto y los servicios comunes. Evite actualizarlos porque estos archivos serán sobrescritos cada vez que instala paquetes de actualización de firewalld.
  • /etc/firewalld tiene los archivos de configuración del sistema. Estos archivos sobrescribirán una configuración predeterminada.

Conjuntos de configuración

Firewalld utiliza dos conjuntos de configuración: en ejecución y permanente. Los cambios en la configuración en ejecución no son retenidos tras un reinicio del servidor o después de reiniciar FirewallD, mientras que los cambios permanentes no son aplicados a un sistema en ejecución.

Por defecto, los comandos firewall-cmd aplicados a la configuración en ejecución, pero que usan la bandera --permanent establecerán una configuración persistente. Para agregar y activar una regla permanente puede usar uno de estos dos métodos:

  1. Agregar la regla tanto al conjunto de configuración permanente como a la configuración en ejecución. Por ejemplo:

    sudo firewall-cmd --zone=public --add-service=http --permanent
    sudo firewall-cmd --zone=public --add-service=http
    
  2. Añadir la regla al conjunto permanente y volver a cargar FirewallD. Por ejemplo:

    sudo firewall-cmd --zone=public --add-service=http --permanent
    sudo firewall-cmd --reload
    

    Nota: El comando de recarga elimina cualquier configuración en ejecución y aplica la configuración permanente almacenada. Debido a que FirewallD administra el conjunto de reglas de forma dinámica, no se interrumpirán las conexiones y sesiones existentes.

Zonas de Firewall

Las zonas son conjuntos de reglas predefinidas para varios niveles de confianza que probablemente utilizaría en ubicaciones o escenarios comunes (ejemplos: en el hogar, en una red pública, en una red de confianza, etc). Las distintas zonas admiten distintos servicios de red y tipos de tráfico entrante mientras que niegan todo lo demás. Después de activar FirewallD por primera vez, Public o "pública" será su zona predeterminada.

Las zonas también pueden ser aplicadas a diferentes interfaces de red. Por ejemplo, con interfaces separadas tanto para una red interna como para el Internet, puede permitir DHCP en una zona interna pero solo HTTP y SSH en una zona externa. Cualquier interfaz que no esté establecida explícitamente en una zona especificada será añadida a la zona predeterminada.

Para ver la zona predeterminada ejecute:

sudo firewall-cmd --get-default-zone

Para cambiar la zona predeterminada puede utilizar:

sudo firewall-cmd --set-default-zone=internal

Para ver las zonas utilizadas por su(s) interfaz o interfaces de red:

sudo firewall-cmd --get-active-zones

Ejemplo de una salida:

public
  interfaces: eth0

Para obtener todas las configuraciones para una zona específica:

sudo firewall-cmd --zone=public --list-all

Ejemplo de salida:

public (default, active)
  interfaces: ens160
  sources:
  services: dhcpv6-client http ssh
  ports: 12345/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Para obtener todas las configuraciones para todas las zonas:

sudo firewall-cmd --list-all-zones

Salida de ejemplo:

block
  interfaces:
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

  ...

work
  interfaces:
  sources:
  services: dhcpv6-client ipp-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Trabajar con servicios

FirewallD puede admitir tráfico con base en reglas predefinidas según servicios de red específicos. Puede crear sus propias reglas personalizadas para un servicio y agregarlas a cualquier zona. Los archivos de configuración para los servicios soportados por defecto están ubicados en /usr/lib/firewalld/services y los archivos para los servicios creados por el usuario estarían en /etc/firewalld/services.

Para ver los servicios disponibles de forma predeterminada:

sudo firewall-cmd --get-services

Por ejemplo, para habilitar o deshabilitar el servicio HTTP:

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --remove-service=http --permanent

Permitir o denegar un puerto/protocolo arbitrario

Digamos que queremos permitir o denegar el tráfico TCP en el puerto 12345. Podríamos usar el siguiente comando:

sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent

Redirección de puertos

La siguiente regla de ejemplo redirige el tráfico del puerto 80 al puerto 12345 del mismo servidor:

sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345

Para redirigir el tráfico en un puerto a otro servidor:

  1. Active el enmascarado en la zona deseada:

    sudo firewall-cmd --zone=public --add-masquerade
    
  2. Añada la regla de redirección. En este ejemplo redirigimos el tráfico local en el puerto 80 al puerto 8080 de un servidor remoto ubicada en la dirección IP: 123.45.67.8

    sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.45.67.8
    

Para remover las reglas, sustituya --add con --remove. Por ejemplo:

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

Construir un conjunto de reglas con FirewallD

A continuación se provee un ejemplo en el cual se utiliza FirewallD para asignar reglas básicas a su servidor BlueHosting suponiendo que lo está utilizando como servidor web.

  1. Asigne la zona dmz como la zona predeterminada a la interfaz eth0. De las zonas ofrecidas, dmz (zona desmilitarizada) es una de las más apropiadas para comenzar con esta aplicación porque solo admite SSH e ICMP.

    sudo firewall-cmd --set-default-zone=dmz
    sudo firewall-cmd --zone=dmz --add-interface=eth0
    
  2. Agregue las reglas permanentes para el servicio de HTTP y HTTPS a la zona dms:

    sudo firewall-cmd --zone=dmz --add-service=http --permanent
    sudo firewall-cmd --zone=dmz --add-service=https --permanent
    
  3. Vuelva a cargar FirewallD para que las reglas surtan efecto inmediatamente:

    sudo firewall-cmd --reload
    
  4. Si ahora ejecuta el comando firewall-cmd --zone=dmz --list-all, la salida debería ser como sigue:

    dmz (default)
      interfaces: eth0
      sources:
      services: http https ssh
      ports:
      masquerade: no
      forward-ports:
      icmp-blocks:
      rich rules:
    

    Esto nos dice que la zona dmz es la zona predeterminada que aplica en la interfaz eth0, a todos los puertos y fuentes de la red. Se admite el tráfico entrante HTTP (puerto 80), HTTPS (puero 443) y SSH (puerto 22) y debido a que no hay restricciones en la versión del protocolo IP, esta regla aplicará tanto a IPv4 como a IPv6. No se permite el enmascaramiento y redirección de puertos. No tenemos bloques ICMP, así que el tráfico ICMP es totalmente admitido. Tampoco se emplean reglas en lenguaje rich. Todo el tráfico saliente es permitido.

Configuración avanzada

Los servicios y puertos están bien para una configuración básica, pero pueden ser limitantes en escenarios más avanzados. Las reglas rich y las interfaces directas le permiten agregan reglas de firewall completamente personalizadas a cualquier zona para cualquier puerto, protocolo, dirección o acción.

Reglas rich

La sintaxis de las reglas en el lenguaje rico (o rich) están documentadas en el manual FirewallD Rich Language. También puede ejecutar man firewalld.richlanguage desde su terminal para ver la información de ayuda del propio FirewallD. Use --add-rich-rule, --list-rich-rules y --remove-rich-rule con el comando firewall-cmd para administrar estas reglas.

Se presentan algunos ejemplos comunes:

Permitir todo el tráfico IPv4 del host 192.168.0.14:

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept'

Denegar el tráfico IPv4 sobre TCP del host 192.168.1.10 al puerto 22:

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject'

Permitir el tráfico IPv4 sobre TCP del host 10.1.0.3 al puerto 80 y redirigirlo localmente al puerto 6532:

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532'

Redirigir todo el tráfico IPv4 en los puertos 80 al puerto 8080 en el host 172.31.4.2 (el enmascaramiento debe estar activo en esta zona):

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2'

Para ver una lista de sus reglas rich actuales ejecute:

sudo firewall-cmd --list-rich-rules

Interfaz directa a iptables

Para un uso aún más avanzado, o para expertos en iptables, FirewallD proporciona una interfaz directa que permite pasarle comandos de iptables directamente. Las reglas de Interfaz Directa no son persistentes a menos que utilice el parámetro --permanent.

Para ver todas las cadenas o reglas personalizadas añadidas a Firewall use:

firewall-cmd --direct --get-all-chains
firewall-cmd --direct --get-all-rules

La discusión de los detalles de sintaxis de iptables se escapa del alcance de esta guía. Si quiere aprender más, visite nuestros tutoriales sobre iptables:

Recursos adicionales

Puede consultar los siguientes recursos en busca de información adicional con respecto a este tema. Aunque este material es provisto esperando que sea útil, tome en cuenta que no podemos dar fe de la actualidad o precisión de los contenidos externos.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...