Firewall y fail2ban en un VPS Linux, sin quedarte afuera
En pocas palabras
La regla que evita el susto: permití SSH antes de encender el firewall y no cierres tu sesión hasta entrar desde otra. En Debian y Ubuntu, ufw allow OpenSSH y recién después ufw enable; en AlmaLinux, firewalld ya deja pasar SSH y solo sumás lo que uses, como firewall-cmd --permanent --add-service=https, seguido de firewall-cmd --reload. Abrí únicamente los puertos de los servicios que tienen que verse desde afuera. Después instalá fail2ban, que bloquea por un tiempo las IP que fallan varias veces al entrar por SSH.
Tres capas que se complementan
El firewall decide qué puertos se pueden alcanzar desde internet. fail2ban lee los registros y, cuando una IP falla demasiadas veces al iniciar sesión, la bloquea por un rato. Y las claves SSH, con el ingreso por contraseña apagado, dejan a los que prueban contraseñas sin nada que adivinar. Ninguna reemplaza a las otras.
En un Cloud VPS de InHosting el sistema operativo lo administrás vos, y el firewall de adentro también. Si todavía no configuraste el acceso por clave, empezá por las claves SSH y volvé acá.
Antes de tocar nada, preparate la salida
- Dejá abierta la sesión SSH con la que estás trabajando y no la cierres hasta confirmar, desde una segunda, que podés entrar.
- Confirmá en qué puerto escucha tu SSH:
sshd -T | grep -i "^port"te lo dice. - Si vas a probar reglas nuevas en ufw, dejá programado que se apague solo en cinco minutos por si algo sale mal:
nohup sh -c 'sleep 300 && ufw disable' >/dev/null 2>&1 &. Si todo anda, cancelalo conpkill -f "sleep 300". - Si igual quedás afuera, hace falta entrar sin pasar por la red: en los servidores cloud está la consola de rescate; en un Cloud VPS, escribinos por ticket.
Debian y Ubuntu: ufw
Ubuntu 24.04 trae ufw instalado y apagado; en Debian 12 y 13 se instala aparte. Una vez encendido, bloquea todo lo que entra salvo lo que permitas y deja salir todo. El orden importa: primero las reglas, al final ufw enable.
apt update && apt install ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow OpenSSH
ufw allow 80,443/tcp
ufw enable
ufw status verboseOpenSSHes un perfil que instala el paquete del servidor SSH y equivale al puerto 22. Si cambiaste el puerto, usá el número:ufw allow 2244/tcp.- Con
ufw limit OpenSSHen lugar deallow, ufw rechaza a una IP que intenta seis conexiones o más en 30 segundos. No reemplaza a fail2ban, pero frena lo más burdo. ufw status numberedlista las reglas con un número yufw delete 4borra la cuarta. También podés borrar escribiendo la regla:ufw delete allow 80,443/tcp.ufw enableavisa que puede cortar las conexiones SSH. Con la regla de SSH ya cargada, respondéyy probá desde otra terminal.
AlmaLinux: firewalld
En AlmaLinux 9 y 10 el firewall es firewalld. Suele venir instalado y encendido con la zona public, donde ya están permitidos SSH, cockpit y dhcpv6-client. Las reglas se agregan con --permanent y se aplican con --reload; las que cargues sin --permanent se pierden en la próxima recarga.
firewall-cmd --state
firewall-cmd --list-services
firewall-cmd --permanent --add-service={http,https}
firewall-cmd --permanent --remove-service=cockpit
firewall-cmd --reload
firewall-cmd --list-all- Las llaves de
{http,https}las expande bash en dos opciones; si preferís, escribí--add-servicedos veces. - Sacá
cockpitsolo si no usás ese panel web del sistema. - Si cambiaste el puerto de SSH, sumalo antes de recargar con
firewall-cmd --permanent --add-port=2244/tcp, y confirmá confirewall-cmd --permanent --list-allque figura. - Si firewalld no está instalado,
dnf install firewalld. Con SSH en otro puerto, abrilo confirewall-offline-cmd --add-port=2244/tcpantes de encenderlo consystemctl enable --now firewalld.
Qué puertos abrir según lo que corre
Cada puerto abierto es algo más que se puede atacar. Antes de abrir, mirá qué está escuchando de verdad con ss -tulpn: vas a ver cada servicio, su puerto y si escucha en todas las interfaces (0.0.0.0 o [::]) o solo en la local (127.0.0.1). Lo que escucha solo en la local no necesita regla.
| Si corrés | Abrí | Tené en cuenta |
|---|---|---|
| Un sitio web | 80 y 443 | Let's Encrypt usa el 80 para validar, y sirve para redirigir a HTTPS |
| Correo propio | 25, 465, 587 y 993 (995 si usás POP3) | El 25 recibe de otros servidores; 465 y 587 son para que tus usuarios envíen |
| DirectAdmin | 2222 | Además de los de web y correo |
| cPanel y WHM | 2083 y 2087 | Además de los de web y correo |
| MySQL, MariaDB o PostgreSQL | 3306 o 5432, solo desde IP puntuales | Mejor ninguno: llegá por un túnel SSH o por red privada |
| Redis o Memcached | Ninguno | Nunca los expongas a internet |
La salida no hace falta abrirla: por defecto sale todo y se filtra lo que entra.
Un puerto abierto solo para tu IP
Para un servicio que usás solo vos, como la base de datos durante una migración, abrilo únicamente para tu dirección. En ufw:
ufw allow from 203.0.113.50 to any port 5432 proto tcpEn firewalld, con una regla enriquecida:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.50" port port="5432" protocol="tcp" accept'
firewall-cmd --reloadfail2ban: bloqueo temporal para quien insiste
A un SSH abierto le llegan intentos de ingreso de bots desde el primer día. fail2ban mira el registro del sistema y, cuando una IP acumula fallos, le cierra el paso en el firewall durante el tiempo que definas.
Se instala con apt install fail2ban python3-systemd en Debian y Ubuntu. En AlmaLinux está en EPEL: dnf install epel-release y después dnf install fail2ban, que ya lo deja trabajando con firewalld. Tu configuración va en un archivo propio dentro de /etc/fail2ban/jail.d/, nunca en jail.conf, que se reemplaza con cada actualización:
cat > /etc/fail2ban/jail.d/sshd.local <<'EOF'
[sshd]
enabled = true
backend = systemd
port = ssh
maxretry = 4
findtime = 15m
bantime = 2h
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 203.0.113.50
EOF
fail2ban-client -t
systemctl enable fail2ban
systemctl restart fail2ban- Con estos valores, cuatro fallos en 15 minutos bloquean la IP por dos horas, y
bantime.incrementalarga el castigo cada vez que la misma IP reincide. backend = systemdlee el registro del sistema. En Debian 12 y 13 hace falta, porque/var/log/auth.logno existe salvo que instales rsyslog.- Si SSH escucha en otro puerto, poné el número en
port. Si no coincide, el bloqueo cae sobre un puerto que nadie usa. - Reemplazá
203.0.113.50por tu IP fija, si tenés, para no bloquearte a vos mismo. fail2ban-client -trevisa la configuración antes de reiniciar: si hay un error, te lo dice sin dejar el servicio caído.
Ver quién está bloqueado y liberar una IP
fail2ban-client status sshd
fail2ban-client unban 203.0.113.50status sshdmuestra los fallos recientes, cuántas IP se bloquearon en total y cuáles siguen bloqueadas.unbanlibera la IP en todas las reglas de fail2ban a la vez.- Si la bloqueada es la tuya, entrá desde otra conexión, como los datos del celular, y liberala desde ahí.
En el hosting, el firewall es nuestro
Todo esto vale para un VPS o un servidor donde sos root. En un plan de hosting, el firewall lo administra InHosting y bloquea la IP que acumula intentos fallidos de contraseña en el panel, el correo o el FTP. Si un día no podés entrar a nada desde tu oficina y desde el celular con datos sí, es eso: pedí el desbloqueo en la página de desbloqueo de IP.
Preguntas frecuentes
¿Hace falta firewall si ya entro solo con clave SSH?
Sí. La clave protege el SSH, pero no a los otros servicios que tal vez escuchan sin que lo sepas: una base de datos con su configuración de fábrica, un panel de pruebas, un servicio de desarrollo. El firewall cierra todo lo que no abriste a propósito.
¿Por qué un contenedor de Docker se ve desde internet si ufw lo bloquea?
Docker agrega sus propias reglas al firewall del sistema, y los puertos que publica un contenedor no pasan por las de ufw. Si un servicio no tiene que verse desde afuera, publicalo solo en la interfaz local, por ejemplo con -p 127.0.0.1:8080:80, y llegá a él a través del servidor web o de un túnel SSH.
¿Me conviene mover SSH a otro puerto?
Reduce el ruido en los registros, pero no te protege de nadie que te busque en serio. Si lo hacés, abrí el puerto nuevo en el firewall antes de reiniciar SSH, actualizá port en fail2ban y no cierres la sesión hasta entrar por el nuevo. En AlmaLinux, SELinux también tiene que permitirlo: semanage port -a -t ssh_port_t -p tcp 2244. En Ubuntu 24.04, SSH arranca por socket: después del cambio corré systemctl daemon-reload y systemctl restart ssh.socket.
¿fail2ban sirve para algo más que SSH?
Sí. Trae reglas listas para el servidor web, el correo y otros servicios, que se activan igual, con un bloque propio y enabled = true. Una muy útil es recidive, que detecta las IP bloqueadas varias veces y las aparta por mucho más tiempo.
Seguí leyendo
Claves SSH para entrar a tu servidor sin contraseña
Generar una clave ed25519 en Linux, macOS o Windows, cargarla en el servidor, usar el agente y apagar el acceso por contraseña sin quedarte afuera.
8 min de lectura
Primeros pasos con tu VPS: la primera hora, en orden
Qué hacer apenas recibís un VPS con Linux, antes de instalar tu aplicación: actualizar, crear tu usuario, entrar con clave SSH, firewall, hora y respaldos.
5 min de lectura
IP bloqueada en el hosting: por qué pasa y cómo pedir el desbloqueo
Panel, correo y FTP dejan de responderte mientras el sitio les anda a los demás: el firewall bloqueó tu IP. Cómo confirmarlo, destrabarlo y que no se repita.
5 min de lectura
