Cómo Configurar un Cortafuegos con UFW en Debian 11

Introducción

UFW, o Uncomplicated Firewall, es una interfaz simplificada de gestión de firewall que oculta la complejidad de las tecnologías de filtrado de paquetes de nivel inferior, como iptables y nftables. Si estás buscando comenzar a asegurar tu red y no estás seguro de qué herramienta utilizar, UFW podría ser la elección adecuada para ti.

Este tutorial te mostrará cómo configurar un firewall con UFW en Debian 11.

Requisitos previos

Para seguir este tutorial, necesitarás un servidor Debian 11 con un usuario sudo que no sea root, el cual puedes configurar siguiendo el Paso 1 al 3 en el tutorial Configuración Inicial del Servidor con Debian 11.

Paso 1: Instalar UFW

Debian no instala UFW de forma predeterminada. Si has seguido todo el tutorial de Configuración Inicial del Servidor, habrás instalado y habilitado UFW. Si no lo has hecho, instálalo ahora usando apt:

  1. sudo apt install ufw

Configurarás UFW y lo habilitarás en los siguientes pasos.

Paso 2: Utilizar IPv6 con UFW (Opcional)

Este tutorial está escrito teniendo en cuenta IPv4, pero funcionará para IPv6 también si lo habilitas. Si tu servidor Debian tiene habilitado IPv6, asegúrate de que UFW esté configurado para admitir IPv6. Para hacerlo, abre el archivo de configuración de UFW /etc/default/ufw con nano o tu editor favorito:

  1. sudo nano /etc/default/ufw

Localiza IPV6 en el archivo y asegúrate de que el valor sea yes:

/etc/default/ufw excerpt
IPV6=yes

Guarda y cierra el archivo. Si estás utilizando nano, presiona CTRL+X, luego Y, y finalmente ENTER para guardar y salir del archivo.

Ahora, cuando UFW esté habilitado, estará configurado para escribir reglas de firewall tanto para IPv4 como para IPv6. Antes de habilitar UFW, sin embargo, querrás asegurarte de que tu firewall esté configurado para permitir la conexión a través de SSH. Comienza estableciendo las políticas predeterminadas.

Paso 3 — Configuración de las políticas predeterminadas

Si estás comenzando con tu firewall, las primeras reglas que debes definir son tus políticas predeterminadas. Estas reglas manejan el tráfico que no coincide explícitamente con ninguna otra regla. Por defecto, UFW está configurado para denegar todas las conexiones entrantes y permitir todas las conexiones salientes. Esto significa que cualquier persona que intente llegar a tu servidor no podrá conectarse, mientras que cualquier aplicación dentro del servidor podrá alcanzar el mundo exterior.

Restablece las reglas de tu UFW a los valores predeterminados para asegurarte de que podrás seguir este tutorial. Para establecer los valores predeterminados utilizados por UFW, utiliza estos comandos:

  1. sudo ufw default deny incoming
  2. sudo ufw default allow outgoing

Recibirás una salida como la siguiente:

Output
Default incoming policy changed to 'deny' (be sure to update your rules accordingly) Default outgoing policy changed to 'allow' (be sure to update your rules accordingly)

Estos comandos establecen los valores predeterminados para denegar las conexiones entrantes y permitir las conexiones salientes. Estas configuraciones predeterminadas del firewall podrían ser suficientes para una computadora personal, pero los servidores generalmente necesitan responder a solicitudes entrantes de usuarios externos. Comenzarás este proceso en el próximo paso.

Paso 4 — Permitir Conexiones SSH

No puedes habilitar tu firewall UFW aún, porque denegaría todas las conexiones entrantes, incluidos tus intentos de acceder a tu servidor. Esto significa que necesitarás crear reglas que permitan explícitamente conexiones entrantes legítimas, como conexiones SSH o HTTP, por ejemplo, si deseas que tu servidor responda a esos tipos de solicitudes. Si estás utilizando un servidor en la nube, probablemente querrás permitir conexiones SSH entrantes para poder conectarte y administrar tu servidor.

Para configurar tu servidor para permitir conexiones SSH entrantes, usa este comando:

  1. sudo ufw allow ssh

Esto creará reglas de firewall que permitirán todas las conexiones en el puerto 22, que es el puerto en el que el daemon SSH escucha de forma predeterminada. UFW sabe a qué puerto está vinculado permitir ssh porque está listado como un servicio en el archivo /etc/services.

Sin embargo, en realidad puedes escribir la regla equivalente especificando el puerto en lugar del nombre del servicio. Por ejemplo, este comando produce el mismo resultado que el anterior:

  1. sudo ufw allow 22

Si configuraste tu daemon SSH para usar un puerto diferente, deberás especificar el puerto correspondiente. Por ejemplo, si tu servidor SSH está escuchando en el puerto 2222, puedes usar este mismo comando pero reemplazar 22 con 2222.

Ahora que tu firewall está configurado para permitir conexiones SSH entrantes, puedes habilitarlo.

Paso 5 — Habilitar UFW

Para habilitar UFW, usa este comando:

  1. sudo ufw enable

Recibirás una advertencia que indica que el comando puede interrumpir las conexiones SSH existentes. Ya has configurado una regla de firewall que permite conexiones SSH, así que debería estar bien continuar. Responde a la solicitud con y y presiona ENTER.

El firewall ahora está activo. Para ver las reglas que has establecido, ejecuta este comando:

  1. sudo ufw status verbose

El resto de este tutorial cubre cómo usar UFW con más detalle, incluyendo permitir y denegar diferentes tipos de conexiones.

Paso 6 — Permitir Otras Conexiones

En este punto, debes permitir todas las demás conexiones que tu servidor necesita para funcionar correctamente. Las conexiones que debes permitir dependen de tus necesidades específicas. Ya sabes cómo escribir reglas que permiten conexiones basadas en un nombre de servicio o puerto; hiciste esto para SSH en el puerto 22.

Puedes hacer lo mismo para HTTP en el puerto 80, que es lo que utilizan los servidores web no encriptados. Para permitir este tipo de tráfico, escribirías:

  1. sudo ufw allow http

También puedes hacer lo mismo para HTTPS en el puerto 443, que es lo que utilizan los servidores web encriptados. Para permitir este tipo de tráfico, escribirías:

  1. sudo ufw allow https

En ambos escenarios, especificar los puertos también funcionaría, con HTTP siendo 80 y HTTPS siendo 443. Por ejemplo:

  1. sudo ufw allow 80

Existen otras formas de permitir conexiones, sin embargo, además de especificar un puerto o servicio conocido. Esto se discute a continuación.

Rangos de puertos específicos

Puede especificar rangos de puertos con UFW. Por ejemplo, algunas aplicaciones utilizan múltiples puertos en lugar de un solo puerto.

Por ejemplo, para permitir conexiones X11, que utilizan los puertos 60006007, use estos comandos:

  1. sudo ufw allow 6000:6007/tcp
  2. sudo ufw allow 6000:6007/udp

Al especificar rangos de puertos con UFW, debe especificar el protocolo (tcp o udp) al que deben aplicarse las reglas. Esto no se mencionó antes porque no especificar el protocolo permite automáticamente ambos protocolos, lo cual está bien en la mayoría de los casos.

Direcciones IP específicas

Cuando trabaje con UFW, también puede especificar direcciones IP. Por ejemplo, si desea permitir conexiones desde una dirección IP específica, como la dirección IP de trabajo o doméstica 203.0.113.4, debe especificar from y luego la dirección IP:

  1. sudo ufw allow from 203.0.113.4

También puede especificar un puerto específico al que se permite conectar la dirección IP agregando to any port seguido del número de puerto. Por ejemplo, si desea permitir que 203.0.113.4 se conecte al puerto 22 (SSH), utilice este comando:

  1. sudo ufw allow from 203.0.113.4 to any port 22

Subredes

Si deseas permitir una subred de direcciones IP, puedes hacerlo utilizando la notación CIDR para especificar una máscara de red. Por ejemplo, si deseas permitir todas las direcciones IP que van desde 203.0.113.1 hasta 203.0.113.254, puedes usar este comando:

  1. sudo ufw allow from 203.0.113.0/24

Del mismo modo, también puedes especificar el puerto de destino al que la subred 203.0.113.0/24 tiene permitido conectarse. Nuevamente, utilizando el puerto 22 (SSH) como ejemplo:

  1. sudo ufw allow from 203.0.113.0/24 to any port 22

Conexiones a una Interfaz de Red Específica

Si deseas crear una regla de firewall que solo se aplique a una interfaz de red específica, puedes hacerlo especificando allow in on, seguido del nombre de la interfaz de red.

Será útil buscar tus interfaces de red antes de continuar. Para hacerlo, utiliza este comando:

  1. ip addr
Output
. . . 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state . . . 3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default . . .

La salida resaltada indica los nombres de las interfaces de red. Típicamente tienen nombres como eth0 o enp3s2.

Si tu servidor tiene una interfaz de red pública llamada eth0, por ejemplo, podrías permitir el tráfico HTTP hacia ella con este comando:

  1. sudo ufw allow in on eth0 to any port 80

Al hacerlo, permitirías que tu servidor recibiera solicitudes HTTP desde internet público.

O, si desea que un servidor de base de datos MySQL (puerto 3306) escuche conexiones en la interfaz de red privada eth1, podría utilizar este comando:

  1. sudo ufw allow in on eth1 to any port 3306

Esto permitiría que otros servidores en su red privada se conecten a su base de datos MySQL.

Paso 7 — Denegar Conexiones

Si no ha cambiado la política predeterminada para las conexiones entrantes, UFW está configurado para denegar todas las conexiones entrantes. En general, esto simplifica el proceso de creación de una política de firewall segura al requerir la creación de reglas que permitan explícitamente puertos e direcciones IP específicos.

A veces, querrá denegar conexiones específicas basadas en la dirección IP de origen o la subred, tal vez porque sabe que su servidor está siendo atacado desde allí. Además, si desea cambiar su política predeterminada de entradas a allow (lo cual no se recomienda), debería crear reglas de deny para cualquier servicio o dirección IP para el cual no desee permitir conexiones.

Para escribir reglas de deny, puede usar los comandos descritos anteriormente, reemplazando allow por deny.

Por ejemplo, para denegar conexiones HTTP, podría usar este comando:

  1. sudo ufw deny http

O si desea denegar todas las conexiones desde 203.0.113.4, podría usar este comando:

  1. sudo ufw deny from 203.0.113.4

Ahora, puede aprender cómo implementar reglas de eliminación.

Paso 8 — Eliminar Reglas

Saber cómo eliminar reglas de firewall es tan importante como saber cómo crearlas. Hay dos formas de especificar qué reglas eliminar: por el número de regla o por la regla en sí. Esto es similar a cómo se especificaron las reglas cuando se crearon.

Por Número de Regla

Si estás utilizando el número de regla para eliminar reglas de firewall, lo primero que querrás hacer es obtener una lista de tus reglas de firewall. El comando status de UFW tiene la opción numbered, que muestra números junto a cada regla:

  1. sudo ufw status numbered
Output
Status: active To Action From -- ------ ---- [ 1] 22 ALLOW IN 15.15.15.0/24 [ 2] 80 ALLOW IN Anywhere

Si decides que deseas eliminar la regla 2, que permite conexiones HTTP en el puerto 80, puedes especificarlo en el siguiente comando delete de UFW:

  1. sudo ufw delete 2

Esto mostrará un mensaje de confirmación, al que puedes responder con y/n. Escribir y eliminará la regla 2. Ten en cuenta que si tienes IPv6 habilitado, querrás eliminar también la regla correspondiente de IPv6.

Por Regla Real

La alternativa a los números de regla es especificar la regla real que deseas eliminar. Por ejemplo, si quieres eliminar la regla allow http, podrías escribirlo así:

  1. sudo ufw delete allow http

También puedes especificar la regla con allow 80 en lugar del nombre del servicio:

  1. sudo ufw delete allow 80

Este método eliminará tanto las reglas IPv4 como las IPv6, si existen.

Paso 9 — Verificación del Estado y Reglas de UFW

En cualquier momento, puedes verificar el estado de UFW con este comando:

  1. sudo ufw status verbose

Si UFW está desactivado, que es el valor predeterminado, la salida será esta:

Output
Status: inactive

Si UFW está activo, lo que debería ser si seguiste el Paso 3, la salida dirá que está activo y enumerará cualquier regla que hayas establecido. Por ejemplo, si el firewall está configurado para permitir conexiones SSH (puerto 22) desde cualquier lugar, la salida podría incluir algo como esto:

Output
Status: active To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere

Usa el comando status si quieres verificar cómo UFW ha configurado el firewall.

Paso 10 — Desactivación o Restablecimiento de UFW (opcional)

Si decides que no quieres usar UFW, puedes desactivarlo con este comando:

  1. sudo ufw disable

Cualquier regla que hayas creado con UFW ya no estará activa. Siempre puedes ejecutar sudo ufw enable si necesitas activarla más tarde.

Si ya tienes reglas UFW configuradas, pero decides que quieres empezar de nuevo, puedes usar el comando de reinicio:

  1. sudo ufw reset

Esto desactivará UFW y eliminará cualquier regla que hayas definido previamente. Ten en cuenta que las políticas predeterminadas no volverán a sus configuraciones originales si las modificaste en algún momento. Esto te dará un nuevo comienzo con UFW.

Conclusión

Tu firewall ahora está configurado para permitir (al menos) conexiones SSH. Asegúrate de permitir cualquier otra conexión entrante que tu servidor necesite, al tiempo que limitas las conexiones innecesarias. Esto garantizará que tu servidor sea funcional y seguro.

Para aprender sobre más configuraciones comunes de UFW, consulta este tutorial sobre UFW Essentials: Common Firewall Rules and Commands.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-debian-11-243261243130246d443771547031794d72784e6b36656d4a326e49732e