09 – 15 cosas sobre el cortafuegos UFW en Ubuntu que debes saber

Este tutorial mostrará cómo usar el cortafuegos UFW (Uncomplicated FireWall) Ubuntu con algunos ejemplos reales. La gestión del cortafuegos es una habilidad básica que todo administrador de sistemas necesita conocer. Este artículo pretende que el lector se inicie en el uso de UFW, pero no explora los entresijos del mismo.

UFW es un front-end para iptables, para hacer la gestión de un firewall Netfilter más fácil, de ahí el nombre “Uncomplicated Firewall”. Proporciona una interfaz de línea de comandos con una sintaxis similar a la de Packet Filter de OpenBSD. Es especialmente adecuado como cortafuegos basado en el host. UFW es el front-end de iptables recomendado en las distros de Linux basadas en Debian y suele estar preinstalado en estas distros. Por defecto, UFW establece reglas de cortafuegos tanto para direcciones IPv4 como IPv6.

cortafuegos UFW

Desactivación de otros servicios de restauración de Iptables

Como probablemente sepa, las reglas del cortafuegos iptables se borran cuando el sistema operativo se apaga y el propio programa iptables no restaura las reglas del cortafuegos. UFW por defecto restaura las reglas del firewall después de reiniciar el sistema. Antes de usar UFW, es importante que compruebe si hay otro servicio de restauración de iptables en su sistema. Si hay dos servicios de restauración, entrarán en conflicto entre sí, lo que suele provocar que las aplicaciones web no estén disponibles tras el reinicio del sistema.

Si estabas utilizando directamente el cortafuegos iptables y ahora quieres cambiar al cortafuegos UFW, sólo tiene que desactivar el servicio de restauración de iptables. Iptables-persistent es un servicio de restauración de iptables muy conocido en Debian/Ubuntu. Puede comprobar si se está ejecutando con el siguiente comando.

systemctl status iptables-persistent

Si se está ejecutando, puedes detenerlo y desactivarlo.

sudo systemctl stop iptables-persistent

sudo systemctl disable iptables-persistent

O puedes eliminarlo de tu sistema.

sudo apt remove iptables-persistent

Si has configurado tu servidor de correo con iRedMail, asegúrese de ejecutar el siguiente comando para comprobar si se está ejecutando el servicio iptables.

systemctl status iptables

Este servicio de iptables se suministra con iRedMail para restaurar las reglas de firewall de iptables. Si se está ejecutando, puede detenerlo y desactivarlo.

sudo systemctl stop iptables

sudo systemctl disable iptables

Ahora vamos a aprender a utilizar UFW.

Introducción al cortafuegos UFW en Ubuntu

UFW suele estar preinstalado en Ubuntu, aunque siempre puedes ejecutar el siguiente comando para instalarlo.

sudo apt install ufw

En la instalación, el cortafuegos ufw está desactivado. Puede comprobar el estado del cortafuegos UFW con:

sudo ufw status

UFW viene con una política de entrada por defecto de denegar, una política de reenvío por defecto de denegar, y una política de salida por defecto de permitir, con un seguimiento de estado para nuevas conexiones para las conexiones entrantes y reenviadas. Antes de habilitar el cortafuegos UFW, necesitas saber qué puertos están abiertos en la dirección IP pública de su servidor, lo cual puede obtenerse con la ayuda de nmap (Network Mapper).

Instala nmap en su servidorUbuntu y escanea los puertos abiertos en la dirección IP pública.

sudo apt install nmap

sudo nmap 12.34.56.78

Sustituye 12.34.56.78 por la dirección IP pública real de tu servidor. Como puedes ver en la captura de pantalla de abajo, hay varios puertos abiertos en mi servidor.

También hay puertos abiertos que escuchan sólo en localhost, que se pueden obtener ejecutando sudo nmap localhost, pero no necesitamos preocuparnos por ellos.

Después de obtener los puertos TCP y UDP abiertos en su servidor, necesitas decidir qué puertos deben ser permitidos para aceptar conexiones entrantes. Si hay un servidor openSSH en ejecución, entonces debes permitir siempre el puerto TCP 22 antes de activar el cortafuegos UFW. Esto se consigue mediante el siguiente comando.

sudo ufw allow 22/tcp

o

sudo ufw allow ssh

Probablemente quieras permitir el tráfico HTTP y HTTPS, así que ejecute el siguiente comando para permitir la conexión entrante en los puertos TCP 80 y 443.

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

Si ejecutas un servidor de correo electrónico, debes permitir los puertos TCP 25 (SMTP), 587(envío), 143(imap) y 993 (imaps).

sudo ufw allow 25/tcp

sudo ufw allow 587/tcp

sudo ufw allow 143/tcp

sudo ufw allow 993/tcp

Si quieres que tu usuario pueda utilizar el protocolo POP3, tienes que permitir el puerto TCP 110 (POP3) y 995 (POP3S).

sudo ufw allow 110/tcp

sudo ufw allow 995/tcp

Abrir varios puertos a la vez

sudo ufw allow 80,443,25,587,465,143,993/tcp

Activación de UFW

Después de haber configurado los puertos permitidos en el cortafuegos UFW, necesitas habilitar UFW. Pero antes de hacer eso, se recomienda habilitar el registro con el siguiente comando para que pueda entender mejor si su firewall está funcionando correctamente.

sudo ufw logging on

El nivel de registro por defecto es “bajo”. El archivo de registro es /var/log/ufw.log. Yo suelo utilizar el nivel de registro “medio”.

sudo ufw logging medium

Ahora activa el UFW.

sudo ufw enable

Nota: Si has utilizado previamente el cortafuegos iptables directamente, esas reglas del cortafuegos iptables se desharán una vez que se active el cortafuegos UFW.

Comprobar el estado

sudo ufw status

Para mostrar más información, ejecute

sudo ufw status verbose

Además, activa el servicio UFW systemd, para que se inicie automáticamente al arrancar el sistema.

Cómo eliminar una regla del cortafuegos

En primer lugar, debe obtener el número de referencia de la regla de firewall que desea eliminar con el siguiente comando.

sudo ufw status numbered

A continuación, puedes eliminar una regla, por ejemplo, la 8ª regla.

sudo ufw delete 8

Ten en cuenta que el número de referencia cambiará después de eliminar una regla, por lo que debes ejecutar sudo ufw status numbered de nuevo para eliminar otra regla.

Restablecer UFW

Si has cometido un error, puedes desactivar y restablecer el firewall a los valores predeterminados de instalación.

sudo ufw reset

Esto es especialmente útil para los principiantes.

Perfil de la aplicación UFW

Muchos programas de servidor vienen con perfiles UFW. Puedes listar todos los perfiles de aplicación con:

sudo ufw app list

Podemos mostrar información sobre un perfil de aplicación específico, por ejemplo, el perfil “Nginx Full”.

sudo ufw app info "Nginx Full"

Podemos ver que los puertos utilizados por este perfil son los puertos TCP 80 y 443. Si habilitas este perfil de aplicación con el siguiente comando, los puertos TCP 80 y 443 estarán permitidos.

sudo ufw allow "Nginx Full"

Creación de una lista negra de direcciones IP con UFW

Digamos que hay un spammer que está constantemente tratando de enviar spam a tu servidor de correo. Puedes usar UFW para bloquear la dirección IP del spammer para que no acceda al puerto TCP 25 de tu servidor de correo, con el siguiente comando. Sustituye 12.34.56.78 por la dirección IP del spammer.

sudo ufw insert 1 deny in from 12.34.56.78 to any port 25 proto tcp

Ten en cuenta que las reglas de cortafuegos recién añadidas se colocan en la parte inferior por defecto. Si previamente permitiste el acceso al puerto 25 desde cualquier lugar, entonces necesitas insertar la regla de denegación como la primera regla, igual que arriba, para que la regla de denegación se aplique primero. Siempre puede insertar una nueva regla de denegación como primera regla.

sudo ufw insert 1 deny in from 78.56.34.12 to any port 25 proto tcp

También puede bloquear un rango de direcciones IP como el siguiente.

sudo ufw insert 1 deny in from 192.168.0.0/24 to any port 25 proto tcp

Para bloquear el acceso de una dirección IP a todos los puertos de su servidor, ejecute

sudo ufw insert 1 deny in from 12.34.56.78

Creación de una lista blanca de direcciones IP con UFW

Ahora digamos que ejecutas un servidor OpenSSH y sólo quieres permitir que ciertas direcciones IP se conecten a tu servidor a través de SSH. Puedes usar UFW para crear una lista blanca de direcciones IP. Por ejemplo, no tengo una dirección IP estática en mi casa, pero he configurado varios servidores VPN en la nube, así que ahora puedo configurar UFW para permitir la conexión entrante al puerto 22 desde la dirección IP de mi servidor VPN solamente.

En primer lugar, añada la dirección IP a la lista de permitidos.

sudo ufw insert 1 allow in from 12.34.56.78 to any port 22 proto tcp

A continuación, debes obtener el número de referencia de la regla de permitir SSH desde cualquier lugar y eliminar esa regla.

sudo ufw status numbered

sudo ufw delete reference-number

Tenga en cuenta que debe eliminar tanto la regla IPv4 como la IPv6. Observe también que si elimina primero la regla superior, el número de referencia de la regla inferior cambiará.

A partir de aquí, sólo su dirección IP puede acceder al puerto TCP 22.

Cómo utilizar la dirección IPv6 en UFW

En primer lugar, asegúrate de que el IPV6=yes está configurado en el archivo /etc/default/ufw. Si no lo está, añádelo en ese archivo y reinicia UFW (sudo systemctl restart ufw).

Entonces puedes sustituir la dirección IPv4 por la IPv6 en los comandos ufw como se indica a continuación.

sudo ufw allow in from 2607:f8b0:4005:804::200e to any port 587

Ten en cuenta que no puede insertar una regla IPv6 entre reglas IPv4. Las reglas IPv6 deben colocarse siempre después de las reglas IPv4.

Cómo configurar el enmascaramiento de IP con UFW

A veces quieres configurar tu propio servidor VPN, entonces necesitarás configurar el enmascaramiento de IP en tu servidor VPN para que se convierta en un router virtual para los clientes VPN. Desafortunadamente, UFW no proporciona una manera conveniente de hacer esto. Tenemos que añadir el comando iptables en un archivo de configuración del cortafuegos UFW.

sudo nano /etc/ufw/before.rules

Por defecto, hay algunas reglas para la tabla de filtros. Añade las siguientes líneas al final de este archivo.

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic through eth0 - Change eth0 to match your network interface
-A POSTROUTING -o eth0 -j MASQUERADE

# End each table with the 'COMMIT' line or these rules won't be processed
COMMIT

Observa si tu interfaz de red principal no es eth0, necesita cambiar eth0 por el nombre de su interfaz de red, que puede obtenerse con el comando ip addr. Y como estamos añadiendo reglas de firewall a una nueva tabla, concretamente la tabla nat, necesitamos añadir la línea ‘COMMIT’.

Por defecto, el cortafuegos UFW prohíbe el reenvío de paquetes, lo que está muy bien porque evita que gente aleatoria en Internet utilice tu caja para hacer cosas maliciosas. Pero necesitamos permitir el reenvío para nuestra red privada. Encuentra la cadena ufw-before-forward en este archivo y añade las siguientes 3 líneas, que aceptarán el reenvío de paquetes si la IP de origen o la IP de destino están en el rango 10.10.10.0/24.

# allow forwarding for trusted network
-A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT

Guarde y cierre el archivo. A continuación, reinicie UFW.

sudo ufw disable

sudo ufw enable

o simplemente

sudo systemctl restart ufw

Aunque esto no está relacionado con la configuración del cortafuegos UFW, pero para enrutar los paquetes, también es necesario configurar el reenvío de IP. Esto se puede hacer estableciendo lo siguiente al final del archivo /etc/sysctl.conf.

net.ipv4.ip_forward = 1

A continuación, aplique los cambios con el siguiente comando.

sudo sysctl -p

Cómo configurar el reenvío de puertos en UFW

¿Qué pasa si usas el cortafuegos UFW en tu router y quieres enrutar paquetes como peticiones HTTP a hosts internos de la LAN? En este caso, necesitas configurar el reenvío de puertos. Edita el archivo /etc/ufw/before.rules.

sudo nano /etc/ufw/before.rules

A continuación, añade las siguientes líneas en la tabla NAT, por encima de la línea COMMIT. Sustituye 12.34.56.78 por la dirección IP pública de tu router.

:PREROUTING ACCEPT [0:0]
# forward 12.34.56.78  port 80 to 192.168.1.100:80
# forward 12.34.56.78  port 443 to 192.168.1.100:443
-A PREROUTING -i eth0 -d 12.34.56.78  -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
-A PREROUTING -i eth0 -d 12.34.56.78  -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:443

Esto indica al cortafuegos UFW que utilice el objetivo DNAT para reenviar las solicitudes HTTP y HTTPS al host 192.168.100 en la red local.

Sugerencia: DNAT (Destination NAT) cambia la dirección IP de destino. Un ejemplo típico es el reenvío de puertos. SNAT (Source NAT) cambia la dirección IP de origen. Un ejemplo típico es cuando un host detrás de un router Wifi quiere navegar por Internet.

Borrar las reglas de la tabla NAT.

sudo iptables -F -t nat

Reinicia UFW para procesar todas las reglas NAT.

sudo systemctl restart ufw

También es necesario habilitar el reenvío de IP en el archivo /etc/sysctl.conf como se mencionó anteriormente.

Si el host 192.168.1.100 también está ejecutando un cortafuegos UFW, entonces necesita permitir los puertos 80 y 443 en UFW.

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Ten en cuenta que el host LAN 192.168.1.100 debe utilizar el router UFW como puerta de enlace. Si utilizas otra dirección IP como puerta de enlace, el reenvío de puertos no funcionará.

Cómo bloquear el tráfico de BitTorrent en los servidores de la nube

Si tienes un servidor en la nube, probablemente quieras bloquear el tráfico de BitTorrent en el servidor, porque si tú o alguien más descarga accidentalmente contenido ilegal (películas, programas de televisión) a través de BitTorrent y te pillan, tu proveedor de alojamiento probablemente suspenderá tu cuenta.

Los clientes modernos de BitTorrent cifran el tráfico entre pares, por lo que no es fácil diferenciar el tráfico de BitTorrent de otros tipos de tráfico. Aunque no hay una forma perfecta de bloquear el tráfico de BitTorrent, aquí hay una solución sencilla.

Bloquear el tráfico saliente por defecto.

sudo ufw default deny outgoing

A continuación, permite puertos salientes específicos. Por ejemplo, debe permitir el puerto DNS.

sudo ufw allow out 53

Y tienes que permitir los puertos 80 y 443 para actualizar tus paquetes de software desde el repositorio.

sudo ufw allow out 80/tcp

sudo ufw allow out 443/tcp

Si este es su servidor de correo, necesita permitir el puerto 25.

sudo ufw allow out 25/tcp

Reinicia el cortafuegos UFW para que los cambios surtan efecto.

sudo systemctl restart ufw

Bloqueo de las conexiones salientes a una dirección IP específica

En primer lugar, debe permitir el tráfico saliente.

sudo ufw default allow outgoing

Entonces bloquea una dirección IP específica con:

sudo ufw insert 1 deny out to 12.34.56.78

Reiniciar UFW.

sudo systemctl restart ufw

UFW y fail2ban

Fail2ban es un programa que utiliza el cortafuegos iptables para evitar que los servidores sufran ataques de fuerza bruta. El cortafuegos UFW y Fail2ban no interfieren entre sí.

Estero que este artículo te sea de gran ayuda entendiendo como funciona el firewall y puedas tener tus servidores en la nube mas seguros.

¡Que tengas un Ingenioso día!

¡que tengas un ingenioso día!

Contrata tu plan Ingenios@ de Sistemas por 5€ al mes y responderé a todas tus preguntas sobre tecnología en el menor tiempo posible. Pasa a formar parte de la comunidad Ingenios@s de Sistemas y disfruta de contenido exclusivo y aprende sobre sistemas Open Source, Blockchain, SmarContract, Web3, Inteligencia Artificial y Reaidad Virtual, súbete al tren de la Revolución 4.0

Si quieres estar al día y no perderte nada Suscribete al Podcast Ingenios@s de Sistemas, un episodio diario que te mantendrá informado y formado en esta vertiginosa carrera.

Deja un comentario

Share to...