Firewall y fail2ban en tu VPS con ufw o firewalld
Antes de activar el firewall, permití el puerto de SSH: si no, se corta tu conexión y no volvés a entrar por red. En Debian y Ubuntu se usa ufw (ufw allow 22/tcp y recién después ufw enable); en AlmaLinux, firewalld, que ya deja pasar SSH por el puerto 22. Probá desde una segunda sesión antes de cerrar la tuya y, si quedaste afuera, entrá por la consola de rescate del panel. Después sumá fail2ban, que bloquea por un rato las IP que fallan varias veces al iniciar sesión por SSH.
Dos capas: el nodo y tu servidor
Los nodos donde corre tu VPS los supervisa un agente de IA las 24 horas: reinicia servicios caídos, bloquea ataques y avisa. Esa es la capa de afuera. La de adentro la administrás vos: qué puertos quedan abiertos en tu servidor y cuántas veces puede alguien probar una contraseña. Para eso están el firewall y fail2ban.
Muchas guías viejas usan CSF (ConfigServer Security & Firewall). ConfigServer, la empresa que lo desarrollaba, cerró el 31 de agosto de 2025 y su sitio de descarga ya no responde. Hay copias mantenidas por otros, pero para una instalación nueva no lo recomendamos. ufw, firewalld y fail2ban se instalan desde los repositorios de cada distribución (fail2ban, en AlmaLinux, desde EPEL) y se actualizan con el sistema.
Debian y Ubuntu: ufw
Ubuntu 24.04 trae ufw instalado pero apagado; en Debian 12 hay que instalarlo. Por defecto bloquea todo lo que entra y deja salir todo, así que alcanza con permitir lo que usás. El orden importa: primero las reglas y después ufw enable.
apt update && apt install ufw
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose- Si SSH usa otro puerto, cambiá
22/tcppor ese, por ejemploufw allow 2222/tcp. ufw enableavisa que puede cortar las conexiones SSH abiertas. Con la regla ya cargada, respondéy.- Abrí otra terminal y conectate de nuevo. Si entra, listo. Si no, desde la sesión que seguís teniendo corré
ufw disabley revisá la regla. - Para sacar una regla,
ufw status numberedlas lista con un número yufw delete 3borra la tercera.
AlmaLinux: firewalld
En AlmaLinux 9 el firewall es firewalld. Suele venir instalado y activo, y ya deja pasar SSH por el puerto 22. Las reglas con --permanent quedan guardadas, pero no se aplican hasta el --reload.
firewall-cmd --state
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
firewall-cmd --list-all- Si SSH usa otro puerto, sumalo con
firewall-cmd --permanent --add-port=2222/tcp. Antes de recargar, confirmá confirewall-cmd --permanent --list-allque tu puerto esté:--reloaddescarta todo lo que se agregó sin--permanent. - Si
firewall-cmd --staterespondenot runningo el comando no existe, instalalo condnf install firewalld. Con SSH en otro puerto, abrilo mientras firewalld está apagado, confirewall-offline-cmd --add-port=2222/tcp, y recién después activalo consystemctl enable --now firewalld. - La línea
servicesdefirewall-cmd --list-allmuestra lo permitido. AlmaLinux también deja pasarcockpit, el panel web del sistema: si no lo usás, sacalo confirewall-cmd --permanent --remove-service=cockpit. - Probá desde una segunda sesión antes de cerrar la que tenés abierta.
Si quedaste afuera
- Abrí la consola de rescate del panel de tu VPS. Muestra la pantalla del servidor sin pasar por su red, así que el firewall no la bloquea.
- Iniciá sesión como
rootcon la contraseña. Las claves SSH no sirven ahí: si no la sabés, primero recuperala. - Apagá el firewall:
ufw disableen Debian y Ubuntu, osystemctl stop firewallden AlmaLinux. - Comprobá que volvés a entrar por SSH, corregí la regla y activalo otra vez con
ufw enableosystemctl start firewalld.
Qué puertos abrir
Abrí solo lo que usás: cada puerto abierto es algo más que se puede atacar. Si un servicio lo usás solo vos, como una base de datos, permitilo solo desde tu IP. En ufw: ufw allow from 203.0.113.24 to any port 3306 proto tcp. En firewalld: firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.24" port port="3306" protocol="tcp" accept'.
| Puerto | Servicio | Cuándo abrirlo |
|---|---|---|
| 22 | SSH | Siempre, o el puerto que uses para SSH: es tu acceso. |
| 80 | HTTP | Si tenés un sitio web. Let's Encrypt también lo usa para validar los certificados. |
| 443 | HTTPS | Si tenés un sitio web. |
| 25 | SMTP | Si tu servidor recibe el correo de tu dominio desde otros servidores. |
| 465 | SMTP con SSL | Si tus usuarios envían correo a través de tu servidor. |
| 587 | SMTP con STARTTLS | Lo mismo que el 465: el envío desde programas de correo y celulares. |
| 993 | IMAP con SSL | Si tus usuarios leen el correo por IMAP. |
| 995 | POP3 con SSL | Si tus usuarios descargan el correo por POP3. |
La salida no hace falta abrirla: ufw y firewalld dejan salir todo por defecto y filtran lo que entra.
fail2ban contra los intentos por SSH
Un servidor con SSH abierto recibe intentos de acceso de bots todo el tiempo. fail2ban lee el registro de SSH y, cuando una IP falla varias veces, la bloquea en el firewall por un tiempo.
Instalalo con apt install fail2ban python3-systemd en Debian y Ubuntu. En AlmaLinux viene de EPEL: dnf install epel-release y después dnf install fail2ban. La configuración va en jail.local y no en jail.conf, que se pisa con cada actualización. En un servidor nuevo, esto crea el archivo y reinicia el servicio. Si ya tenías un jail.local, sumale el bloque [sshd] con tu editor en lugar de pisarlo.
cat > /etc/fail2ban/jail.local <<'EOF'
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
ignoreip = 127.0.0.1/8 ::1
EOF
systemctl enable fail2ban
systemctl restart fail2ban- Con estos valores, 5 fallos en 10 minutos bloquean esa IP durante una hora.
backend = systemdhace que lea el registro del sistema. En Debian 12 es imprescindible: por defecto no existe/var/log/auth.logy, sin esa línea, fail2ban no arranca.- Si SSH usa otro puerto, poné el número en
port, por ejemploport = 2222. Si no coincide, el bloqueo cae en un puerto que nadie usa. - Agregá tu IP fija al final de
ignoreip, separada por un espacio, para no bloquearte a vos mismo.
Ver y desbloquear direcciones
fail2ban-client status sshdmuestra cuántos intentos fallidos hubo y qué IP están bloqueadas.fail2ban-client set sshd unbanip 203.0.113.24desbloquea una IP.- Si la bloqueada es la tuya, entrá desde otra conexión, como los datos del celular, o por la consola de rescate, y desbloqueala desde ahí.
Preguntas frecuentes
¿fail2ban reemplaza a las claves SSH?
No. Frena a quien prueba contraseñas, pero la defensa de fondo es entrar con clave y apagar el acceso con contraseña. Lo recomendable es tener las dos cosas.
¿Conviene cambiar el puerto de SSH?
Baja el ruido en los registros, pero no reemplaza las claves ni fail2ban. Si lo cambiás, abrí el puerto nuevo en el firewall antes de reiniciar SSH, actualizá port en jail.local y no cierres tu sesión hasta entrar por el nuevo. En AlmaLinux, SELinux también tiene que aceptarlo: semanage port -a -t ssh_port_t -p tcp 2222 (si no tenés semanage, está en el paquete policycoreutils-python-utils). En Ubuntu 24.04, SSH escucha a través de ssh.socket: después del cambio corré systemctl daemon-reload y systemctl restart ssh.socket.
¿Por qué un contenedor de Docker se ve desde afuera aunque ufw lo bloquee?
Porque Docker escribe sus propias reglas y los puertos que publica un contenedor no pasan por ufw. Si un servicio no tiene que verse desde internet, publicalo solo en la interfaz local, con -p 127.0.0.1:8080:80, y llegá a él a través del servidor web o por SSH.
¿Y si el bloqueo es en un plan de hosting y no en mi VPS?
Si no podés entrar a tu sitio, al correo o a DirectAdmin de un plan de hosting, y desde otra conexión sí, lo más probable es que el firewall del hosting haya bloqueado tu IP. Ese firewall no lo administrás vos: pedí el desbloqueo desde la página ¿Cuál es mi IP?, en vpsargentina.com/ip/.
Seguí leyendo
Claves SSH desde Linux y macOS para entrar sin contraseña
Generá una clave ed25519, copiala al servidor con ssh-copy-id, sumá un alias y ssh-agent, y mirá qué revisar si el servidor igual te pide la contraseña.
Cómo cambiar o recuperar la clave de root de tu servidor
Cambiá la clave de root con passwd o, si la perdiste, recuperala desde la consola de rescate y el menú de GRUB en Debian, Ubuntu y AlmaLinux, sin reinstalar.
Cómo conectarte por SSH a tu servidor Linux desde Windows
Con la terminal que ya trae Windows 10 y 11, sin instalar nada: la primera conexión, las claves SSH, PuTTY como alternativa y qué hacer si no conecta.