Cómo configurar un firewall con UFW en Debian 11

Introducción

UFW, o Firewall Descomplicado, 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 usar, UFW puede ser la elección correcta para ti.

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

Prerrequisitos

Para seguir este tutorial, necesitarás un servidor Debian 11 con un usuario no root con permisos de sudo, que 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 por defecto. Si seguiste todo el tutorial de Configuración inicial del servidor, habrás instalado y habilitado UFW. Si no lo hiciste, instálalo ahora usando apt:

  1. sudo apt install ufw

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

Paso 2 — Uso de IPv6 con UFW (Opcional)

Este tutorial está escrito teniendo en cuenta IPv4 pero funcionará también para IPv6 si lo habilitas. Si tu servidor Debian tiene habilitado IPv6, querrás asegurarte de que UFW esté configurado para admitir IPv6. Esto garantizará que UFW administre reglas de firewall tanto para IPv6 como para IPv4. Para configurar esto, 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 usando nano, presiona CTRL+X, luego Y, luego 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. Sin embargo, antes de habilitar UFW, querrás asegurarte de que tu firewall esté configurado para permitirte conectar a través de SSH. Comienza con establecer las políticas predeterminadas.

Paso 3 — Configuración de Políticas Predeterminadas

Si estás empezando con tu firewall, las primeras reglas a 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 cualquiera que intente alcanzar tu servidor no podrá conectarse, mientras que cualquier aplicación dentro del servidor podrá alcanzar el mundo exterior.

Restablece tus reglas UFW a los valores predeterminados para asegurarte de que podrás seguir este tutorial. Para establecer los valores predeterminados utilizados por UFW, usa 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. Estos valores predeterminados de firewall por sí solos podrían ser suficientes para una computadora personal, pero los servidores típicamente necesitan responder a solicitudes entrantes de usuarios externos. Comenzarás este proceso en el siguiente 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 entrantes SSH para poder conectarte y administrar tu servidor.

Para configurar tu servidor para permitir conexiones entrantes SSH, utiliza 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 demonio SSH escucha de forma predeterminada. UFW sabe qué puerto está asociado a allow 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 demonio SSH para usar un puerto diferente, tendrás que especificar el puerto adecuado. 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 entrantes SSH, puedes habilitarlo.

Paso 5 — Habilitando UFW

Para habilitar UFW, utiliza este comando:

  1. sudo ufw enable

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

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

  1. sudo ufw status verbose

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

Paso 6 — Permitir Otras Conexiones

En este punto, deberías permitir todas las otras 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 esto para HTTP en el puerto 80, que es lo que usan los servidores web no encriptados. Para permitir este tipo de tráfico, escribirías:

  1. sudo ufw allow http

También puedes hacer esto para HTTPS en el puerto 443, que es lo que usan 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, siendo HTTP 80 y HTTPS 443. Por ejemplo:

  1. sudo ufw allow 80

Sin embargo, hay otras formas de permitir conexiones, aparte de especificar un puerto o servicio conocido. Esto se discute a continuación.

Rangos de Puertos Específicos

Puedes 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, utiliza estos comandos:

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

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

Direcciones IP Específicas

Cuando trabajas con UFW, también puedes especificar direcciones IP. Por ejemplo, si deseas permitir conexiones desde una dirección IP específica, como la dirección IP de trabajo o casa 203.0.113.4, necesitas especificar from y luego la dirección IP:

  1. sudo ufw allow from 203.0.113.4

También puedes especificar un puerto específico al que la dirección IP puede conectarse agregando a cualquier puerto seguido del número de puerto. Por ejemplo, si deseas permitir que 203.0.113.4 se conecte al puerto 22 (SSH), utiliza 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 usando 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

De igual manera, también puedes especificar el puerto de destino al que se permite conectar la subred 203.0.113.0/24. Nuevamente, usando 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 se aplique únicamente 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, usa 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. Normalmente 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 reciba 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 usar 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 que cree reglas que permitan explícitamente puertos específicos y direcciones IP.

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

Para escribir reglas de deny, puede usar los comandos descritos anteriormente, reemplazando allow con 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 — Eliminación de Reglas

Saber cómo eliminar reglas de firewall es igual de importante que saber cómo crearlas. Hay dos formas de especificar qué reglas eliminar: por el número de la regla o por la regla en sí misma. 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 UFW status 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 UFW delete:

  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, también querrás eliminar la regla IPv6 correspondiente.

Por Regla Actual

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

  1. sudo ufw delete allow http

También puede 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, puede 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 cual debería ser si siguió el Paso 3, la salida indicará que está activo y enumerará cualquier regla que haya 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

Utilice el comando status si desea verificar cómo UFW ha configurado el firewall.

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

Si decide que no desea usar UFW, puede desactivarlo con este comando:

  1. sudo ufw disable

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

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

  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 ajustes originales si las modificaste en algún momento. Esto te dará un nuevo comienzo con UFW.

Conclusión

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

Para aprender más sobre configuraciones comunes de UFW, consulta este tutorial sobre Aspectos básicos de UFW: Reglas y comandos de firewall comunes.

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