Una instalación por defecto escucha en más puertos de los que crees. Un cortafuegos que deniega por defecto convierte «lo que podría estar expuesto» en «lo que abrí a propósito», que es una lista mucho más corta y mucho más fácil de razonar.

Mira primero qué está escuchando

ss -tulpn | grep LISTEN

Todo lo que esté enlazado a 0.0.0.0 es alcanzable desde internet. Una base de datos que solo deba alcanzarse en local tiene que enlazarse a 127.0.0.1, y ese es un arreglo en el servicio, no en el cortafuegos.

Permite SSH antes de activarlo

Activar un cortafuegos que deniega por defecto sin permitir antes SSH te desconecta, y no hay vuelta atrás salvo la consola del proveedor. Es, con diferencia, la manera más común de quedarse fuera del propio servidor.
ufw allow OpenSSH
ufw allow 80,443/tcp
ufw default deny incoming
ufw default allow outgoing
ufw enable

Compruébalo

ufw status verbose

Lo que un cortafuegos no hace

  • No detiene un ataque contra el puerto 443: ese puerto está abierto por diseño, y todo lo que llega a tu aplicación entra por ahí.
  • No parchea nada. A un plugin desactualizado se llega por el puerto que querías abrir.
  • No protege de una contraseña robada en un servicio que permitiste.

Limita la tasa de SSH

ufw limit OpenSSH

Eso rechaza una dirección tras seis intentos en treinta segundos. Con claves ya exigidas es cinturón y tirantes, y mantiene el registro legible.

Anota en un comentario por qué existe cada regla. Dentro de un año, la pregunta «¿puedo cerrar esto?» no tendrá respuesta sin eso, así que nadie cerrará nada.