Cómo abrir puertos en Ubuntu con UFW: guía práctica de firewall
Aprende a abrir, liberar y cerrar puertos en Ubuntu usando UFW. Configura el firewall paso a paso con reglas seguras para HTTP, HTTPS, SSH y puertos personalizados.
Un firewall mal configurado es una de las causas más comunes de problemas en servidores Linux recién provisionados — ya sea porque la aplicación no responde (puerto cerrado) o porque el servidor está demasiado expuesto (puerto abierto sin necesidad). En Ubuntu, UFW (Uncomplicated Firewall) es la interfaz por defecto y simplifica la gestión de reglas de iptables, manteniendo la configuración legible y versionable.
Este tutorial cubre el flujo completo: habilitar UFW sin bloquearte fuera por SSH, abrir puertos para servicios comunes (HTTP, HTTPS, base de datos), crear reglas restringidas por IP de origen, verificar el estado y eliminar reglas antiguas. El destinatario es un sysadmin Linux configurando el firewall por primera vez en un servidor Ubuntu 22.04 o 24.04.
Tiempo estimado: 10-15 minutos para ejecutar todos los pasos con calma, incluyendo la verificación. Si solo necesitas abrir un puerto específico, ve directamente a la sección “Abriendo puertos TCP y UDP”.
Requisitos previos
Necesitas Ubuntu 22.04 LTS o 24.04 LTS con acceso sudo, sesión SSH activa y estable, y conocimiento del puerto SSH en uso (por defecto: 22). UFW viene instalado de fábrica — no es necesario instalar paquetes externos.
Antes de comenzar, confirma en qué puerto está corriendo SSH. Si tú o el proveedor lo cambiaron a un puerto personalizado (ej: 2222), esa información es crítica — abrir el puerto equivocado significa perder acceso al servidor después de habilitar el firewall.
22/tcp 80/tcp 443/tcp deny incoming, allow outgoing Verificando el estado actual de UFW
Antes de añadir reglas, confirma si UFW está habilitado o deshabilitado. Habilitarlo con reglas erróneas puede desconectarte inmediatamente.
Verifica el estado de UFW:
sudo ufw status verboseSi la salida es Status: inactive, el firewall está deshabilitado y no hay ninguna regla en vigor. Si es Status: active, lista las reglas existentes antes de cambiar nada.
Identifica el puerto SSH en uso leyendo la configuración:
sudo grep -i "^Port" /etc/ssh/sshd_configSi la salida muestra Port 22 (o ninguna línea), está por defecto. Si muestra otro número (ej: Port 2222), anótalo — necesitas liberar ese puerto antes de habilitar UFW.
Habilitar UFW sin liberar antes el puerto SSH cierra tu sesión actual e impide reconectarse. Si esto sucede y no tienes acceso a la consola del proveedor, la recuperación exige reinstalar el servidor.
Liberando SSH antes de habilitar el firewall
Este es el paso más importante. Libera siempre SSH primero y después habilita UFW.
Libera el puerto SSH (usa 22 o el puerto personalizado identificado arriba):
sudo ufw allow 22/tcpSi SSH corre en un puerto personalizado:
sudo ufw allow 2222/tcpLa respuesta Rules updated confirma que la regla se agregó a la configuración pendiente. Aún no está activa porque UFW está deshabilitado.
Habilita UFW:
sudo ufw enableUFW te preguntará si quieres continuar, advirtiendo que puede interrumpir conexiones SSH. Confirma con y. Si tu sesión SSH no se cae, el paso anterior funcionó.
Abriendo puertos TCP y UDP
Con el firewall activo, libera los puertos de las aplicaciones que necesitan estar accesibles externamente. UFW acepta varias sintaxis — elige la más clara para tu caso.
Libera HTTP y HTTPS para servicios web (nginx, Apache, Caddy):
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpAlternativa usando un perfil predefinido (más legible en scripts):
sudo ufw allow "Nginx Full"Lista los perfiles disponibles con sudo ufw app list.
Libera un puerto UDP (ej: DNS interno o servidor de juego):
sudo ufw allow 53/udp
sudo ufw allow 27015/udpSi la aplicación usa TCP y UDP en el mismo número (ej: algunos protocolos de juego), omite el protocolo:
sudo ufw allow 27015Libera un rango de puertos (útil para FTP passive o rangos de aplicaciones):
sudo ufw allow 5000:5100/tcpUsa dos puntos (:) para separar inicio y fin. El rango es inclusivo en ambos extremos.
Restringiendo el acceso por IP de origen
Para servicios que no deben ser públicos (base de datos, panel admin, métricas), libera únicamente IPs conocidas.
Libera PostgreSQL solo para la IP de tu servidor de aplicación:
sudo ufw allow from 203.0.113.45 to any port 5432 proto tcpSustituye 203.0.113.45 por la IP real. Para liberar una red entera (ej: VPC privada):
sudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcpAplica rate-limit en SSH para mitigar intentos de fuerza bruta:
sudo ufw limit 22/tcpEl limit bloquea conexiones del mismo origen que excedan 6 intentos en 30 segundos. No sustituye claves SSH ni fail2ban, pero añade una capa extra.
Usa ufw limit para rate-limiting + autenticación por clave SSH (deshabilitando contraseña en /etc/ssh/sshd_config) + fail2ban monitoreando /var/log/auth.log. Los tres juntos cubren el 99% de los ataques automatizados sin perjudicar el acceso legítimo.
Verificando las reglas activas
Después de añadir reglas, confirma que todo quedó como esperabas.
Lista todas las reglas con numeración:
sudo ufw status numberedLa salida muestra cada regla con un índice ([ 1], [ 2], etc), útil para eliminar reglas específicas después. La columna To indica el destino (puerto en el servidor), Action es ALLOW/DENY/LIMIT, y From es el origen permitido.
Prueba la conectividad del puerto desde otra máquina:
nc -zv TU_IP 80Si el puerto está abierto y el servicio respondiendo, la salida es Connection succeeded. Si el puerto está abierto pero nada está escuchando, es Connection refused. Si el puerto está cerrado por el firewall, el comando se cuelga o devuelve Operation timed out.
Eliminando reglas antiguas
A medida que reorganizas servicios, las reglas se vuelven basura. Limpiarlas mantiene el firewall auditable.
Elimina una regla por número (usa la lista de ufw status numbered):
sudo ufw delete 3UFW pide confirmación mostrando qué regla será eliminada. Tras el delete, los números de las reglas siguientes se reindexan — ejecuta siempre ufw status numbered antes de cada delete en secuencia.
Elimina una regla por especificación completa (alternativa que no depende del número):
sudo ufw delete allow 8080/tcpEsto es más seguro en scripts porque no depende del orden de las reglas.
Resolución de problemas
”ufw: command not found”
UFW no está instalado (raro en Ubuntu estándar, pero ocurre en imágenes minimalistas):
sudo apt update
sudo apt install -y ufw
Puerto liberado pero el servicio no responde
Verifica si el servicio realmente está escuchando en el puerto:
sudo ss -tulpn | grep :PUERTO
Si no aparece nada, el problema no es el firewall — el servicio no está corriendo o está enlazado a 127.0.0.1 (solo localhost). Para servicios que deben aceptar conexiones externas, configúralos para enlazarse a 0.0.0.0 o a la IP pública.
Las reglas desaparecen tras reiniciar
UFW persiste las reglas automáticamente en /etc/ufw/user.rules. Si las reglas desaparecen tras un reboot, el servicio puede no estar habilitado en el arranque:
sudo systemctl enable ufw
sudo systemctl status ufw
Próximos pasos
Con el firewall activo y los puertos configurados, considera los siguientes próximos pasos para fortalecer el servidor:
- Configura fail2ban para monitorear intentos de fuerza bruta en SSH, HTTP y otros servicios.
- Migra SSH a autenticación por clave y deshabilita el login por contraseña en
/etc/ssh/sshd_config. - Define los logs de UFW en nivel medio (
sudo ufw logging medium) y centralízalos vía journald o un sistema externo. - Documenta las reglas del firewall en un runbook versionado — facilita la auditoría y el onboarding de otros sysadmins.
- Estudia las reglas
before.rulesyafter.rulesen/etc/ufw/para casos avanzados como NAT, masquerading e integración con Docker.
Si estás aprovisionando esto en producción y quieres enfocarte en la aplicación en lugar de en la operación de infraestructura, una VPS Hostini ya viene con Ubuntu LTS y firewall preconfigurado con SSH liberado — solo añades las reglas de tus aplicaciones.
Preguntas frecuentes
¿Cuál es la diferencia entre 'ufw allow 80' y 'ufw allow 80/tcp'?
Sin especificar el protocolo, UFW libera tanto TCP como UDP en el puerto. Especificar /tcp o /udp restringe la regla al protocolo correcto, lo que es más seguro y claro. Para servicios web (HTTP, HTTPS, SSH) usa siempre /tcp; para DNS y juegos usa /udp o ambos según la aplicación.
¿Necesito reiniciar UFW después de añadir una regla?
No. UFW aplica las reglas en tiempo real en cuanto ejecutas el comando allow o deny. El reload (sudo ufw reload) solo es necesario si editaste archivos de configuración manualmente en /etc/ufw/ o modificaste perfiles en /etc/ufw/applications.d/.
¿Cómo abrir un puerto solo para una IP específica?
Usa la sintaxis extendida: sudo ufw allow from 203.0.113.45 to any port 5432 proto tcp. Esto libera el puerto 5432 (PostgreSQL) únicamente para solicitudes provenientes de la IP 203.0.113.45 — útil para bases de datos que solo deben ser accesibles desde tu servidor de aplicación.
¿UFW funciona con Docker?
Parcialmente. Docker manipula iptables directamente e ignora las reglas de UFW para los puertos publicados con -p. Para contenedores expuestos al público, usa la flag --iptables=false en el daemon de Docker o configura reglas en /etc/ufw/after.rules. En producción, considera exponer contenedores solo a través de un reverse proxy (nginx) con UFW protegiendo el host.
¿Cómo ver qué proceso está usando un puerto antes de abrirlo en el firewall?
Usa sudo ss -tulpn | grep :PUERTO para listar los procesos escuchando en el puerto. Si no aparece nada, ningún servicio está enlazado a él — abrirlo en UFW no hará que el puerto funcione. Primero necesitas iniciar el servicio (nginx, mysql, etc) que va a responder en ese puerto.
¿Es seguro dejar el puerto 22 abierto para cualquier IP?
Funcional, pero no ideal. Recomendamos limitar SSH a IPs conocidas (sudo ufw allow from TU_IP to any port 22) o usar sudo ufw limit ssh, que bloquea intentos excesivos de conexión desde el mismo origen. Combínalo con claves SSH (deshabilitando la contraseña) y fail2ban para defensa en profundidad.