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.