Muy bien continuando con la serie de posts relacionados al estudio de para dar la certificación rhcsa vamos a hablar de firewalld qué es el programa que viene a ser el administrador de las reglas de firewall de la familia red hat, asi como esta ufw para ubuntu y derivados.
Originalmente firewalld administra el subsistema de clasificación de paquetes Netfilter. Netfilter hace un tiempo se esta dejando de utilizar debido a un nuevo subsistema de clasificación de paquetes que se llama nftables el cual trae varias mejoras en cuanto a la administración de las reglas, cambios en la sintaxis y forma de ejecución.
A nivel de configuración de los comandos propios de firewall-cmd (el front-end de firewalld), independiente de este nuevo subsistema de clasificación de paquetes, no se ve afectado ya que los comandos se mantienen igual, internamente firewall-cmd se encarga de de mantener la sintaxis correcta.
Firewalld funciona administrando distintas zonas y cada zona tiene sus permisos, nosotros podemos asignar la zona ya sea por la IP origen o por la interfaz desde donde nos llega el paquete, firewalld asigna el paquete a la zona verificando primero si es que la ip origen está asociada a una zona y sino se asocia a la zona de la interfaz desde dónde llega el paquete, en caso de que por algún motivo la interfaz no este asociada a alguna zona y la IP origen tampoco corresponda a ninguna zona, firewalld lo que hace es asociar el paquete a la zona por defecto. Más adelante vamos a verlo en detalle
las zonas configuradas en firewalld son:
Nombre de la zona | Descripción |
Trusted | Permite todo el tráfico entrante |
Home | Bloquea todo el tráfico entrante a no ser que sea un paquete de respuesta (o sea que nosotros hayamos iniciado una comunicación con un servidor remoto y el servidor remoto nos está respondiendo) y permite los siguientes servicios: ssh Mdns IPP-client Samba-client y dhcpv6-Client |
Work | Bloquea todo el tráfico entrante a no ser que sea una respuesta permite los siguientes servicios ssh, IPP-client y dhcpv6-client |
internal | Tiene exactamente los mismos atributos que la zona home bloquear todo el tráfico entrante a no ser que sea una respuesta |
public | Al igual que las anteriores bloquea todo a no ser que sea una respuesta y sólo permite ssh y dhcpv6-client esta es la zona por defecto |
external | Esta zona es interesante ya que al igual que las anteriores bloquea todo entrante excepto ssh y además todo el tráfico que pasa por esa interfaz se natea |
dmz | Lo mismo que la zona external pero sin nat y se permite sólo ssh como la zona extena |
block | No se permite ningún servicio y sólo se permite el tráfico de respuesta aquí se envía un paquete avisándole al equipo remoto que su intento de conexión fue bloqueado |
Drop | Es lo mismo que block pero aquí no informa al extremo remoto que se bloqueó su solicitud |
Una pequeña observación sobre los servicios que mencioné anteriormente voy a dejar una tabla con los servicios que protocolo el utilizan y que puerto
Servicio | Puerto | Protocolo |
SSH | 22 | TCP |
DHCPV6-Client | 546 | UDP FE80::/64 |
IPP-Client | 631 | UDP |
Samba-Client | 137 – 138 | UDP |
MDNS | 5353 | udp 224.0.0.251 o ff02:fb |
Si queremos tener un listado completo de los servicios que está configurado en firewalld podemos utilizar
firewall-cmd --get-services
Observación importante que tenemos que hacer antes de ver la sintaxis de firewall-cmd es que siempre cuando configuramos una regla tenemos que usar la opcion –permanent para que los cambios sean persistentes y luego hay que usar firewall-cmd –reload para que se apliquen están nuevas configuraciones, de no usar este comando la regla quedará en runtime y se perderá después de un reinicio de la máquina
Para configurar firewalld tenemos 3 opciones aunque solo veremos una, la linea de comandos
- Mediante la edición directa de archivos de configuración en /etc/firewalld/
- Mediante la interfaz gráfica de la consola web
- Mediante la herramienta de línea de comandos firewall-cmd.
Voy a dejar tipo indice algunos comandos que creo serían los que más utilizariamos:
- comandos referentes a las zonas
- comandos referentes a los servicios
conocer/cambiar la zona por defecto actual
Como les comente anteriormente, si la IP origen de un paquete entrante o la interfaz desde donde llega no esta asociado a ninguna zona se irá a la zona por defecto, esto será en la mayoría de los casos si no tocamos mucho firewalld, y para saber cual es la zona que esta configurada por defecto bastara con ejecutar
firewall-cmd --get-default-zone
si no hemos tocado nada la zona sera «public»
Ahora, para cambiar esta zona por defecto usamos este comando
sudo firewall-cmd --set-default-zone=<nombre zona>
y con eso cambiamos la zona por defecto
conocer todas las zonas configuradas/activas
Aquí tenemos 3 comandos que nos pueden ayudar a saber que zonas están configuradas, cuales están activas, y las descripciones de cada zona las veremos en este orden que es del comando que entregue menos detalle al mas detallado
firewall-cmd --get-zones
Este comando nos presentara un listado de los nombres de todas las zonas configuradas en firewalld, en mi caso aparece una zona extra que no esta en el listado principal que se llama «libvirt», seguramente por que instale qemu
El siguiente comando nos va a mostrar un listado de todas las zonas que estén asociadas a alguna interfaz y a que interfaz esta asociada
firewall-cmd --get-active-zones
Esto nos puede ayudar a la hora de hacer thoubleshooting ya que si configuramos un servicio en la zona A pero la interfaz esta asociada a la zona B nunca se va a tener la conectividad necesaria
El tercer y ultimo comando que vamos a ver en este apartado es el que mayor cantidad de información nos entrega ya que nos dira:
- interfaces asociadas a la zona
- origen (IP) asociada a la zona
- servicios permitidos en la zona
- puertos asociados a la zona
- si esta habilitado el nat o no
- si existen reglas enriquecidas y cuales son
- reenvio de puertos
sudo firewall-cmd --list-all-zones
la salida del comando puede ser larga dependiendo de cuantas zonas tengamos en el equipo, si queremos ver una zona especifica hay que añadir la opcion –zone=<nombre de la zona>
sudo firewall-cmd --list-all-zones --zone=dmz
agregar/eliminar un rango IP de origen a una zona
Como les comente firewalld discrimina por IP origen o por la interfaz, el siguiente comando nos ayudará a declarar estos orígenes
sudo firewall-cmd --add-source=<CIDR>
con ese comando se agregará el origen a la zona por defecto, si queremos declararlo en una zona distinta hay que agregar la opcion –zone=<zona> de esta forma
sudo firewall-cmd --add-source=<CIDR> --zone=<nombre de la zona>
Para eliminar un rango IP, para este y todos los comando siguientes basta con cambiar el add por remove, con la opción opcional –zone
sudo firewall-cmd --remove-source=<CIDR> --zone=<nombre de la zona>
agregar/eliminar una interfaz de una zona
Toca el segundo criterio de selección de zona de firewalld (y el mas usado) la asignación de una interfaz a una zona, para eso la interfaz no tiene que estar asociada a ninguna zona y ejecutamos el siguiente comando
sudo firewall-cmd --add-interface=<nombre inf> --zone=<zona>
al igual que en los casos anteriores, si no agregamos la opción –zone la interfaz será agregada a la zona por defecto
Para eliminar una asociación de interfaz, para este y todos los comando siguientes basta con cambiar el add por remove, con la opción –zone opcional
sudo firewall-cmd --remove-interface=<nombre inf> --zone=<zona>
Ya dejando de lado el apartado de la gestión de las zonas vamos a ver como podemos permitir conexiones entrantes a servicios o puertos no estándar
agregar/eliminar servicios a una zona especifica
lo primero será agregar servicios, tenemos un listado completo de todos los servicios que tiene pre configurado firewalld con el comando
firewall-cmd --get-services
si bien este comando solo muestra los nombres y no entra en detalles de que puertos permite o no, podemos usar la opción –info-service=<nombre del servicio> para conocer esta información (este comando no esta en el libro oficial).
Un pequeño tip que me gustaría dar en este apartado es la existencia del archivo /etc/services donde esta una lista extensa de todos (o muchos al menos) los servicios estándar, el protocolo que usan y su respectivo puerto
Para agregar un nuevo servicio a una zona tenemos el siguiente comando
sudo firewall-cmd --add-service=<nombre del servicio> --zone=<nombre zona>
como siempre, si eliminamos la opción –zone el servicio se agregara a la zona por defecto
Para eliminar un servicio, para este y todos los comando siguientes basta con cambiar el add por remove, con la opción –zone opcional
sudo firewall-cmd --remove-service=<nombre del servicio> --zone=<nombre zona>
agregar/eliminar puertos a una zona especifica
Ahora toca el turno para agregar puertos, aquí tenemos total libertad para elegir que puerto y que protocolo habilitar y esta información quedará tal cual cuando consultemos la zona, independiente si el socket puerto/protocolo exista dentro de los servicios ya configurados en firewalld
sudo firewall-cmd --add-port=<puerto>/<protocolo>
y como en todos los casos anteriores para eliminar un puerto, para este y todos los comando siguientes basta con cambiar el add por remove, con la opción –zone opcional
sudo firewall-cmd --remove-port=<puerto>/<protocolo>
Y esos son los comandos que aparecen en la documentación oficial para la certificación RHCSA, existen otros comandos que pueden ser útiles que dejare a continuación
Agregar la opcion de NAT a una zona especifica
sudo firewall-cmd --add-masquerade --zone=<zona>
Cambiar una serie de reglas en runtime a permanent
sudo firewall-cmd --runtime-to-permanent
Conocer los puertos y protocolos asociados a un servicio (ya había dado este comando más arriba)
sudo firewall-cmd --info-service=<nombre del servicio>
Activar el modo pánico
El modo pánico niega todos los paquetes entrantes o salientes de la zona donde se activa y esta opción solo se puede usar en runtime
sudo firewall-cmd --panic-on
Para desactivarla usamos
sudo firewall-cmd --panic-off
Con esto termino este post, dejando un link a la página de fedora donde pueden encontrar mayor información acerca de firewalld