Tutoriales 8 min de lectura

Configurar firewall en Linux con UFW — reglas esenciales

Guía paso a paso para configurar UFW (Uncomplicated Firewall) en Ubuntu y Debian con las reglas esenciales para proteger servidores de producción.

Terminal de Linux mostrando reglas de firewall UFW activas protegiendo un servidor de producción
Terminal de Linux mostrando reglas de firewall UFW activas protegiendo un servidor de producción

Un servidor expuesto a internet sin firewall es una invitación abierta. Cada minuto que tu servidor está en línea, bots automatizados escanean puertos, intentan accesos SSH por fuerza bruta y buscan servicios mal configurados. UFW (Uncomplicated Firewall) es la herramienta estándar en Ubuntu y Debian para cerrar todo lo que no necesitas y dejar abierto solo lo indispensable.

En esta guía vas a configurar UFW desde cero con las reglas que todo servidor de producción necesita.

Requisitos previos

Necesitas un servidor con Ubuntu 20.04+ o Debian 11+ y acceso SSH con privilegios sudo. UFW viene preinstalado en Ubuntu; en Debian instálalo con:

sudo apt update && sudo apt install ufw -y

¡Importante!

Antes de habilitar UFW, asegúrate de crear la regla de SSH. Si activas el firewall sin permitir SSH, perderás el acceso al servidor.

Paso 1: Verificar estado actual

sudo ufw status verbose

Si nunca has configurado UFW, verás Status: inactive. Bien — vamos a configurarlo antes de activarlo.

Paso 2: Configurar políticas por defecto

La filosofía correcta de firewall es denegar todo por defecto y permitir solo lo necesario:

# Bloquear todo el tráfico entrante
sudo ufw default deny incoming

# Permitir todo el tráfico saliente
sudo ufw default allow outgoing

Con esto, ningún servicio es accesible desde fuera hasta que tú lo permitas explícitamente.

Paso 3: Permitir SSH (antes de activar)

Esta es la regla más importante. Sin ella, te quedas fuera del servidor:

# SSH en puerto estándar (22)
sudo ufw allow ssh

# O si cambiaste el puerto SSH (recomendado en producción)
sudo ufw allow 2222/tcp comment 'SSH puerto custom'

Buena práctica

Cambiar el puerto SSH del 22 a otro número reduce drásticamente los intentos de fuerza bruta automatizados. No es seguridad real (un escaneo de puertos lo encuentra), pero elimina el 99% del ruido en tus logs.

Paso 4: Activar UFW

Ahora sí, con SSH permitido, activa el firewall:

sudo ufw enable

UFW te advierte que puede interrumpir conexiones SSH. Como ya creaste la regla, confirma con y. Verifica:

sudo ufw status numbered

Deberías ver tu regla de SSH listada.

Paso 5: Agregar reglas para tus servicios

Ahora agrega reglas solo para los servicios que tu servidor necesita exponer. Aquí las más comunes:

Servidor web (HTTP y HTTPS)

sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

Base de datos PostgreSQL (solo desde IPs específicas)

# NUNCA abras la base de datos a todo internet
# Permite solo desde tu servidor de aplicación
sudo ufw allow from 10.0.1.10 to any port 5432 comment 'PostgreSQL desde app server'

Base de datos MySQL (solo desde IPs específicas)

sudo ufw allow from 10.0.1.10 to any port 3306 comment 'MySQL desde app server'

Redis (solo desde red local)

sudo ufw allow from 10.0.1.0/24 to any port 6379 comment 'Redis desde red interna'

Monitoreo (Zabbix agent)

sudo ufw allow from 10.0.1.5 to any port 10050 comment 'Zabbix agent'

Reglas avanzadas

Permitir un rango de puertos

sudo ufw allow 8000:8100/tcp comment 'Rango de puertos para apps'

Limitar intentos de conexión (rate limiting)

UFW puede limitar las conexiones por IP — útil para proteger SSH sin necesidad de fail2ban:

# Máximo 6 conexiones en 30 segundos por IP
sudo ufw limit ssh comment 'Rate limit SSH'

Si una IP intenta más de 6 conexiones en 30 segundos, UFW la bloquea temporalmente.

Bloquear una IP específica

# Bloquear una IP que está atacando
sudo ufw deny from 203.0.113.50 comment 'IP bloqueada por ataque'

# Bloquear una subred completa
sudo ufw deny from 203.0.113.0/24 comment 'Subred bloqueada'

Permitir tráfico solo por interfaz de red

# Permitir PostgreSQL solo en la interfaz de red interna
sudo ufw allow in on eth1 to any port 5432 comment 'PostgreSQL solo red interna'

Gestionar reglas existentes

Ver reglas numeradas

sudo ufw status numbered

Ejemplo de salida:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere        # SSH
[ 2] 80/tcp                     ALLOW IN    Anywhere        # HTTP
[ 3] 443/tcp                    ALLOW IN    Anywhere        # HTTPS
[ 4] 5432                       ALLOW IN    10.0.1.10       # PostgreSQL desde app

Eliminar una regla

# Por número
sudo ufw delete 4

# Por definición
sudo ufw delete allow 80/tcp

Resetear todo

# Borra todas las reglas y desactiva UFW
sudo ufw reset

Configuración completa para un servidor típico

Aquí un ejemplo de configuración completa para un servidor que corre una aplicación web con PostgreSQL, Redis y monitoreo:

#!/bin/bash
# setup-firewall.sh — Configuración de UFW para servidor de producción

set -e

# Reset
sudo ufw --force reset

# Políticas por defecto
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH (cambiar puerto en producción)
sudo ufw limit 22/tcp comment 'SSH con rate limit'

# Web
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# PostgreSQL solo desde app server
sudo ufw allow from 10.0.1.10 to any port 5432 comment 'PostgreSQL'

# Redis solo desde red interna
sudo ufw allow from 10.0.1.0/24 to any port 6379 comment 'Redis'

# Zabbix agent desde servidor de monitoreo
sudo ufw allow from 10.0.1.5 to any port 10050 comment 'Zabbix'

# Activar
sudo ufw --force enable

# Verificar
sudo ufw status verbose

echo "Firewall configurado correctamente."

Guárdalo como script para poder reproducir la configuración en cualquier servidor nuevo.

Verificar que funciona

Después de configurar UFW, verifica desde otra máquina que solo los puertos permitidos estén abiertos:

# Desde otra máquina, escanea los puertos del servidor
nmap -Pn tuservidor.com

Solo deberías ver los puertos que abriste (22, 80, 443). Todo lo demás debería aparecer como filtered.

Siguientes pasos

UFW es tu primera línea de defensa. Para completar la seguridad de tu servidor:

  • fail2ban — bloqueo automático de IPs que intentan fuerza bruta contra SSH, Nginx o cualquier servicio
  • Hardening SSH — desactivar acceso con contraseña, solo llaves, cambiar puerto y desactivar root login
  • Actualizaciones automáticasunattended-upgrades para que los parches de seguridad se apliquen solos
  • Ciberseguridad completa — auditoría profesional, pentesting y hardening basado en CIS benchmarks

Seguridad empresarial

¿Necesitas un hardening profesional de tus servidores?

Auditamos la seguridad de tu infraestructura y aplicamos hardening basado en benchmarks CIS para que tus servidores estén protegidos de verdad.

Solicitar auditoría de seguridad

Preguntas frecuentes

Temas relacionados

#linux#seguridad#firewall#ufw#ubuntu#tutorial

¿Te fue útil? Compártelo

Artículos relacionados

Ver todos

Consultoría gratuita

¿Necesitas un hardening profesional de tus servidores?

Auditamos la seguridad de tu infraestructura y aplicamos hardening basado en benchmarks CIS para que tus servidores estén protegidos de verdad.

Solicitar auditoría de seguridad