UFW en Ubuntu: protege tu servidor con firewall en 10 minutos
Si tienes un VPS o servidor en produccion, configurar UFW en Ubuntu es lo primero que deberias hacer antes de abrir cualquier puerto. UFW (Uncomplicated Firewall) es la forma mas sencilla de gestionar iptables en Ubuntu — sin memorizar sintaxis compleja, sin riesgo de romper nada. En esta guia lo tienes todo: instalacion, reglas basicas, ejemplos reales y los errores mas comunes ya resueltos.
Tabla de contenido
- Que es UFW y por que usarlo en Ubuntu
- Requisitos previos
- Instalar UFW en Ubuntu
- Comandos basicos de UFW en Ubuntu
- Como permitir y denegar puertos con UFW
- Reglas UFW por aplicacion: Nginx, Apache, OpenSSH
- Como bloquear y permitir IPs con UFW
- Como ver el estado y las reglas activas de UFW
- Como eliminar reglas de UFW paso a paso
- Ejemplos practicos de UFW en produccion
- Errores comunes y cómo resolverlos
- Preguntas frecuentes sobre UFW en Ubuntu
Que es UFW y por que usarlo en Ubuntu
UFW (Uncomplicated Firewall) es la interfaz de línea de comandos para gestionar iptables en Ubuntu de forma sencilla. Viene incluido por defecto en Ubuntu y está diseñado para que cualquier administrador de sistemas pueda configurar un firewall funcional sin necesidad de conocer la sintaxis compleja de iptables.
¿Por qué necesitas un firewall en tu servidor?

Si tienes un VPS, servidor dedicado o instancia en la nube (AWS, DigitalOcean, Hetzner...), activar UFW es uno de los primeros pasos que debes dar.
Requisitos previos
- Ubuntu 20.04, 22.04 o 24.04 (también compatible con Debian)
- Acceso a la terminal con privilegios sudo
- Conexión SSH activa (importante: no cierres la sesión hasta haber habilitado el puerto 22)
Instalar UFW en Ubuntu
UFW viene preinstalado en la mayoría de versiones de Ubuntu. Para verificarlo:
sudo ufw versionSi no está instalado, ejecuta:
sudo apt update && sudo apt install ufw -y
Comandos basicos de UFW en Ubuntu
| Comando | Descripción |
|---|---|
sudo ufw enable |
Activa el firewall |
sudo ufw disable |
Desactiva el firewall |
sudo ufw status |
Muestra el estado actual |
sudo ufw status verbose |
Estado detallado con políticas |
sudo ufw reload |
Recarga las reglas sin desactivar |
sudo ufw reset |
Elimina todas las reglas y reinicia |
sudo ufw enable, asegúrate de haber permitido el puerto 22 (SSH) o perderás el acceso remoto a tu servidor.Como permitir y denegar puertos con UFW
Permitir un puerto
# Por número de puerto (TCP y UDP)
sudo ufw allow 80
# Solo TCP
sudo ufw allow 80/tcp
# Solo UDP
sudo ufw allow 53/udp
# Rango de puertos
sudo ufw allow 8000:8080/tcpDenegar un puerto
#Deniega puerto 23 tanto TCP como UDP
sudo ufw deny 23
#Deniega solo TCP del puerto 23
sudo ufw deny 23/tcpRechazar con notificación vs denegar silenciosamente
# deny: descarta el paquete sin respuesta
sudo ufw deny 3306
# reject: descarta el paquete y notifica al origen
sudo ufw reject 3306
Reglas UFW por aplicacion: Nginx, Apache, OpenSSH
UFW permite gestionar reglas usando perfiles de aplicación en lugar de números de puerto. Esto hace las reglas más legibles y fáciles de mantener.
Cómo funciona por dentro
Los perfiles se almacenan como archivos de texto en /etc/ufw/applications.d/. Cada paquete que instalas puede incluir su propio perfil en ese directorio.
ls /etc/ufw/applications.d/Para ver el contenido de un perfil concreto:
cat /etc/ufw/applications.d/openssh-server
La estructura es simple:
- Nombre en corchetes
- Título
- Descripción
- Puertos
¿Por qué en mi servidor solo aparecen 2 o 3 perfiles?
sudo ufw app listSi el resultado es algo como:

Salida del comando ufw app list mostrando perfiles disponiblesEs completamente normal. UFW solo muestra los perfiles de las aplicaciones que tienes instaladas en tu sistema. Nginx, Apache, Docker y otros solo aparecen si están instalados y si su paquete incluye un archivo de perfil en /etc/ufw/applications.d/.
Algunos paquetes no incluyen perfil UFW aunque estén instalados. En esos casos simplemente usa el número de puerto directamente.
Ver detalles de un perfil
sudo ufw app info OpenSSH
Usar perfiles en tus reglas
# Permitir SSH
sudo ufw allow OpenSSH
# Permitir Nginx (HTTP + HTTPS) si está instalado
sudo ufw allow 'Nginx Full'
# Solo HTTPS
sudo ufw allow 'Nginx HTTPS'
# Solo HTTP
sudo ufw allow 'Nginx HTTP'Los perfiles con espacios en el nombre deben ir entre comillas simples
Crear tu propio perfil de aplicación
Esta es la parte más útil: puedes crear perfiles personalizados para cualquier servicio. Por ejemplo, para una API que corre en el puerto 8080:
sudo nano /etc/ufw/applications.d/mi-apiContenido del archivo:
[MiAPI]
title=API REST interna
description=Servicio de API en puerto 8080 TCP
ports=8080/tcpGuarda el archivo y recarga los perfiles:
sudo ufw app update MiAPI
sudo ufw app list # ya aparece MiAPI
sudo ufw allow MiAPIOtro ejemplo con múltiples puertos (ejemplo, app que usa 8080 y 8443):
[MiAppWeb]
title=Aplicación web custom
description=Frontend en 8080 y versión segura en 8443
ports=8080,8443/tcpY si necesitas TCP y UDP en el mismo perfil:
[ServicioVoIP]
title=Servicio VoIP
description=SIP en TCP y RTP en UDP
ports=5060/tcp|10000:20000/udpActualizar un perfil existente
Si modificas un archivo en applications.d, aplica los cambios con:
sudo ufw app update NombrePerfil
# O actualizar todos a la vez
sudo ufw app update all
Como bloquear y permitir IPs con UFW
Permitir una IP específica
# Permite todo el tráfico desde una IP
sudo ufw allow from 192.168.1.100
# Permite solo SSH desde una IP
sudo ufw allow from 192.168.1.100 to any port 22Permitir una subred completa
# Permite acceso al puerto 3306 (MySQL) desde una red local
sudo ufw allow from 10.0.0.0/24 to any port 3306Bloquear una IP
sudo ufw deny from 45.33.32.156
sudo ufw deny from 45.33.32.0/24
Como ver el estado y las reglas activas de UFW
Estado simple
sudo ufw status
Estado con números de regla (necesarios para eliminar)
sudo ufw status numbered
Estado detallado con políticas por defecto
sudo ufw status verbose
Como eliminar reglas de UFW paso a paso
Por número de regla
Este es el método recomendado para eliminar reglas
- Primero vemos las reglas numeradas
sudo ufw status numbered
- Eliminamos por número
sudo ufw delete 3
Por descripción de la regla
sudo ufw delete deny from 45.33.32.156
Ejemplos practicos de UFW en produccion
Configuración base para un servidor web
# 1. Permitir SSH antes de activar el firewall
sudo ufw allow OpenSSH
# 2. Permitir HTTP y HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 3. Activar el firewall
sudo ufw enable
# 4. Verificar
sudo ufw status verbose
Servidor con MySQL accesible solo desde la app
# Permitir MySQL solo desde el servidor de aplicaciones
sudo ufw allow from (Ip de tu servidor de aplicaciones) to any port 3306
# Bloquear MySQL desde cualquier otro origen
sudo ufw deny 3306Bloquear ataques de fuerza bruta en SSH (con rate limiting)
# UFW tiene soporte nativo para limitar intentos de conexión
sudo ufw limit sshPermite SSH pero bloquea IPs que intenten más de 6 conexiones en 30 segundos
Servidor con acceso solo desde tu IP
# Denegar todo por defecto
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Permitir solo tu IP
sudo ufw allow from TU_IP_PUBLICA
# Activar
sudo ufw enable
Errores comunes y cómo resolverlos

Me quedé sin acceso SSH al activar UFW
Causa: Activaste UFW sin permitir el puerto 22 antes.
Solución: Si tienes acceso a la consola de tu proveedor VPS o Hosting, úsala para ejecutar:
sudo ufw allow 22
sudo ufw enableSi no tienes acceso a consola, contacta a tu proveedor de hosting.
Prevención: Siempre ejecuta esto antes de activar UFW:
sudo ufw allow OpenSSH
sudo ufw enableUFW activo pero los puertos siguen accesibles
Causa más común: Docker está modificando iptables directamente y bypaseando UFW.
Cuando Docker expone un puerto con -p 8080:80, lo hace añadiendo reglas directamente a iptables en la cadena DOCKER, saltándose completamente UFW. Aunque UFW diga que el puerto está bloqueado, Docker lo abre igualmente.
Puedes confirmarlo:
# Verificar si Docker está interfiriendo
sudo iptables -L DOCKER -n
Opción 1: Deshabilitar la manipulación de iptables en Docker
Esta es la solución más limpia. El archivo que hay que editar hoy en día es /etc/docker/daemon.json, no /etc/default/docker (ese es legacy y en la mayoría de sistemas modernos se ignora).
sudo nano /etc/docker/daemon.json
Añade:
{
"iptables": false
}Reinicia Docker:
sudo systemctl restart dockerConsecuencia importante: Al deshabilitar esto, Docker ya no gestiona el enrutamiento de red automáticamente. Tú pasas a ser responsable de abrir los puertos que necesiten tus contenedores en UFW manualmente:
sudo ufw allow 8080/tcpY los contenedores dejan de tener acceso a internet por defecto a menos que configures el enrutamiento. Para la mayoría de VPS con un solo servidor esto funciona bien, pero en setups complejos con muchos contenedores puede volverse engorroso.
Opción 2: Usar la cadena DOCKER-USER (recomendada)
En lugar de deshabilitar la integración de Docker con iptables, usas la cadena DOCKER-USER que Docker reserva específicamente para que los administradores añadan sus propias reglas. Estas reglas se evalúan antes que las de Docker.
# Bloquear acceso externo al puerto 3306 de Docker, permitir solo desde una IP
sudo iptables -I DOCKER-USER -p tcp --dport 3306 ! -s TU_IP -j DROP
# Bloquear todo acceso externo a un puerto concreto
sudo iptables -I DOCKER-USER -p tcp --dport 8080 -j DROP
# Permitir solo desde tu IP y bloquear el resto
sudo iptables -I DOCKER-USER -p tcp --dport 8080 ! -s TU_IP -j DROPEl problema de esta opción es que las reglas de iptables no persisten entre reinicios. Para hacerlas persistentes necesitas iptables-persistent:
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
Opción 3: Bind solo a localhost en el contenedor
Si el servicio no necesita ser accesible desde fuera del servidor (por ejemplo, una base de datos que solo usa la app en el mismo host), la solución más simple es no exponerlo en la interfaz pública desde el principio:
# En lugar de:
docker run -p 3306:3306 mysql
# Usa:
docker run -p 127.0.0.1:3306:3306 mysqlCon 127.0.0.1:3306:3306 el puerto solo escucha en localhost. UFW ni Docker-iptables entran en juego porque el puerto nunca está expuesto en la interfaz pública.
sudo ufw status muestra "inactive" aunque lo activé
Causa: El servicio no persiste entre reinicios si no está habilitado en systemd.
Solución:
sudo systemctl enable ufw
sudo systemctl start ufw
sudo ufw enableReglas duplicadas en UFW
Si ejecutas el mismo allow varias veces, UFW crea reglas duplicadas.
Verificar:
sudo ufw status numbered
Eliminar duplicados:
sudo ufw delete NUMERO_DE_REGLA
Preguntas frecuentes sobre UFW en Ubuntu
¿UFW reemplaza a iptables?
No exactamente. UFW es una interfaz que gestiona iptables por debajo. Cuando configuras reglas en UFW, estas se traducen a reglas de iptables. Ambos coexisten; UFW simplemente hace más amigable la gestión.
¿Debo usar UFW o el firewall del proveedor de cloud?
Ambos son complementarios. El firewall de tu proveedor (como los Security Groups de AWS o el Firewall de DigitalOcean) actúa a nivel de red, antes de que el tráfico llegue a tu servidor. UFW actúa directamente en el sistema operativo. Se recomienda usar los dos en capas.
¿UFW funciona con IPv6?
Sí. UFW tiene soporte nativo para IPv6. Verifica que esté habilitado en /etc/default/ufw:
grep IPV6 /etc/default/ufw
# Debe mostrar: IPV6=yes
¿Cómo ver los logs de UFW?
# Ver logs en tiempo real
sudo tail -f /var/log/ufw.log
# Habilitar logging si no está activo
sudo ufw logging on
# Niveles: low, medium, high, full
sudo ufw logging medium
¿UFW afecta el tráfico de salida?
Por defecto, UFW permite todo el tráfico de salida (default allow outgoing). Puedes cambiar esto:
sudo ufw default deny outgoing
# Y luego permitir solo lo necesario
sudo ufw allow out 80/tcp
sudo ufw allow out 443/tcp
sudo ufw allow out 53/udp
¿Puedo usar UFW en Debian?
Sí. UFW es compatible con Debian. Instálalo con:
sudo apt install ufw -y
¿Qué diferencia hay entre deny y reject?
deny: descarta el paquete silenciosamente. El origen no recibe respuesta y el intento queda en un timeout.reject: descarta el paquete pero envía un mensaje de error al origen. Más honesto, pero revela que el puerto existe.
Para la mayoría de casos, deny es la opción preferida por seguridad.