FirewallD viniendo de iptables Blog elhacker.NET

Tabla de contenido

Cuando ocurrió la introducción de firewalld como firewall por defecto (Su introducción fue en 2011, pero creo que apareció primero en CentOS 7.), el autor continuó usando iptables. Había dos razones para ello. En primer lugar, la documentación disponible en ese momento para firewalld utilizaba reglas simplistas y no mostraba cómo firewalld aseguraba el servidor hasta el nivel de IP. En segundo lugar, el autor tenía más de una década de experiencia con iptables y era más fácil seguir usándolo en lugar de aprender firewalld.

 

Guía de iptables para firewalld – Introducción

De la página del manual: «firewalld proporciona un cortafuegos gestionado dinámicamente con soporte para zonas de red/cortafuegos para definir el nivel de confianza de las conexiones o interfaces de red. Soporta configuraciones de cortafuegos IPv4, IPv6, puentes Ethernet y una separación de opciones de configuración en tiempo de ejecución y permanente. También admite una interfaz para que los servicios o aplicaciones añadan reglas de cortafuegos directamente.»

  • firewalld es en realidad un front end de los subsistemas del Kernel netfilter y nftables en Linux.

Esta guía se centra en la aplicación de reglas de un cortafuegos iptables a un cortafuegos firewalld. Si está realmente al principio de su viaje por el cortafuegos, este documento podría ayudarle más. Considere leer ambos documentos para sacar el máximo provecho de firewalld. 

Requisitos previos y supuestos

  •     A lo largo de este documento, la suposición es que usted es el usuario root o tiene privilegios elevados con sudo.
  •     Un conocimiento pasajero de las reglas del cortafuegos, particularmente iptables o como mínimo, quieres aprender algo sobre firewalld.
  •     Que te sientas cómodo introduciendo comandos en la línea de comandos.
  •     Todos los ejemplos aquí tratan con IPs IPv4.

Para entender realmente firewalld, necesitas entender el uso de zonas. Las zonas proporcionan la granularidad de los conjuntos de reglas del cortafuegos.

firewalld tiene varias zonas incorporadas:

zona ejemplo uso

  • drop rechaza conexiones entrantes sin respuesta – sólo permite paquetes salientes.
  • block rechaza las conexiones entrantes con un mensaje icmp-host-prohibited para IPv4 e icmp6-adm-prohibited para IPv6 – sólo son posibles las conexiones de red iniciadas dentro de este sistema.
  • public para uso en áreas públicas – sólo acepta conexiones entrantes seleccionadas.
  • external acepta sólo conexiones entrantes seleccionadas para su uso en redes externas con enmascaramiento activado.
  • dmz sólo acepta conexiones entrantes seleccionadas para ordenadores de acceso público en su zona desmilitarizada con acceso limitado a su red interna.
  • work para ordenadores en áreas de trabajo – sólo acepta conexiones entrantes seleccionadas.
  • home para ordenadores en zonas home – sólo acepta conexiones entrantes seleccionadas
  • internal para el acceso de dispositivos a su red interna – sólo acepta conexiones entrantes seleccionadas.
  • trusted acepta todas las conexiones de red.

firewall-cmd es el programa de línea de comandos para gestionar el demonio firewalld. 

Para obtener una lista de las zonas existentes en su sistema, escriba

firewall-cmd –get-zones

Advertencia

Recuerde comprobar el estado de su cortafuegos, si el firewalld-cmd le devuelve un error, ya sea con

el comando firewall-cmd:

$ firewall-cmd –state
runing

el comando systemctl:

$ systemctl status firewalld

Al autor no le gustan la mayoría de estos nombres de zona. drop, block, public y trusted están perfectamente claros, pero algunos no son lo suficientemente buenos para una seguridad granular perfecta. Tome esta sección de reglas iptables como ejemplo:

iptables -A INPUT -p tcp -m tcp -s 192.168.1.122 –dport 22 -j ACCEPT

Aquí está permitiendo una única dirección IP para SSH (puerto 22) en el servidor. Si decides usar las zonas incorporadas, podrías usar «trusted» para esto. Primero, añade la IP a la zona y segundo, aplica la regla a la zona:

firewall-cmd –zone=trusted –add-source=192.168.1.122 –permanent
firewall-cmd –zone trusted –add-service=ssh –permanent

Pero, ¿y si en este servidor también tiene una intranet a la que sólo pueden acceder los bloques de IP asignados a su organización? ¿Aplicaría ahora la zona «interna» a esa regla? El autor prefiere crear una zona que se ocupe de las IP de los usuarios administradores (los que tienen permiso para utilizar secure-shell en el servidor).

Añadir zonas

Para añadir una zona, necesitas usar el firewall-cmd con el parámetro –new-zone. Vas a añadir «admin» (de administrativo) como zona:

firewall-cmd –new-zone=admin –permanent

Nota

El autor utiliza mucho el indicador –permanent. Para realizar pruebas, se recomienda añadir la regla sin el indicador –permanent, probarla y, si funciona como se espera, utilizar firewall-cmd –runtime-to-permanent para activar la regla antes de ejecutar firewall-cmd –reload. Si el riesgo es bajo (en otras palabras, no se bloqueará), puede añadir el indicador –permanent como se hace aquí.

Antes de utilizar esta zona, debe recargar el cortafuegos:

firewall-cmd –reload

Consejo

Nota sobre las zonas personalizadas: Si necesita añadir una zona que será una zona de confianza, pero que sólo contendrá una IP de origen o interfaz concreta y ningún protocolo o servicio, y la zona «de confianza» no le funciona, probablemente porque ya la ha utilizado para otra cosa, etc. Puedes añadir una zona personalizada para hacer esto, pero debes cambiar el objetivo de la zona de «default» a «ACCEPT» (también se puede usar REJECT o DROP, dependiendo de tus objetivos). A continuación se muestra un ejemplo utilizando una interfaz puente (lxdbr0 en este caso) en una máquina LXD.

Primero se añade la zona y se recarga para poder utilizarla:

 

firewall-cmd –new-zone=bridge –permanent
firewall-cmd –reload

A continuación, cambie el objetivo de la zona de «default» a «ACCEPT» (tenga en cuenta que la opción «–permanent» es necesaria para cambiar un objetivo), luego asigne la interfaz y vuelva a cargar:

firewall-cmd –zone=bridge –set-target=ACCEPT –permanent
firewall-cmd –zone=bridge –add-interface=lxdbr0 –permanent
firewall-cmd –reload

Esto indica al cortafuegos que

  •     está cambiando el destino de la zona a ACCEPT
  •     está añadiendo la interfaz de puente «lxdbr0» a la zona
  •     recarga el cortafuegos

Todo esto indica que acepta todo el tráfico de la interfaz de puente.

Listado de zonas

Antes de continuar, necesita examinar el proceso de listado de zonas. Obtendrá una única columna de producción en lugar de la salida tabular que proporciona iptables -L. Liste una zona con el comando firewall-cmd –zone=[nombre_zona] –list-all. Esto es lo que parece cuando se lista la zona «admin» recién creada:

firewall-cmd –zone=admin –list-all

admin
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Puede obtener una lista de las zonas activas de su sistema utilizando este comando:

firewall-cmd –get-active-zones

Importante: Zonas activas

Una zona sólo puede estar en estado activo si cumple una de estas dos condiciones:

  •     La zona está asignada a una interfaz de red.
  •     La zona tiene asignadas IP de origen o rangos de red.

Cómo eliminar una IP y un servicio de una zona

Si has seguido las instrucciones anteriores para añadir una IP a la zona «de confianza», ahora debes eliminarla. ¿Recuerdas nuestra nota sobre el uso del indicador –permanent? Este es un buen lugar para evitar usarlo mientras se hacen las pruebas adecuadas antes de activar esta regla:

firewall-cmd –zone=trusted –remove-source=192.168.1.122

También querrá eliminar el servicio SSH de la zona:

firewall-cmd –zone=trusted –remove-service ssh

A continuación, realice una prueba. Asegúrese de que tiene una forma de entrar a través de ssh desde otra zona antes de realizar los dos últimos pasos. (Vea la advertencia más abajo). Si no ha realizado ningún otro cambio, la zona «pública» seguirá teniendo SSH permitido, ya que está ahí por defecto.

Una vez que esté satisfecho, mueva las reglas de ejecución a permanente:

firewall-cmd –runtime-to-permanent

y recargue:

firewall-cmd –reload

Advertencia

Detén esta última instrucción ¡Si estás trabajando en un servidor remoto o VPS! NUNCA elimines el servicio ssh de un servidor remoto a menos que tengas otra forma de acceder al shell (ver más abajo).

Supongamos que se bloquea el acceso ssh a través del firewall. En ese caso, necesitará (en el peor de los casos) arreglar su servidor en persona, contactar con soporte, o posiblemente reinstalar el SO desde su panel de control (dependiendo de si el servidor es físico o virtual).

Usando una nueva zona – Añadiendo IPs administrativas

Ahora solo repite nuestros pasos originales usando la zona «admin»:

firewall-cmd –zone=admin –add-source=192.168.1.122
firewall-cmd –zone admin –add-service=ssh

Enumere la zona para asegurarse de que tiene el aspecto correcto y de que el servicio se ha añadido correctamente:

firewall-cmd –zone=admin –list-all

Pruebe su regla para asegurarse de que funciona. Para probarla:

    SSH como root, o su usuario con capacidad sudo, desde su IP de origen (arriba es 192.168.1.122) (use el usuario root porque va a ejecutar comandos en el host que lo requieren. Si usas tu usuario sudo, recuerda ejecutar sudo -s una vez conectado).
    Una vez conectado, ejecute tail /var/log/secure y obtendrá una salida similar a esta:

Feb 14 22:02:34 serverhostname sshd[9805]: Accepted password for root from 192.168.1.122 port 42854 ssh2
Feb 14 22:02:34 nombre_servidor sshd[9805]: pam_unix(sshd:session): sesión abierta para el usuario root por (uid=0)

Esto muestra que la IP de origen para nuestra conexión SSH es la misma IP que acabas de añadir a la zona «admin». Será seguro mover esta regla a permanente:

firewall-cmd –runtime-to-permanent

Cuando haya terminado de añadir reglas, recargue:

firewall-cmd –reload

Puede que necesite añadir otros servicios a la zona «admin», pero SSH es el más lógico por ahora.

Advertencia

Por defecto, la zona «pública» tiene habilitado el servicio ssh; esto puede ser un problema de seguridad. Una vez que tengas tu zona administrativa creada, asignada a ssh, y probada, puedes quitar el servicio de la zona pública.

Si tienes más de una IP administrativa que necesitas añadir (bastante probable), simplemente añádela a las fuentes de la zona. En este caso, estás añadiendo una IP a la zona «admin»:

firewall-cmd –zone=admin –add-source=192.168.1.151 –permanent

Nota

Ten en cuenta que si estás trabajando en un servidor remoto o VPS, y tienes una conexión a internet que no siempre usa la misma IP, puede que quieras abrir tu servicio ssh a un rango de direcciones IP usadas por tu proveedor de internet o región geográfica. Esto, de nuevo, es para que no se bloquee por su propio firewall.

Muchos ISP cobran extra por direcciones IP dedicadas, si es que las ofrecen, así que es una preocupación real.

Los ejemplos de aquí asumen que estás usando IPs en tu propia red privada para acceder a un servidor que también es local.

Reglas ICMP

Examine otra línea en nuestro cortafuegos iptables que desea emular en firewalld – la regla ICMP:

iptables -A INPUT -p icmp -m icmp –icmp-type 8 -s 192.168.1.136 -j ACCEPT

Para los novatos entre nosotros, ICMP es un protocolo de transferencia de datos diseñado para informar de errores. Le informa cuando existen problemas para conectarse a una máquina.

En realidad, probablemente dejaremos ICMP abierto a todas nuestras IPs locales (en este caso 192.168.1.0/24). Nuestras zonas «public» y «admin» tendrán ICMP activado por defecto, así que lo primero que hay que hacer para limitar ICMP a esa única dirección de red es bloquear estas peticiones en «public» y «admin» .

De nuevo, esto es para propósitos de demostración. Definitivamente querrás que tus usuarios administrativos tengan ICMP a tus servidores, y probablemente todavía lo tendrán, porque son miembros de la IP de la red LAN.

Para desactivar ICMP en la zona «pública»:

firewall-cmd –zone=public –add-icmp-block={echo-request,echo-reply} –permanent

Haga lo mismo en nuestra zona «trusted»:

firewall-cmd –zone=trusted –add-icmp-block={echo-request,echo-reply} –permanent

He aquí una introducción a algo nuevo: Las llaves «{}» nos permiten especificar más de un parámetro. Como siempre, después de hacer cambios como este, necesita recargar:

firewall-cmd –reload

Probando mediante ping desde una IP no permitida nos dará:

ping 192.168.1.104
PING 192.168.1.104 (192.168.1.104) 56(84) bytes de datos.
Desde 192.168.1.104 icmp_seq=1 Paquete filtrado
Desde 192.168.1.104 icmp_seq=2 Paquete filtrado
Desde 192.168.1.104 icmp_seq=3 Paquete filtrado

Puertos del servidor web

Aquí está el script iptables para permitir públicamente http y https, los protocolos que necesitará para servir páginas web:

iptables -A INPUT -p tcp -m tcp –dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp –dport 443 -j ACCEPT

Y aquí está el equivalente firewalld que probablemente has visto muchas veces antes:

firewall-cmd –zone=public –add-service=http –add-service=https –permanent

Eso está bien, pero ¿qué pasa si estás ejecutando, por ejemplo, un servicio Nextcloud en http/https y sólo quieres que tu red de confianza tenga acceso a él? No es raro. Este tipo de cosas ocurren todo el tiempo, y simplemente permitir públicamente el tráfico, sin tener en cuenta quién realmente necesita acceso, es un riesgo de seguridad enorme.

En realidad no puedes utilizar la información de la zona «de confianza» que has utilizado anteriormente. Eso era para pruebas. Tienes que asumir que tienes al menos nuestro bloque IP LAN añadido a «trusted». Eso se verá así:

firewall-cmd –zone=trusted –add-source=192.168.1.0/24 –permanent

Añada los servicios a la zona:

firewall-cmd –zone=trusted –add-service=http –add-service=https –permanent

Si había añadido esos servicios a la zona «pública», debe eliminarlos:

firewall-cmd –zone=public –remove-service=http –remove-service=https –permanent

Vuelva a cargar:

firewall-cmd –reload

Puertos FTP

Volviendo al script iptables. Tiene las siguientes reglas relacionadas con FTP:

iptables -A INPUT -p tcp -m tcp –dport 20-21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp –dport 7000-7500 -j ACCEPT

Esta parte del script se ocupa de los puertos FTP estándar (20 y 21) y de algunos puertos pasivos adicionales. Los servidores FTP como VSFTPD a menudo necesitan este tipo de reglas. Generalmente, este tipo de regla estará en un servidor web de cara al público, y está ahí para permitir conexiones ftp de sus clientes.

No existe ningún servicio ftp-data (puerto 20) en firewalld. Los puertos 7000 a 7500 listados aquí son para conexiones FTP pasivas, y de nuevo, estos no existen como servicio en firewalld. Puede cambiar a SFTP, lo que simplifica las reglas de puertos permitidos y es probablemente la forma recomendada.

Esto demuestra la conversión de un conjunto de reglas iptables a firewalld. Para evitar todos estos problemas, puede hacer lo siguiente.

Primero, añada el servicio ftp a la zona que también aloja los servicios web. Esto probablemente será «public» en este ejemplo:

firewall-cmd –zone=public –add-service=ftp –permanent

Añada el puerto ftp-data:

firewall-cmd –zone=public –add-port=20/tcp –permanent

Añadir los puertos de conexión pasiva:

firewall-cmd –zone=public –add-port=7000-7500/tcp –permanent

A continuación, recargue:

firewall-cmd –reload

Puertos de bases de datos

Si estás tratando con un servidor web, es casi seguro que estés tratando con una base de datos. Maneje el acceso a esa base de datos con el mismo cuidado que aplica a otros servicios. Si no se necesita acceso desde todo el mundo, aplica tu regla a algo que no sea «público». La otra consideración es, ¿necesitas ofrecer acceso en absoluto? Una vez más, esto probablemente dependa de su entorno. Donde el autor trabajaba anteriormente, se utilizaba un servidor web alojado para nuestros clientes. Muchos tenían sitios WordPress, y ninguno de ellos realmente necesitaba o solicitaba acceso a cualquier front-end para MariaDB. Si un cliente necesitaba más acceso, nuestra solución era la creación de un contenedor LXD para su servidor web, construyendo un cortafuegos de la manera que el cliente quería, y dejándoles responsables de lo que sucedía en ese servidor. Aún así, si tu servidor es público, puede que necesites ofrecer acceso a phpmyadmin o algún otro front-end a MariaDB. En este caso, necesitas preocuparte por los requisitos de contraseña para la base de datos y establecer el usuario de la base de datos a algo distinto de los valores por defecto. Para el autor, la longitud de la contraseña es la consideración principal al crear contraseñas.

La seguridad de las contraseñas es una discusión para otro documento que trate de eso. La suposición es que usted tiene una buena política de contraseñas para el acceso a su base de datos y la línea iptables en su cortafuegos que trata con la base de datos se ve así:

iptables -A INPUT -p tcp -m tcp –dport=3600 -j ACCEPT

En este caso, añada el servicio a la zona «pública» para una conversión de firewalld:

firewall-cmd –zone=public –add-service=mysql –permanent

Consideraciones sobre Postgresql

Postgresql utiliza su puerto de servicio. He aquí un ejemplo de regla de tablas IP:

iptables -A INPUT -p tcp -m tcp –dport 5432 -s 192.168.1.0/24 -j ACCEPT

Aunque es menos común en servidores web de cara al público, podría ser más común como recurso interno. Se aplican las mismas consideraciones de seguridad. Si tienes un servidor en tu red de confianza (192.168.1.0/24 en nuestro ejemplo), puede que no quieras o necesites dar acceso a todo el mundo en esa red. Postgresql tiene una lista de acceso disponible para los derechos de acceso más granular. Nuestra regla firewalld sería algo como esto

firewall-cmd –zone=trusted –add-service=postgresql

Puertos DNS

Tener un servidor DNS privado o público también significa tomar precauciones en las reglas que escribes para proteger esos servicios. Si tienes un servidor DNS privado, con reglas iptables que tuvieran este aspecto (ten en cuenta que la mayoría de los servicios DNS son UDP, en lugar de TCP, pero no siempre):

iptables -A INPUT -p udp -m udp -s 192.168.1.0/24 –dport 53 -j ACCEPT

entonces permitir sólo su zona «de confianza» será correcto. Ya ha configurado las fuentes de su zona «de confianza». Todo lo que necesita hacer es añadir el servicio a la zona:

firewall-cmd –zone=confiable –add-service=dns

Con un servidor DNS público, sólo tiene que añadir el mismo servicio a la zona «pública»:

firewall-cmd –zone=public –add-service=dns

Más sobre las reglas

Nota

Puede listar todas las reglas si lo desea, listando las reglas nftables. Es feo, y no lo recomiendo, pero si realmente debe hacerlo, puede hacer una lista de reglas nft.

Una cosa que no se ha hecho mucho hasta ahora es listar las reglas. Esto es algo que se puede hacer por zona. Aquí hay ejemplos con las zonas que ha utilizado. Tenga en cuenta que puede listar la zona antes de mover una regla permanente también, lo cual es una buena idea.

firewall-cmd –list-all –zone=trusted

Aquí puedes ver lo que has aplicado arriba:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.1.0/24
  services: dns
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks: echo-reply echo-request
  rich rules:

Esto es aplicable a cualquier zona. Por ejemplo, aquí está la zona «pública» hasta ahora:

firewall-cmd –list-all –zone=public

public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: cockpit dhcpv6-client ftp http https
  ports: 20/tcp 7000-7500/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks: echo-reply echo-request
  rich rules:

Observe que ha eliminado el acceso SSH de los servicios y bloqueado ICMP «echo-reply» y «echo-request».

En su zona «admin» hasta ahora se ve así:

firewall-cmd –list-all –zone=admin

  admin (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.1.122 192.168.1.151
  services: ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Reglas relacionadas establecidas

Parece que firewalld maneja la siguiente regla iptables internamente por defecto:

iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

Interfaces

Por defecto, firewalld escuchará en todas las interfaces disponibles. En un servidor bare-metal con muchas interfaces que dan a muchas puertas de enlace de red, será necesario que asigne una interfaz a una zona basándose en la red a la que da.

Las interfaces no se añaden en nuestros ejemplos, porque el laboratorio utiliza LXD para las pruebas. En este caso, sólo tienes una interfaz con la que trabajar. Digamos que tu zona «pública» necesita configuración para usar el puerto Ethernet enp3s0 ya que este puerto tiene la IP pública en él, y digamos que tus zonas «trusted» y «admin» están en la interfaz LAN, que podría ser enp3s1.

Para asignar estas zonas a la interfaz apropiada, utiliza los siguientes comandos:

firewall-cmd –zone=public –change-interface=enp3s0 –permanent
firewall-cmd –zone=trusted –change-interface=enp3s1 –permanent
firewall-cmd –zone=admin –change-interface=enp3s1 –permanent
firewall-cmd –reload

Comandos comunes de firewall-cmd

Ya ha utilizado algunos comandos. Aquí hay algunos comandos más comunes y lo que hacen:
Comando Resultado

  • firewall-cmd –list-all-zones similar a firewall-cmd –list-all –zone=[zone] excepto que lista todas las zonas y sus contenidos.
  • firewall-cmd –get-default-zone muestra la zona por defecto, que es «public» a menos que la cambie.
  • firewall-cmd –list-services –zone=[zone] muestra todos los servicios habilitados para la zona.
  • firewall-cmd –list-ports –zone=[zona] muestra todos los puertos abiertos en la zona.
  • firewall-cmd –get-active-zones muestra las zonas activas en el sistema, sus interfaces activas, servicios y puertos.
  • firewall-cmd –get-services muestra todos los servicios disponibles que se pueden utilizar.
  • firewall-cmd –runtime-to-permanent si ha introducido muchas reglas sin la opción –permanent, haga esto antes de recargar.

Uso básico

Comandos de servicio del sistema

firewalld se ejecuta como un servicio en su máquina. Se inicia cuando la máquina lo hace, o debería hacerlo. Si por alguna razón firewalld no está ya habilitado en su máquina, puede hacerlo con un simple comando

systemctl enable –now firewalld

La opción –now inicia el servicio tan pronto como es habilitado y le permite saltarse el paso systemctl start firewalld.

Como con todos los servicios en  Linux, puede comprobar si el cortafuegos se está ejecutando con:

systemctl status firewalld

Para detenerlo completamente

systemctl stop firewalld

Y para dar al servicio un reinicio

systemctl restart firewalld

Comandos básicos de configuración y gestión de firewalld

firewalld se configura con el comando firewall-cmd. Puede, por ejemplo, comprobar el estado de firewalld con

firewall-cmd –state

Después de cada cambio permanente en su cortafuegos, necesitará recargarlo para ver los cambios. Puede dar a las configuraciones del cortafuegos un «reinicio suave» con:

firewall-cmd –reload

Nota

Si recargas las configuraciones que no se han hecho permanentes, desaparecerán.

Puede ver todas sus configuraciones y ajustes a la vez con:

firewall-cmd –list-all

Este comando mostrará algo parecido a esto:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp9s0
  sources:
  services: ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Guardar cambios

Por defecto, todos los cambios en la configuración de firewalld son temporales. Si reinicia todo el servicio firewalld, o reinicia su máquina, ninguno de sus cambios en el cortafuegos se guardará a menos que haga una de dos cosas muy específicas.

La mejor práctica es probar los cambios individualmente, recargando la configuración del cortafuegos sobre la marcha. Si accidentalmente te bloqueas en algo, puedes reiniciar el servicio (o la máquina), y todos esos cambios desaparecerán, como se mencionó anteriormente.

Pero una vez que tengas una configuración que funcione, puedes guardar tus cambios permanentemente con

firewall-cmd –runtime-to-permanent

Sin embargo, si estás absolutamente seguro de lo que estás haciendo, y sólo quieres añadir la regla y seguir con tu vida, puedes añadir la bandera –permanent a cualquier comando de configuración:

firewall-cmd –permanent [el resto del comando].

Gestión de Zonas

Antes de nada, necesitamos explicar las zonas. Las zonas son una característica que le permite definir diferentes conjuntos de reglas para diferentes situaciones. Las zonas son una parte importante de firewalld, por lo que vale la pena entender cómo funcionan.

Si tu máquina tiene múltiples formas de conectarse a diferentes redes (por ejemplo, Ethernet y Wi-Fi), puedes decidir que una conexión sea más confiable que la otra. Puedes poner tu conexión Ethernet en la zona de «confianza» si sólo está conectada a una red local que tú has construido, y poner la Wi-Fi (que puede estar conectada a Internet) en la zona de «confianza». 

Nota

Una zona sólo puede estar en estado activo si tiene una de estas dos condiciones:

  •     La zona está asignada a una interfaz de red
  •     La zona tiene asignadas IPs de origen o rangos de red (más sobre esto más adelante)

Las zonas por defecto incluyen lo siguiente (he tomado esta explicación de la guía de DigitalOcean sobre firewalld, que también deberías leer):

  •     drop: El nivel más bajo de confianza. Todas las conexiones entrantes se descartan sin respuesta y sólo son posibles las conexiones salientes.
  •     block (bloquear): Similar al anterior, pero en lugar de simplemente descartar conexiones, las peticiones entrantes se rechazan con un mensaje icmp-host-prohibited o icmp6-adm-prohibited.
  •     public: Representa redes públicas en las que no se confía. No se confía en otros equipos, pero se pueden permitir conexiones entrantes seleccionadas caso por caso.
  •     external: Redes externas en el caso de que esté utilizando el cortafuegos como puerta de enlace. Está configurado para enmascaramiento NAT para que su red interna siga siendo privada pero accesible.
  •     internal: El otro lado de la zona externa, utilizada para la parte interna de una pasarela. Los ordenadores son bastante fiables y se dispone de algunos servicios adicionales.
  •     dmz: Se utiliza para los ordenadores situados en una DMZ (ordenadores aislados que no tendrán acceso al resto de su red). Sólo se permiten ciertas conexiones entrantes.
  •     work: Se utiliza para los equipos de trabajo. Confía en la mayoría de los ordenadores de la red. Pueden permitirse algunos servicios más.
  •     home: En un entorno doméstico. Generalmente implica que se confía en la mayoría de los otros ordenadores y que se aceptarán algunos servicios más.
  • trusted: Confía en todas las máquinas de la red. Es la más abierta de las opciones disponibles y debe utilizarse con moderación.

Vale, algunas de estas explicaciones son complicadas, pero sinceramente… El principiante medio puede arreglárselas con entender «trusted», «home» y «public», y cuándo usar cada una.

Comandos de gestión de zona

Para ver su zona por defecto, ejecute

firewall-cmd –get-default-zone

Para ver qué zonas están activas y haciendo cosas, ejecute

firewall-cmd –get-active-zones

Si está ejecutando  Linux en un VPS, es probable que se haya establecido una configuración básica para usted. Específicamente, deberías poder acceder al servidor vía SSH, y la interfaz de red ya habrá sido añadida a la zona «public».

Para cambiar la zona por defecto

firewall-cmd –set-default-zone [tu-zona]

Para añadir una interfaz de red a una zona

firewall-cmd –zone=[su-zona] –add-interface=[su-dispositivo-de-red]

Para cambiar la zona de una interfaz de red

firewall-cmd –zone=[su-zona] –change-interface=[su-dispositivo-de-red]

Para eliminar completamente una interfaz de una zona

firewall-cmd –zone=[su-zona] –remove-interface=[su-dispositivo-de-red].

Para crear su propia zona nueva con un conjunto de reglas completamente personalizado y comprobar que se ha añadido correctamente:

firewall-cmd –new-zone=[su-nueva-zona].
firewall-cmd –get-zones

Gestión de puertos

Para los no iniciados, los puertos (en este contexto) son sólo puntos finales virtuales donde los ordenadores se conectan para enviar información de un lado a otro. Piensa en ellos como en los puertos físicos Ethernet o USB de tu ordenador, pero invisibles, y puedes tener hasta 65.535 de ellos funcionando todos a la vez.

Yo no lo haría, pero se puede.

Un número identifica cada puerto. Algunos puertos están reservados para servicios específicos. Por ejemplo, si alguna vez has trabajado con servidores web para crear un sitio web, puede que estés familiarizado con el puerto 80 y el puerto 443. Esos puertos permiten la transmisión de datos de páginas web.

En concreto, el puerto 80 permite transferir datos a través del Protocolo de Transferencia de Hipertexto (HTTP), y el puerto 443 está reservado para datos del Protocolo de Transferencia de Hipertexto Seguro (HTTPS).

El puerto 22 está reservado para el protocolo Secure Shell (SSH), que permite conectarse y gestionar otras máquinas a través de la línea de comandos (consulte nuestra breve guía sobre el tema). Un servidor remoto nuevo puede que sólo permita conexiones a través del puerto 22 para SSH, y nada más.

Otros ejemplos incluyen FTP (puertos 20 y 21), SSH (puerto 22), y muchos más. También puedes configurar puertos personalizados para que los utilicen las nuevas aplicaciones que instales y que no tengan un número estándar.

Para cosas como SSH, HTTP/S, FTP, y más, en realidad se recomienda añadirlos a tu zona firewall como servicios, y no como números de puerto. Te mostraré cómo funciona a continuación. Dicho esto, todavía necesitas saber cómo abrir puertos manualmente.

Comandos de gestión de puertos

Para esta sección, usaré –zone=public… y el puerto 9001 como ejemplo aleatorio, porque es más de 9.000.

Para ver todos los puertos abiertos

firewall-cmd –list-ports

Para añadir un puerto a tu zona firewall (abriéndolo así para su uso), simplemente ejecuta este comando:

firewall-cmd –zone=public –add-port=9001/tcp

Para eliminar un puerto, simplemente invierta el comando con un cambio de una sola palabra:

firewall-cmd –zone=public –remove-port=9001/tcp

Gestionando Servicios¶

Como se puede imaginar, los servicios son programas bastante estandarizados que se ejecutan en su ordenador. firewalld está configurado para que pueda ser utilizado para proporcionar acceso a los servicios comunes que se ejecutan en el host fácilmente.

Esta es la forma preferida de abrir los puertos para estos servicios comunes, y muchos más:

    HTTP y HTTPS: para servidores web
    FTP: para mover archivos de un lado a otro (a la vieja usanza)
    SSH: Para controlar máquinas remotas y mover archivos de un lado a otro a la nueva manera
    Samba: Para compartir archivos con máquinas Windows.

Recuerda, SSH es lo que usas para entrar en tu servidor. A menos que tengas otra forma de acceder al servidor físico, o a su shell (por ejemplo, a través de un panel de control proporcionado por el host), eliminar el servicio SSH te bloqueará permanentemente. Tendrás que contactar con el soporte para recuperar el acceso o reinstalar el sistema operativo por completo.

Comandos de gestión de servicios

Para ver una lista de todos los servicios disponibles que podrías añadir a tu cortafuegos, ejecuta

firewall-cmd –get-services

Para ver qué servicios tiene activos actualmente en su cortafuegos, utilice:

firewall-cmd –list-services

Para abrir un servicio en su cortafuegos (por ejemplo, HTTP en la zona pública), utilice:

firewall-cmd –zone=public –add-service=http

Para eliminar/cerrar un servicio en su cortafuegos, sólo tiene que volver a cambiar una palabra

firewall-cmd –zone=public –remove-service=http

Restringir el acceso

Digamos que tienes un servidor y no quieres hacerlo público. Si quieres definir quién puede acceder a él vía SSH o ver algunas páginas web/apps privadas, puedes hacerlo.

Hay un par de métodos para lograr esto. En primer lugar, para un servidor más cerrado, puede elegir una de las zonas más restrictivas, asignar su dispositivo de red a la misma, añadir el servicio SSH a la misma como se muestra arriba, y luego poner en la lista blanca su propia dirección IP pública de esta manera:

firewall-cmd –permanent –zone=trusted –add-source=192.168.1.0 [<inserte su IP aquí]

Puede convertirlo en un rango de direcciones IP añadiendo un número mayor al final de la siguiente manera:

firewall-cmd –permanent –zone=trusted –add-source=192.168.1.0/24 [<inserte su IP aquí]

De nuevo, sólo tiene que cambiar –add-source por –remove-source para invertir el proceso.

Sin embargo, tienes algunas opciones si estás administrando un servidor remoto con un sitio web que necesita ser público y aún así sólo quieres abrir SSH para una dirección IP o un pequeño rango de ellas. Ambos ejemplos asignan la única interfaz de red a la zona pública.

En primer lugar, puede utilizar una «regla rica» para su zona pública, y sería algo como esto:

# firewall-cmd –permanent –zone=public –add-rich-rule=’rule family=»ipv4″ source address=»192.168.1.0/24″ service name=»ssh» accept’

Una vez que la regla enriquecida esté en su lugar, no haga que las reglas sean permanentes todavía. En primer lugar, elimina el servicio SSH de la configuración de la zona pública y prueba la conexión para asegurarte de que puedes acceder al servidor. 

your@server ~# firewall-cmd –list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: wlp3s0
  sources:
  services: cockpit dhcpv6-client
  ports: 80/tcp 443/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family=»ipv4″ source address=»192.168.1.0/24″ service name=»ssh» accept

En segundo lugar, puede utilizar dos zonas diferentes a la vez. Si tu interfaz está vinculada a la zona pública, puedes activar una segunda zona (la zona «de confianza», por ejemplo) añadiendo una IP de origen o un rango de IP, como se muestra arriba. A continuación, añade el servicio SSH a la zona de confianza y elimínalo de la zona pública.

Cuando haya terminado, la salida debería parecerse a esto:

your@server ~# firewall-cmd –list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: wlp3s0
  sources:
  services: cockpit dhcpv6-client
  ports: 80/tcp 443/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
your@server ~# firewall-cmd –list-all –zone=trusted
trusted (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.0.0/24
  services: ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Si se bloquea, reinicie el servidor (la mayoría de los paneles de control VPS tienen una opción para esto) y vuelva a intentarlo.

Fuentes:

https://docs.rockylinux.org/guides/security/firewalld/

INFORMACION DEL PUBLICADOR
Kamal Majaiti
Kamal Majaiti
Administrador de sistemas e informático por vocación.
COMPARTELO EN REDES
Publica un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.