Firewalld es una solución de administración de firewall disponible para muchas distribuciones de Linux que actúa como una interfaz para el sistema de filtrado de paquetes iptables proporcionado por el kernel de Linux.
En esta guía, veremos cómo configurar un servidor de seguridad para su servidor y le mostraremos los aspectos básicos de la administración del servidor de seguridad con la herramienta firewall-cmd administrativa (si prefiere usar iptables CentOS, siga este tutorial )
Conceptos básicos en Firewalld
Antes de comenzar a hablar sobre cómo utilizar realmente la utilidad firewall-cmd para administrar la configuración de su firewall, debemos familiarizarnos con algunos conceptos básicos que presenta la herramienta.
Zonas
El firewalld administra grupos de reglas usando entidades llamadas «zonas». Las zonas son básicamente conjuntos de reglas que dictan qué tráfico se debe permitir, dependiendo del nivel de confianza que tenga en las redes a las que está conectada su computadora. A las interfaces de red se les asigna una zona para dictar el comportamiento que debería permitir el firewall.
Para las computadoras que pueden moverse entre redes con frecuencia (como las computadoras portátiles), este tipo de flexibilidad proporciona un buen método para cambiar sus reglas dependiendo de su entorno. Es posible que tenga reglas estrictas que prohíban la mayoría del tráfico cuando opera en una red WiFi pública, mientras que permite restricciones más relajadas cuando está conectado a su red doméstica. Para un servidor, estas zonas no son tan importantes porque el entorno de la red rara vez cambia.
Independientemente de cuán dinámico pueda ser su entorno de red, sigue siendo útil estar familiarizado con la idea general detrás de cada una de las zonas predefinidas firewalld. En orden, desde las menos confiables a las más confiables , las zonas predefinidas dentro firewalld son:
- drop: El nivel más bajo de confianza. Todas las conexiones entrantes se eliminan sin respuesta y solo son posibles las conexiones salientes.
- block: similar al anterior, pero en lugar de simplemente eliminar conexiones, las solicitudes entrantes se rechazan con un mensaje icmp-host-prohibited o icmp6-adm-prohibited.
- public: Representa redes públicas, no confiables. No confía en otras computadoras, pero puede permitir las conexiones entrantes seleccionadas caso por caso.
- external: redes externas en caso de que esté utilizando el firewall como su puerta de enlace. Está configurado para el enmascaramiento de NAT para que su red interna permanezca privada pero accesible.
- internal: el otro lado de la zona externa, utilizado para la parte interna de una puerta de enlace. Las computadoras son bastante confiables y algunos servicios adicionales están disponibles.
- dmz: se usa para computadoras ubicadas en una DMZ (computadoras aisladas que no tendrán acceso al resto de su red). Sólo se permiten ciertas conexiones entrantes.
- work: Utilizado para maquinas de trabajo. Confíe en la mayoría de las computadoras en la red. Se podrían permitir algunos servicios más.
- home: En general, implica que confía en la mayoría de las otras computadoras y que se aceptarán algunos servicios más.
- trusted: confíe en todas las máquinas de la red. La más abierta de las opciones disponibles y debe usarse con moderación.
Para usar el firewall, podemos crear reglas y alterar las propiedades de nuestras zonas y luego asignar nuestras interfaces de red a las zonas que sean más apropiadas.
Permanencia de la regla
En firewalld, las reglas pueden ser designadas como permanentes o inmediatas. Si se agrega o modifica una regla, de manera predeterminada, se modifica el comportamiento del firewall que se ejecuta actualmente. En el siguiente arranque, las reglas antiguas serán revertidas.
La mayoría de las operaciones firewall-cmd pueden tomar el indicador –permanent para indicar que el firewall no efímero debe ser el objetivo. Esto afectará el conjunto de reglas que se vuelve a cargar en el arranque. Esta separación significa que puede probar reglas en su instancia de firewall activa y luego volver a cargar si hay problemas. También puede usar el indicador –permanent para crear un conjunto completo de reglas a lo largo del tiempo que se aplicarán todas a la vez cuando se emita el comando de recarga.
Instale y habilite su firewall para que se inicie en el arranque
firewalld se instala de forma predeterminada en algunas distribuciones de Linux, incluidas muchas imágenes de CentOS Sin embargo, puede ser necesario que instale firewalld usted mismo:
$ sudo yum install firewalld
Después de la instalación firewalld, puede habilitar el servicio y reiniciar su servidor. Tenga en cuenta que habilitar firewalld hará que el servicio se inicie en el arranque. Se recomienda crear las reglas de firewall y aprovechar la oportunidad para probarlas antes de configurar este comportamiento para evitar posibles problemas.
$ sudo yum install firewalld
Después de la instalación firewalld, puede habilitar el servicio y reiniciar su servidor. Tenga en cuenta que habilitar firewalld hará que el servicio se inicie en el arranque. Se recomienda crear las reglas de firewall y aprovechar la oportunidad para probarlas antes de configurar este comportamiento para evitar posibles problemas.
$ sudo systemctl enable firewalld $ sudo reboot
Cuando el servidor se reinicia, su firewall debe activarse, las interfaces de red deben ubicarse en las zonas que configuró (o volver a la zona predeterminada configurada), y las reglas asociadas con las zonas se aplicarán a las redes asociadas. interfaces
Podemos verificar que el servicio se esté ejecutando y sea accesible al escribir:
$ sudo firewall-cmd --state
running
Esto indica que nuestro firewall está funcionando con la configuración predeterminada.
Familiarizarse con las reglas actuales del cortafuegos
Antes de comenzar a realizar modificaciones, debemos familiarizarnos con el entorno predeterminado y las reglas proporcionadas por el daemon.
Explorando los valores predeterminados
Podemos ver qué zona está actualmente seleccionada como predeterminada al escribir:
firewall-cmd --get-default-zone
public
Dado que no hemos dado firewalld ningún comando para desviarnos de la zona predeterminada y ninguna de nuestras interfaces está configurada para enlazarse a otra zona, esa zona también será la única zona «activa» (la zona que controla el tráfico para nuestras interfaces). ). Podemos verificar que al escribir:
firewall-cmd --get-active-zones
public interfaces: eth0 eth1
Aquí, podemos ver que nuestro servidor de ejemplo tiene dos interfaces de red controladas por el firewall ( eth0y eth1). Ambos se están gestionando actualmente de acuerdo con las reglas definidas para la zona pública.
¿Cómo sabemos qué reglas están asociadas con la zona pública? Podemos imprimir la configuración de la zona predeterminada escribiendo:
$ sudo firewall-cmd --list-all
public (default, 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:
Podemos decir por la salida que esta zona es tanto la predeterminada como la activa y que las interfaces eth0 y eth1 están asociadas con esta zona (ya sabíamos todo esto de nuestras consultas anteriores). Sin embargo, también podemos ver que esta zona permite las operaciones normales asociadas con un cliente DHCP (para asignación de dirección IP) y SSH (para administración remota).
Explorando Zonas Alternativas
Ahora tenemos una buena idea sobre la configuración de la zona predeterminada y activa. Podemos encontrar información sobre otras zonas también.
Para obtener una lista de las zonas disponibles, escriba:
firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Podemos ver la configuración específica asociada con una zona al incluir el parámetro –zone= en nuestro comando –list-all:
$ sudo firewall-cmd --zone=home --list-all
home
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Puede generar todas las definiciones de zona usando la opción –list-all-zones. Probablemente querrá canalizar la salida en un buscapersonas para facilitar la visualización:
$ sudo firewall-cmd --list-all-zones | less
Seleccionando Zonas para sus Interfaces
A menos que haya configurado sus interfaces de red de lo contrario, cada interfaz se colocará en la zona predeterminada cuando se inicie el firewall.
Cambiando la zona de una interfaz
Puede hacer una transición de una interfaz entre zonas durante una sesión utilizando el parámetro –zone= en combinación con el parámetro –change-interface=. Al igual que con todos los comandos que modifican el firewall, deberá usarlo $ sudo.
Por ejemplo, podemos hacer una transición de nuestra interfaz eth0 a la zona «principal» al escribir esto:
$ sudo firewall-cmd --zone=home --change-interface=eth0
success
Nota
Cuando esté realizando la transición de una interfaz a una nueva zona, tenga en cuenta que probablemente esté modificando los servicios que estarán operativos. Por ejemplo, aquí nos estamos moviendo a la zona de «casa», que tiene SSH disponible. Esto significa que nuestra conexión no debe caer. Algunas otras zonas no tienen SSH habilitado de forma predeterminada y si su conexión se interrumpe mientras usa una de estas zonas, es posible que no pueda volver a iniciar sesión.
Podemos verificar que esto fue exitoso solicitando nuevamente las zonas activas:
firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1
Ajuste de la zona predeterminada
Si todas las interfaces pueden manejarse mejor en una sola zona, probablemente sea más fácil seleccionar la mejor zona predeterminada y luego usarla para su configuración.
Puede cambiar la zona por defecto con el parámetro –set-default-zone=. Esto cambiará de inmediato cualquier interfaz que haya caído en el valor predeterminado a la nueva zona:
$ sudo firewall-cmd --set-default-zone=home
success
Establecer reglas para sus aplicaciones
La forma básica de definir excepciones de cortafuegos para los servicios que desea que estén disponibles es fácil. Repasaremos la idea básica aquí.
Agregando un servicio a sus zonas
El método más sencillo es agregar los servicios o puertos que necesita a las zonas que está usando. Nuevamente, puede obtener una lista de los servicios disponibles con la opción –get-services:
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
Nota
Puede obtener más detalles sobre cada uno de estos servicios mirando su archivo .xml asociado dentro del directorio /usr/lib/firewalld/services. Por ejemplo, el servicio SSH se define así: /usr/lib/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?><service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/></service>
Puede habilitar un servicio para una zona usando el parámetro –add-service=. La operación se dirigirá a la zona predeterminada o cualquier zona especificada por el parámetro –zone=. De forma predeterminada, esto solo ajustará la sesión de firewall actual. Puede ajustar la configuración del firewall permanente incluyendo la bandera –permanent.
Por ejemplo, si estamos ejecutando un servidor web que sirve tráfico HTTP convencional, podemos permitir este tráfico para las interfaces en nuestra zona «pública» para esta sesión escribiendo:
$ sudo firewall-cmd --zone=public --add-service=http
Puede omitir –zone= si desea modificar la zona predeterminada. Podemos verificar que la operación fue exitosa usando las operaciones –list-all o –list-services:
$ sudo firewall-cmd --zone=public --list-services
dhcpv6-client http ssh
Una vez que haya comprobado que todo funciona como debería, es probable que desee modificar las reglas permanentes del firewall para que su servicio siga estando disponible después de un reinicio. Podemos hacer que nuestro cambio de zona «pública» sea permanente escribiendo:
sudo firewall-cmd --zone=public --permanent --add-service=http
success
Puede verificar que esto fue exitoso agregando la bandera –permanent a la operación –list-services . Necesitas utilizar $ sudo para cualquier operación –permanent:
$ sudo firewall-cmd --zone=public --permanent --list-services
dhcpv6-client http ssh
Su zona «pública» ahora permitirá el tráfico web HTTP en el puerto 80. Si su servidor web está configurado para usar SSL / TLS, también querrá agregar el servicio https. Podemos agregar eso a la sesión actual y al conjunto de reglas permanentes escribiendo:
$ sudo firewall-cmd --zone=public --add-service=https
$ sudo firewall-cmd --zone=public --permanent --add-service=https
¿Qué pasa si no hay un servicio apropiado disponible?
Los servicios de firewall que se incluyen con la instalación de firewalld representan muchos de los requisitos más comunes para las aplicaciones a las que desea permitir el acceso. Sin embargo, es probable que haya situaciones en las que estos servicios no se ajusten a sus requisitos.
En esta situación, tienes dos opciones.
Abriendo un puerto para tus zonas
La forma más fácil de agregar soporte para su aplicación específica es abrir los puertos que utiliza en la (s) zona (s) apropiada (s). Esto es tan fácil como especificar el puerto o el rango de puertos, y el protocolo asociado para los puertos que necesita abrir.
Por ejemplo, si nuestra aplicación se ejecuta en el puerto 5000 y usa TCP, podríamos agregar esto a la zona «pública» para esta sesión usando el parámetro –add-port=. Los protocolos pueden ser tcp o udp:
$ sudo firewall-cmd --zone=public --add-port=5000/tcp
success
Podemos verificar que esto fue exitoso usando la operación –list-ports:
$ sudo firewall-cmd --zone=public --list-ports
5000/tcp
También es posible especificar un rango secuencial de puertos al separar el puerto de inicio y final en el rango con un guion. Por ejemplo, si nuestra aplicación utiliza los puertos UDP 4990 a 4999, podríamos abrirlos en «público» escribiendo:
$ sudo firewall-cmd --zone=public --add-port=4990-4999/udp
Después de la prueba, es probable que queramos agregarlos al firewall permanente. Puedes hacerlo escribiendo:
$ sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
$ sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
$ sudo firewall-cmd --zone=public --permanent --list-ports
success
success
5000/tcp 4990-4999/udp
Definiendo un servicio
Abrir puertos para sus zonas es fácil, pero puede ser difícil hacer un seguimiento de para qué sirve cada una. Si alguna vez retira un servicio en su servidor, puede tener dificultades para recordar qué puertos que se han abierto todavía son necesarios. Para evitar esta situación, es posible definir un servicio.
Los servicios son simplemente colecciones de puertos con un nombre y una descripción asociados. Usar servicios es más fácil de administrar que los puertos, pero requiere un poco de trabajo inicial. La forma más fácil de comenzar es copiar un script existente (que se encuentra en /usr/lib/firewalld/services) en el directorio /etc/firewalld/services donde el firewall busca definiciones no estándar.
Por ejemplo, podríamos copiar la definición de servicio SSH para usar en nuestra definición de servicio de «ejemplo» como esta. El nombre de archivo menos el sufijo .xml dictará el nombre del servicio dentro de la lista de servicios de firewall:
$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
Ahora, puede ajustar la definición que se encuentra en el archivo que copió:
$ sudo vi /etc/firewalld/services/example.xml
Para comenzar, el archivo contendrá la definición SSH que copió: /etc/firewalld/services/example.xml
<?xml version="1.0" encoding="utf-8"?><service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/></service>
La mayoría de esta definición es en realidad metadatos. Querrá cambiar el nombre corto para el servicio dentro de las etiquetas <short>. Este es un nombre legible para su servicio. También debe agregar una descripción para tener más información si alguna vez necesita auditar el servicio. La única configuración que necesita hacer que realmente afecte la funcionalidad del servicio será probablemente la definición de puerto donde identifique el número de puerto y el protocolo que desea abrir. Esto se puede especificar varias veces.
Para nuestro servicio de «ejemplo», imagine que necesitamos abrir el puerto 7777 para TCP y 8888 para UDP. Al ingresar al modo INSERT presionando i
, podemos modificar la definición existente con algo como esto: /etc/firewalld/services/example.xml
<?xml version="1.0" encoding="utf-8"?><service> <short>Example Service</short> <description>This is just an example service. It probably shouldn't be used on a real system.</description> <port protocol="tcp" port="7777"/> <port protocol="udp" port="8888"/></service>
Presione ESC
, luego ingrese :x
para guardar y cerrar el archivo.
Vuelva a cargar su firewall para obtener acceso a su nuevo servicio:
$ sudo firewall-cmd --reload
Puedes ver que ahora está entre la lista de servicios disponibles:
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch example freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
Ahora puede utilizar este servicio en sus zonas como lo haría normalmente.
Creando tus propias zonas
Si bien las zonas predefinidas probablemente serán más que suficientes para la mayoría de los usuarios, puede ser útil definir sus propias zonas que sean más descriptivas de su función.
Por ejemplo, es posible que desee crear una zona para su servidor web, llamada «publicweb». Sin embargo, es posible que desee configurar otra zona para el servicio DNS que proporciona en su red privada. Es posible que desee una zona llamada «privateDNS» para eso.
Al agregar una zona, debe agregarla a la configuración de firewall permanente. Luego puede volver a cargar para llevar la configuración a su sesión en ejecución. Por ejemplo, podríamos crear las dos zonas que analizamos anteriormente escribiendo:
$ sudo firewall-cmd --permanent --new-zone=publicweb
$ sudo firewall-cmd --permanent --new-zone=privateDNS
Puede verificar que están presentes en su configuración permanente escribiendo:
$ sudo firewall-cmd --permanent --get-zones
block dmz drop external home internal privateDNS public publicweb trusted work
Como se indicó anteriormente, estos no estarán disponibles aún en la instancia actual del firewall:
firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Vuelva a cargar el firewall para traer estas nuevas zonas a la configuración activa:
$ sudo firewall-cmd --reload
firewall-cmd --get
block dmz drop external home internal privateDNS public publicweb trusted work
Ahora, puede comenzar a asignar los servicios y puertos apropiados a sus zonas. Por lo general, es una buena idea ajustar la instancia activa y luego transferir esos cambios a la configuración permanente después de la prueba. Por ejemplo, para la zona «publicweb», es posible que desee agregar los servicios SSH, HTTP y HTTPS:
$ sudo firewall-cmd --zone=publicweb --add-service=ssh
$ sudo firewall-cmd --zone=publicweb --add-service=http
$ sudo firewall-cmd --zone=publicweb --add-service=https
$ sudo firewall-cmd --zone=publicweb --list-all
publicweb
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Del mismo modo, podemos agregar el servicio DNS a nuestra zona «privateDNS»:
$ sudo firewall-cmd --zone=privateDNS --add-service=dns
$ sudo firewall-cmd --zone=privateDNS --list-all
privateDNS
interfaces:
sources:
services: dns
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Entonces podríamos cambiar nuestras interfaces a estas nuevas zonas para probarlas:
$ sudo firewall-cmd --zone=publicweb --change-interface=eth0
$ sudo firewall-cmd --zone=privateDNS --change-interface=eth1
En este punto, tiene la oportunidad de probar su configuración. Si estos valores funcionan para usted, deseará agregar las mismas reglas a la configuración permanente. Puedes hacerlo volviendo a aplicar las reglas con la bandera –permanent:
$ sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
$ sudo firewall-cmd --zone=publicweb --permanent --add-service=http
$ sudo firewall-cmd --zone=publicweb --permanent --add-service=https
$ sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns
Después de aplicar estas reglas de forma permanente, puede reiniciar su red y recargar su servicio de firewall:
$ sudo systemctl restart network
$ sudo systemctl reload firewalld
Valide que las zonas correctas hayan sido asignadas:
firewall-cmd --get-active-zones
privateDNS
interfaces: eth1
publicweb
interfaces: eth0
Y valide que los servicios apropiados estén disponibles para ambas zonas:
$ sudo firewall-cmd --zone=publicweb --list-services
http https ssh
$ sudo firewall-cmd --zone=privateDNS --list-services
dns
¡Has configurado exitosamente tus propias zonas! Si desea que una de estas zonas sea la predeterminada para otras interfaces, recuerde configurar ese comportamiento con el parámetro –set-default-zone=:
$ sudo firewall-cmd --set-default-zone=publicweb
Notas Finales
Ahora debe tener un buen conocimiento de cómo administrar el servicio firewalld en su sistema CentOS para el uso diario.
El servicio firewalld le permite configurar reglas de mantenimiento y conjuntos de reglas que tienen en cuenta su entorno de red. Le permite hacer una transición perfecta entre diferentes políticas de firewall mediante el uso de zonas y brinda a los administradores la capacidad de abstraer la administración de puertos en definiciones de servicio más amigables.
Adquirir un conocimiento práctico de este sistema le permitirá aprovechar la flexibilidad y la potencia que proporciona esta herramienta