Gratis Te mudamos el sitio y los correos sin cortes ni costo

0810 345 6377 ESEN, cambiar a inglés
InHosting
ESEN, cambiar a inglés

Seguridad

Firewall y fail2ban en un VPS Linux, sin quedarte afuera

Por el equipo técnico de InHosting7 min de lectura

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 con pkill -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 verbose
  • OpenSSH es 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 OpenSSH en lugar de allow, 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 numbered lista las reglas con un número y ufw delete 4 borra la cuarta. También podés borrar escribiendo la regla: ufw delete allow 80,443/tcp.
  • ufw enable avisa que puede cortar las conexiones SSH. Con la regla de SSH ya cargada, respondé y y 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-service dos veces.
  • Sacá cockpit solo 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á con firewall-cmd --permanent --list-all que figura.
  • Si firewalld no está instalado, dnf install firewalld. Con SSH en otro puerto, abrilo con firewall-offline-cmd --add-port=2244/tcp antes de encenderlo con systemctl 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ésAbríTené en cuenta
Un sitio web80 y 443Let's Encrypt usa el 80 para validar, y sirve para redirigir a HTTPS
Correo propio25, 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
DirectAdmin2222Además de los de web y correo
cPanel y WHM2083 y 2087Además de los de web y correo
MySQL, MariaDB o PostgreSQL3306 o 5432, solo desde IP puntualesMejor ninguno: llegá por un túnel SSH o por red privada
Redis o MemcachedNingunoNunca 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 tcp

En 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 --reload

fail2ban: 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.increment alarga el castigo cada vez que la misma IP reincide.
  • backend = systemd lee el registro del sistema. En Debian 12 y 13 hace falta, porque /var/log/auth.log no 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.50 por tu IP fija, si tenés, para no bloquearte a vos mismo.
  • fail2ban-client -t revisa 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.50
  • status sshd muestra los fallos recientes, cuántas IP se bloquearon en total y cuáles siguen bloqueadas.
  • unban libera 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

¿Preferís que lo veamos juntos? Te atiende una persona.

Si la guía no alcanza para tu caso, contanos qué necesitás: te ayudamos a elegir el plan, a migrar o a configurar tu servidor.

Hablar con un técnico