Cómo Configurar un Firewall Usando FirewallD en CentOS 7

Introducción

Firewalld es una solución de administración de cortafuegos disponible para muchas distribuciones Linux que actúa como una interfaz para el sistema de filtrado de paquetes iptables proporcionado por el núcleo Linux. En esta guía, explicaremos cómo configurar un firewall para su servidor y le mostraremos los conceptos básicos para administrar el firewall con la herramienta administrativa firewall-cmd (si prefiere usar iptables con CentOS, siga esta guía).

Nota: Existe la posibilidad de que esté trabajando con una versión más nueva de firewalld de la que estaba disponible en el momento de escribir este artículo, o que su servidor esté configurado de manera ligeramente diferente al servidor de ejemplo utilizado en esta guía. Por lo tanto, el comportamiento de algunos de los comandos explicados en esta guía puede variar dependiendo de su configuración específica.

Conceptos básicos en Firewalld

Antes de comenzar a hablar sobre cómo usar realmente la utilidad firewall-cmd para administrar la configuración de su firewall, debemos familiarizarnos con algunos conceptos básicos que la herramienta presenta.

Zones

El demonio firewalld administra grupos de reglas utilizando entidades llamadas «zones». 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é conectado su computadora. A las interfaces de red se les asigna una zona para dictar el comportamiento que debe permitir el firewall.

Para equipos que pueden moverse entre redes con frecuencia (como los portátiles), este tipo de flexibilidad proporciona un buen método para cambiar las reglas en función de su entorno. Es posible que tenga reglas estrictas que prohíban la mayor parte del tráfico cuando opera en una red WiFi pública, al tiempo que permite restricciones más relajadas cuando se conecta a su red doméstica. Para un servidor, estas zonas no son tan importantes de inmediato porque el entorno de red rara vez, si es que alguna vez, cambia.

Independientemente de lo dinámico que pueda ser su entorno de red, sigue siendo útil familiarizarse con la idea general detrás de cada una de las zonas predefinidas para firewalld. En orden de menos confianza a más confianza, las zonas predefinidas dentro de firewalld son:

  • soltar: El nivel más bajo de confianza. Todas las conexiones entrantes se eliminan sin respuesta y solo son posibles las conexiones salientes.bloque
  • : 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.
  • público: Representa redes públicas que no son de confianza. No confía en otros equipos, pero puede permitir conexiones entrantes seleccionadas caso por caso.
  • externo: Redes externas en caso de que utilice el firewall como puerta de enlace. Está configurado para enmascaramiento NAT para que su red interna permanezca privada pero accesible.
  • interno: 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 utiliza para equipos ubicados en una DMZ (equipos aislados que no tendrán acceso al resto de la red). Solo se permiten ciertas conexiones entrantes.
  • trabajo: Utilizado para máquinas de trabajo. Confíe en la mayoría de los ordenadores de la red. Algunos servicios más podrían ser permitidos.
  • hogar: Un entorno doméstico. Generalmente implica que confías en la mayoría de las otras computadoras y que se aceptarán algunos servicios más.
  • confianza: 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 más apropiadas.

Permanencia de reglas

En firewalld, las reglas se pueden designar como permanentes o inmediatas. Si se agrega o modifica una regla, de forma predeterminada, se modifica el comportamiento del firewall que se está ejecutando actualmente. En el siguiente arranque, las reglas antiguas se revertirán.

La mayoría de las operaciones firewall-cmd pueden tomar la marca --permanent para indicar que el firewall no efímero debe estar dirigido. Esto afectará al conjunto de reglas que se recarga al arrancar. Esta separación significa que puede probar reglas en su instancia de firewall activa y luego recargar si hay problemas. También puede usar la bandera --permanent para crear un conjunto completo de reglas a lo largo del tiempo que se aplicarán a la vez cuando se emita el comando recargar.

Instale y habilite el Cortafuegos para que se inicie en el arranque

firewalld está instalado de forma predeterminada en algunas distribuciones de Linux, incluidas muchas imágenes de CentOS 7. Sin embargo, puede ser necesario que instale firewalld usted mismo:

  • sudo yum install firewalld

Después de instalar firewalld, puede habilitar el servicio y reiniciar el servidor. Tenga en cuenta que habilitar firewalld hará que el servicio se inicie al arrancar. Es una práctica recomendada crear 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 reinicie, se abrirá el cortafuegos, las interfaces de red se colocarán en las zonas que haya configurado(o en la zona predeterminada configurada) y se aplicarán las reglas asociadas a las zonas a las interfaces asociadas.

Podemos verificar que el servicio se está ejecutando y es accesible escribiendo:

  • sudo firewall-cmd --state
output
running

Esto indica que nuestro firewall está funcionando con la configuración predeterminada.

Familiarizándonos con las Reglas de Firewall actuales

Antes de comenzar a hacer modificaciones, debemos familiarizarnos con el entorno y las reglas predeterminados proporcionados por el demonio.

Explorando los valores predeterminados

Podemos ver qué zona está seleccionada actualmente como predeterminada escribiendo:

  • firewall-cmd --get-default-zone
output
public

Dado que no hemos dado firewalld ningún comando para desviarse de la zona predeterminada, y ninguna de nuestras interfaces está configurada para vincularse a otra zona, esa zona también será la única zona «activa» (la zona que controla el tráfico de nuestras interfaces). Podemos verificarlo escribiendo:

  • firewall-cmd --get-active-zones
output
public interfaces: eth0 eth1

Aquí, podemos ver que nuestro servidor de ejemplo tiene dos interfaces de red controladas por el firewall (eth0 y 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 predeterminada de la zona escribiendo:

  • sudo firewall-cmd --list-all
output
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 a partir de 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 por 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 direcciones 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. También podemos encontrar información sobre otras zonas.

Para obtener una lista de las zonas disponibles, escriba:

  • firewall-cmd --get-zones
output
block dmz drop external home internal public trusted work

Podemos ver la configuración específica asociada a una zona incluyendo el parámetro --zone= en nuestro comando --list-all :

  • sudo firewall-cmd --zone=home --list-all
output
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 utilizando la opción --list-all-zones. Probablemente querrá canalizar la salida a un buscapersonas para una visualización más fácil:

  • sudo firewall-cmd --list-all-zones | less

Seleccionar zonas para sus interfaces

A menos que haya configurado sus interfaces de red de otra manera, cada interfaz se colocará en la zona predeterminada cuando se inicie el firewall.

Cambiar la zona de una interfaz

Puede hacer la 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á usar sudo.

Por ejemplo, podemos hacer la transición de nuestra interfaz eth0 a la zona de «inicio» escribiendo esto:

  • sudo firewall-cmd --zone=home --change-interface=eth0

output
success
Nota

Siempre que esté haciendo 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 «inicio», 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 se interrumpe la conexión mientras se usa una de estas zonas, es posible que no pueda volver a iniciar sesión.

Podemos verificar que esto fue exitoso preguntando por las zonas activas nuevamente:

  • firewall-cmd --get-active-zones
output
home interfaces: eth0public interfaces: eth1

Ajuste de la zona predeterminada

Si todas sus 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 predeterminada con el parámetro --set-default-zone=. Esto cambiará inmediatamente cualquier interfaz que haya caído en la zona predeterminada a la nueva:

  • sudo firewall-cmd --set-default-zone=home
output
success

Establecer reglas para sus Aplicaciones

La forma básica de definir excepciones de firewall para los servicios que desea poner a disposición es fácil. Repasaremos la idea básica aquí.

Agregar un Servicio a sus Zonas

El método más fácil es agregar los servicios o puertos que necesita a las zonas que está utilizando. Una vez más, puede obtener una lista de los servicios disponibles con la opción --get-services :

  • firewall-cmd --get-services
output
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 utilizando el parámetro --add-service=. La operación se dirigirá a la zona predeterminada o a cualquier zona especificada por el parámetro --zone=. De forma predeterminada, esto solo ajustará la sesión actual del firewall. Puede ajustar la configuración permanente del firewall incluyendo el indicador --permanent.

Por ejemplo, si estamos ejecutando un servidor web que sirve tráfico HTTP convencional, podemos permitir este tráfico para 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 se realizó correctamente utilizando las operaciones --list-all o --list-services :

  • sudo firewall-cmd --zone=public --list-services
output
dhcpv6-client http ssh

Una vez que haya probado 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
output
success

Puede verificar que esto se realizó correctamente agregando el indicador --permanent a la operación --list-services. Necesita usar sudo para cualquier operación --permanent :

  • sudo firewall-cmd --zone=public --permanent --list-services
output
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 Adecuado 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 desee permitir el acceso. Sin embargo, es probable que haya escenarios en los que estos servicios no se ajusten a sus requisitos.

En esta situación, tiene dos opciones.

Abrir un puerto para sus Zonas

La forma más fácil de agregar soporte para su aplicación específica es abrir los puertos que utiliza en las zonas apropiadas. 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 utilizando el parámetro --add-port=. Los protocolos pueden ser tcp o udp:

  • sudo firewall-cmd --zone=public --add-port=5000/tcp
output
success

Podemos verificar que esto fue exitoso usando la operación --list-ports :

  • sudo firewall-cmd --zone=public --list-ports
output
5000/tcp

También es posible especificar un rango secuencial de puertos separando el puerto inicial y final en el rango con un guión. 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 las pruebas, es probable que queramos agregarlas 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
output
successsuccess5000/tcp 4990-4999/udp

Definir un Servicio

Abrir puertos para sus zonas es fácil, pero puede ser difícil realizar un seguimiento de para qué sirve cada uno. Si alguna vez retira un servicio de su servidor, es posible que tenga dificultades para recordar qué puertos que se han abierto todavía se requieren. 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. El uso de 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) al directorio /etc/firewalld/services donde el firewall busca definiciones no estándar.

Por ejemplo, podríamos copiar la definición de servicio SSH para usarla para nuestra definición de servicio de» ejemplo » de esta manera. 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 empezar, 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 son en realidad metadatos. Querrá cambiar el nombre corto del servicio dentro de las etiquetas <short>. Este es un nombre legible por humanos 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 probablemente sea la definición de puerto donde identifica 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 de inserción pulsando 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>

Pulse ESC y, a continuación, introduzca :x para guardar y cerrar el archivo.

Vuelva a cargar su firewall para obtener acceso a su nuevo servicio:

  • sudo firewall-cmd --reload

Puede ver que ahora está entre la lista de servicios disponibles:

  • firewall-cmd --get-services
output
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 usar este servicio en sus zonas como lo haría normalmente.

Crear sus Propias zonas

Aunque 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 permanente del firewall. A continuación, puede recargar para llevar la configuración a su sesión en ejecución. Por ejemplo, podríamos crear las dos zonas que discutimos 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
output
block dmz drop external home internal privateDNS public publicweb trusted work

Como se indicó anteriormente, todavía no estarán disponibles en la instancia actual del firewall:

  • firewall-cmd --get-zones
output
block dmz drop external home internal public trusted work

Vuelva a cargar el firewall para incorporar estas nuevas zonas a la configuración activa:

  • sudo firewall-cmd --reload
  • firewall-cmd --get-zones
output
block dmz drop external home internal privateDNS public publicweb trusted work

Ahora, puede comenzar a asignar los servicios y puertos adecuados 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
output
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:

Asimismo, podemos añadir el servicio DNS a nuestra zona» privateDNS»:

  • sudo firewall-cmd --zone=privateDNS --add-service=dns
  • sudo firewall-cmd --zone=privateDNS --list-all
output
privateDNS interfaces: sources: services: dns ports: masquerade: no forward-ports: icmp-blocks: rich rules:

Luego 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, querrá agregar las mismas reglas a la configuración permanente. Puede 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 de forma permanente estas reglas, puede reiniciar la red y recargar el servicio de firewall:

  • sudo systemctl restart network
  • sudo systemctl reload firewalld

Validar que se asignaron las zonas correctas:

  • firewall-cmd --get-active-zones
output
privateDNS interfaces: eth1publicweb interfaces: eth0

Y validar que los servicios adecuados estén disponibles para ambas zonas:

  • sudo firewall-cmd --zone=publicweb --list-services
output
http https ssh
  • sudo firewall-cmd --zone=privateDNS --list-services
output
dns

¡Has configurado con éxito 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

Conclusión

Ahora debería tener una comprensión bastante buena de cómo administrar el servicio firewalld en su sistema CentOS para el uso diario.

El servicio firewalld le permite configurar reglas y conjuntos de reglas que se pueden mantener teniendo en cuenta su entorno de red. Le permite realizar una transición sin problemas entre diferentes políticas de firewall mediante el uso de zonas y ofrece 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Previous post Cefalu, Italia: Una guía completa de la Ciudad Costera Siciliana
Next post Ideas Para Cenas Misteriosas Con Elementos De Menú