UFW (Uncomplicated Firewall) es la interfaz sencilla que Ubuntu y Debian ofrecen para gestionar el filtrado de paquetes del kernel sin escribir reglas de iptables o nftables a mano. En esta guía configurarás UFW en un servidor con Ubuntu 24.04 para bloquear todo el tráfico entrante salvo SSH y los servicios que necesites, aprenderás a crear reglas por puerto y por IP de origen, a borrarlas y a revisar los registros. Los comandos son los mismos en Debian 12.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS o Debian 12, por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo.
  • Acceso a la consola del servidor desde el panel de CubePath, por si una regla errónea te deja sin SSH.

Paso 1: Instalar UFW y comprobar su estado

Ubuntu 24.04 trae UFW instalado pero desactivado. En Debian 12 hay que instalarlo. Ejecuta lo siguiente en ambos casos; si ya está instalado, apt no hará nada:

sudo apt update
sudo apt install ufw

Comprueba el estado:

sudo ufw status verbose
Status: inactive

Asegúrate también de que UFW gestionará IPv6. Abre el archivo de configuración por defecto:

sudo nano /etc/default/ufw

Comprueba que esta línea tiene el valor yes:

IPV6=yes

Guarda y cierra el archivo. Con IPV6=yes, cada regla que crees se aplicará a IPv4 e IPv6.

Paso 2: Definir las políticas por defecto

Las políticas por defecto deciden qué pasa con el tráfico que no coincide con ninguna regla. La configuración recomendada para un servidor es rechazar todo lo entrante y permitir todo lo saliente:

sudo ufw default deny incoming
sudo ufw default allow outgoing
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)

Estas políticas no se aplican hasta que actives UFW en el paso 5.

Paso 3: Permitir el acceso SSH

Permite SSH antes de nada. Si tu servidor escucha en el puerto estándar 22:

sudo ufw allow 22/tcp

En lugar de allow puedes usar limit, que permite la conexión pero bloquea una IP que intente abrir 6 o más conexiones en 30 segundos. Es una defensa útil contra ataques de fuerza bruta:

sudo ufw limit 22/tcp

Si cambiaste el puerto de SSH, por ejemplo al 2222, permite ese puerto en su lugar:

sudo ufw limit 2222/tcp

Para confirmar en qué puerto escucha realmente SSH, consulta los sockets abiertos:

sudo ss -tlnp | grep ssh
LISTEN 0      4096         0.0.0.0:22        0.0.0.0:*    users:(("sshd",pid=812,fd=3))
LISTEN 0      4096            [::]:22           [::]:*    users:(("sshd",pid=812,fd=4))

Paso 4: Permitir otros servicios

Abre solo los puertos que usen tus servicios. Para un servidor web con HTTP y HTTPS:

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

Algunos paquetes instalan perfiles de aplicación con sus puertos ya definidos. Lístalos con:

sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Puedes usar el nombre del perfil entre comillas en lugar de los puertos, por ejemplo sudo ufw allow "Nginx Full" abre el 80 y el 443. Los perfiles de Nginx solo aparecen si Nginx está instalado.

Otros tipos de reglas habituales:

Un rango de puertos (hay que indicar el protocolo):

sudo ufw allow 60000:61000/udp

Un puerto accesible solo desde una IP concreta, por ejemplo MySQL desde tu servidor de aplicaciones:

sudo ufw allow from 203.0.113.10 to any port 3306 proto tcp

Todo el tráfico desde una red privada de confianza:

sudo ufw allow from 10.0.0.0/24

Bloquear por completo una IP que está atacando tu servidor. Usa insert 1 para que la regla quede por delante de las que permiten tráfico, porque UFW aplica la primera regla que coincide:

sudo ufw insert 1 deny from 198.51.100.23

Paso 5: Activar UFW

Revisa las reglas que has añadido antes de activarlas:

sudo ufw show added
Added user rules (see 'ufw status' for running firewall):
ufw limit 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp

Si aparece la regla de SSH, activa el firewall:

sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

UFW se activa en el acto y queda habilitado en cada arranque. Sin cerrar tu sesión actual, abre una segunda conexión SSH desde otra terminal para confirmar que sigues pudiendo entrar.

Paso 6: Verificar las reglas

Consulta el estado completo:

sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     LIMIT IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (v6)                LIMIT IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)

Para comprobar desde fuera que un puerto no permitido está bloqueado, ejecuta desde otro equipo:

nc -vz -w 5 your_server_ip 3306

Un puerto bloqueado responde con un timed out, mientras que uno permitido con un servicio escuchando devuelve succeeded.

Paso 7: Borrar y modificar reglas

Para borrar una regla, lista las reglas numeradas:

sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     LIMIT IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 22/tcp (v6)                LIMIT IN    Anywhere (v6)
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

Borra la regla por su número. UFW pedirá confirmación:

sudo ufw delete 2

Las reglas IPv4 e IPv6 tienen números distintos y los números cambian después de cada borrado, así que vuelve a listar antes de borrar otra. Es más cómodo borrar por la especificación de la regla, que elimina a la vez la versión IPv4 y la IPv6:

sudo ufw delete allow 80/tcp

Paso 8: Revisar los registros

UFW registra los paquetes bloqueados con el nivel low, activo por defecto. Si lo desactivaste, vuelve a activarlo:

sudo ufw logging on

Los mensajes van al log del kernel con el prefijo [UFW BLOCK]. Consulta los más recientes con:

sudo journalctl -k --grep "UFW BLOCK" -n 20
Sep 25 10:41:07 server kernel: [UFW BLOCK] IN=eth0 OUT= MAC=... SRC=198.51.100.23 DST=your_server_ip LEN=44 TOS=0x00 PREC=0x00 TTL=242 ID=54321 PROTO=TCP SPT=51012 DPT=3389 WINDOW=1024 RES=0x00 SYN URGP=0

Si tu sistema tiene rsyslog, los mismos mensajes están también en /var/log/ufw.log. SRC es la IP de origen y DPT el puerto de destino al que intentaban conectar.

Solución de problemas

Te has quedado sin acceso SSH. Entra por la consola del servidor desde el panel de CubePath, inicia sesión y permite el puerto correcto con sudo ufw allow 22/tcp. Si necesitas volver a empezar, sudo ufw disable desactiva el firewall sin borrar las reglas.

Un contenedor Docker es accesible aunque UFW no lo permite. Docker publica los puertos con sus propias reglas de iptables, que se evalúan antes que las de UFW. Publica los puertos solo en localhost (127.0.0.1:8080:8080) y expón el servicio a través de un proxy inverso, o no publiques puertos que no deban ser públicos.

Quieres empezar desde cero. sudo ufw reset desactiva UFW y borra todas las reglas (guarda copias de seguridad en /etc/ufw/). Después repite la guía desde el paso 2.

Conclusión

Tu servidor ya rechaza todo el tráfico entrante salvo SSH y los servicios que has permitido de forma explícita, en IPv4 e IPv6. Como siguientes pasos, desactiva el acceso por contraseña en SSH y usa solo claves, instala Fail2ban para bloquear IPs de forma automática tras varios intentos fallidos y, si tu IP tiene protección DDoS Premium, añade reglas en el firewall perimetral de CubePath para filtrar el tráfico antes de que llegue al servidor.