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.
Importanteel orden de esta guía importa. Permite SSH (paso 3) antes de activar UFW (paso 5); si no, cortarás tu propia sesión.
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
Nota
insertsolo funciona cuando ya existe al menos una regla. Si es la primera, usasudo ufw 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.
