Firewall y fail2ban en tu VPS con ufw o firewalld

· 7 min de lectura · por el equipo técnico de VPS Argentina

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
  1. Si SSH usa otro puerto, cambiá 22/tcp por ese, por ejemplo ufw allow 2222/tcp.
  2. ufw enable avisa que puede cortar las conexiones SSH abiertas. Con la regla ya cargada, respondé y.
  3. Abrí otra terminal y conectate de nuevo. Si entra, listo. Si no, desde la sesión que seguís teniendo corré ufw disable y revisá la regla.
  4. Para sacar una regla, ufw status numbered las lista con un número y ufw delete 3 borra 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
  1. Si SSH usa otro puerto, sumalo con firewall-cmd --permanent --add-port=2222/tcp. Antes de recargar, confirmá con firewall-cmd --permanent --list-all que tu puerto esté: --reload descarta todo lo que se agregó sin --permanent.
  2. Si firewall-cmd --state responde not running o el comando no existe, instalalo con dnf install firewalld. Con SSH en otro puerto, abrilo mientras firewalld está apagado, con firewall-offline-cmd --add-port=2222/tcp, y recién después activalo con systemctl enable --now firewalld.
  3. La línea services de firewall-cmd --list-all muestra lo permitido. AlmaLinux también deja pasar cockpit, el panel web del sistema: si no lo usás, sacalo con firewall-cmd --permanent --remove-service=cockpit.
  4. Probá desde una segunda sesión antes de cerrar la que tenés abierta.

Si quedaste afuera

  1. 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.
  2. Iniciá sesión como root con la contraseña. Las claves SSH no sirven ahí: si no la sabés, primero recuperala.
  3. Apagá el firewall: ufw disable en Debian y Ubuntu, o systemctl stop firewalld en AlmaLinux.
  4. Comprobá que volvés a entrar por SSH, corregí la regla y activalo otra vez con ufw enable o systemctl 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'.

PuertoServicioCuándo abrirlo
22SSHSiempre, o el puerto que uses para SSH: es tu acceso.
80HTTPSi tenés un sitio web. Let's Encrypt también lo usa para validar los certificados.
443HTTPSSi tenés un sitio web.
25SMTPSi tu servidor recibe el correo de tu dominio desde otros servidores.
465SMTP con SSLSi tus usuarios envían correo a través de tu servidor.
587SMTP con STARTTLSLo mismo que el 465: el envío desde programas de correo y celulares.
993IMAP con SSLSi tus usuarios leen el correo por IMAP.
995POP3 con SSLSi 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
  1. Con estos valores, 5 fallos en 10 minutos bloquean esa IP durante una hora.
  2. backend = systemd hace que lea el registro del sistema. En Debian 12 es imprescindible: por defecto no existe /var/log/auth.log y, sin esa línea, fail2ban no arranca.
  3. Si SSH usa otro puerto, poné el número en port, por ejemplo port = 2222. Si no coincide, el bloqueo cae en un puerto que nadie usa.
  4. 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 sshd muestra cuántos intentos fallidos hubo y qué IP están bloqueadas.
  • fail2ban-client set sshd unbanip 203.0.113.24 desbloquea 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