Saltar a contenido

Configurar UFW

Ubuntu/Debian

Esta página usa UFW, el firewall por defecto en Ubuntu/Debian. Si tu servidor usa Fedora/RHEL, consulta Configurar firewalld.

Un servidor sin firewall expone todos los puertos que tenga abiertos — servicios que ni siquiera estás usando pueden convertirse en puntos de entrada. UFW simplifica la gestión de iptables con una interfaz directa: defines qué puertos abrir y el resto queda bloqueado por defecto.

Cómo funciona

UFW funciona como una lista blanca de tráfico permitido:

  • Política por defecto: denegar todo lo entrante, permitir todo lo saliente.
  • Excepciones: solo los puertos que abras explícitamente (SSH, HTTP, HTTPS).
  • Integración con Fail2ban: las jaulas de Fail2ban crean reglas de UFW automáticamente para bloquear IPs sospechosas.

Firewall: solo SSH y HTTP/HTTPS (y el panel de control, si usas uno).

Enfoque por niveles

Cada nivel abre lo necesario según el servicio. Puedes parar en el que quieras — los niveles 1 y 2 son obligatorios (sin ellos no entras ni trabajas).

Nivel Qué configura ¿Aplicarlo?
1 Política por defecto Obligatorio
2 SSH Obligatorio
3 HTTP/HTTPS Según servidor web
4 Puertos extra y límites Opcional

Nivel 1 — Política por defecto

Obligatorio. Niega todo el tráfico entrante y permite el saliente — la base de la lista blanca.

  1. Comprobar si ya está instalado:

    dpkg -l | grep ufw
    
  2. Instalar si hace falta:

    sudo apt install ufw
    
  3. Ver estado actual:

    sudo ufw status verbose
    
  4. Política por defecto (denegar entrante, permitir saliente):

    sudo ufw default deny incoming
    sudo ufw default allow outgoing
    

     

    La política se guarda aunque UFW siga inactivo. No lo actives todavía: primero abre SSH en el Nivel 2, o te quedarás fuera en el intento.

Nivel 2 — SSH

Obligatorio. Sin esta excepción, activar el firewall te deja sin acceso al servidor.

  1. Abrir SSH:

    sudo ufw allow ssh
    

    Si tu SSH no usa el puerto 22, abre el puerto real:

    sudo ufw allow 2222/tcp
    
  2. Revisar las reglas antes de activar (con UFW todavía inactivo, las reglas ya están guardadas aunque no se apliquen aún):

    sudo ufw show added
    

    Confirma que solo está lo que quieres — sobre todo que allow ssh está en la lista, para no quedarte fuera al activar.

  3. Activar y confirmar que las reglas están aplicadas:

    sudo ufw enable
    sudo ufw status numbered
    

Nivel 3 — HTTP/HTTPS

Según el servidor web que tengas. Abre 80/443 para que el tráfico web llegue.

  1. Abrir los puertos según el servidor web:

    UFW trae un perfil de aplicación que abre 80 y 443 a la vez:

    sudo ufw allow 'Apache Full'
    

    Abre los puertos a mano:

    sudo ufw allow http
    sudo ufw allow https
    

    Si Traefik hace de proxy dentro de Docker, abre los puertos que publiques en el host (normalmente 80/443 mapeados desde el contenedor):

    sudo ufw allow http
    sudo ufw allow https
    

    UFW filtra el tráfico que llega al host; una vez dentro, Docker/Traefik gestionan el enrutado interno.

Nivel 4 — Puertos extra y límites

Opcional, según los servicios que corran en el servidor (agentes de monitorización, paneles, APIs) y si quieres frenar la fuerza bruta sobre SSH.

  1. Abrir el puerto de los servicios que lo necesiten — ejemplo del agente Beszel:

    sudo ufw allow 45876/tcp
    
  2. Rate limiting sobre SSH — UFW limita a 6 conexiones nuevas por 30 segundos; IPs que lo superen quedan bloqueadas temporalmente:

    sudo ufw limit ssh
    

     

    Es una capa adicional a Fail2ban a nivel de conexiones. Cuida que un script con muchas conexiones legítimas no se quede fuera.

  3. Comprobar el estado final:

    sudo ufw status numbered
    

Verificar

  1. Confirmar el estado y las reglas aplicadas:

    sudo ufw status verbose
    

Para una prueba en vivo, intenta conectar desde fuera a un puerto no abierto (debe rechazarse) y a SSH (debe funcionar).

Y ahora qué

UFW está activo con las reglas mínimas. El siguiente paso es Fail2ban para bloquear intentos de intrusión repetidos.