Cómo cambiar el puerto SSH predeterminado (22) y reducir escáneres automatizados
Aprende a cambiar el puerto SSH 22 en Linux con seguridad — sshd_config, firewall UFW, systemd socket y prueba sin bloquearte fuera de la VPS.
El puerto 22 es el objetivo predeterminado de prácticamente todo escáner automatizado de SSH en internet. Botnets como Mirai y sus variantes barren el rango IPv4 entero buscando específicamente servicios expuestos en el 22 — no porque sea el único puerto posible, sino porque es la apuesta con mayor retorno. Resultado: incluso una VPS recién aprovisionada acumula cientos de intentos de login fallidos por hora en los logs antes del primer deploy.
Cambiar el puerto predeterminado no es seguridad real contra un atacante dirigido. Un nmap -p- completo encuentra cualquier puerto SSH en segundos. Pero el objetivo aquí es otro: reducir el ruido operacional. Menos líneas en /var/log/auth.log, menos disparos de fail2ban, menos CPU gastada rechazando conexiones obviamente maliciosas. En tutoriales que recomiendan esto hay una trampa frecuente: el cambio en sshd_config por sí solo no funciona en distros modernas porque systemd intercepta el puerto vía socket activation.
Esta guía lleva cerca de 15 minutos y cubre el procedimiento completo en Ubuntu 22.04/24.04, Debian 12 y variantes RHEL — incluyendo el ajuste en el systemd socket, reglas de firewall con UFW y firewalld, configuración de SELinux cuando aplique, y la prueba obligatoria antes de cerrar la sesión actual.
Requisitos previos
Acceso root o sudo a una VPS Linux, una sesión SSH activa que no vas a cerrar hasta confirmar el nuevo puerto, y un cliente SSH local para abrir una segunda conexión de prueba. Conocimiento básico de editor de texto (nano o vim).
22/tcp 2222/tcp /etc/ssh/sshd_config ssh.service / sshd.service Mantén la sesión SSH actual abierta durante todo el procedimiento. Vas a abrir una segunda conexión para probar el puerto nuevo. Si algo sale mal, la sesión original sigue funcionando como fallback. Cerrarla antes de confirmar es la forma más común de bloquearte fuera de la VPS.
Elegir el nuevo puerto
El nuevo puerto debe ser no privilegiado (por encima de 1024) para evitar la exigencia de root en rebinds, y fuera del rango de servicios conocidos. Rango recomendado: 1024–49151. Por encima de 49152 está el rango de puertos efímeros, que el kernel usa para conexiones de salida — funciona, pero técnicamente compite con sockets dinámicos.
Opciones comunes: 2200, 2222, 22022, 4422. Evita puertos asociados a otros servicios (3306 MySQL, 5432 PostgreSQL, 6379 Redis, 8080 HTTP alternativo). Para este tutorial vamos a usar 2222 como ejemplo — sustituye por el valor que elijas.
Antes de continuar, confirma que el puerto está libre en el servidor:
sudo ss -tlnp | grep :2222
Output esperado: vacío. Si aparece algún proceso, elige otro puerto.
Configurar sshd
Haz backup del archivo de configuración actual antes de cualquier cambio:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bakSi algo se rompe, puedes restaurar con sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config y reiniciar el servicio.
Abre el archivo en el editor:
sudo nano /etc/ssh/sshd_configBusca la línea con #Port 22 (generalmente comentada por defecto) y descoméntala cambiando al puerto nuevo:
Port 2222Guarda y cierra. En nano: Ctrl+O, Enter, Ctrl+X.
Valida la sintaxis de sshd_config antes de reiniciar — este paso evita que el servicio falle silenciosamente:
sudo sshd -tSi no hay output, la sintaxis está ok. Cualquier mensaje de error indica una línea problemática que debe corregirse antes de seguir.
Ajustar el systemd socket (paso crítico)
En Ubuntu 22.04+, Debian 12+ y algunas versiones de Fedora, SSH se activa vía socket de systemd. Esto significa que systemd escucha en el puerto 22 y solo pasa la conexión al daemon cuando recibe una petición. Cambiar solo el sshd_config no tiene efecto en este caso — el socket sigue en el 22.
Verifica si el socket está activo:
sudo systemctl status ssh.socketSi aparece Active: active (listening), el socket está controlando el puerto. Si aparece not-found o inactive, tu distro usa el servicio tradicional y puedes saltar al paso 07.
Deshabilita el socket y usa solo el servicio tradicional — abordaje más limpio y que evita duplicación de configuración:
sudo systemctl stop ssh.socket
sudo systemctl disable ssh.socket
sudo systemctl mask ssh.socketEl mask impide que otros services activen el socket por dependencia. A partir de aquí, solo el sshd_config controla el puerto.
Garantiza que el servicio SSH está habilitado para startup automático:
sudo systemctl enable sshEn distros RHEL-based el nombre del servicio es sshd en lugar de ssh — ajusta según tu distro.
Liberar el nuevo puerto en el firewall
Este paso debe ocurrir ANTES de reiniciar SSH. Si reinicias primero, sshd va a empezar a escuchar en el 2222 pero el firewall va a bloquear las conexiones — y tu sesión actual puede quedar inestable durante el restart.
Si usas UFW (Ubuntu/Debian), libera el nuevo puerto:
sudo ufw allow 2222/tcp comment 'SSH custom port'Confirma que la regla fue añadida:
sudo ufw status numberedNO elimines la regla del puerto 22 todavía — hazlo solo después de confirmar que SSH funciona en el 2222.
Si usas firewalld (CentOS/Rocky/AlmaLinux/Fedora), usa estos comandos en su lugar:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reloadEn proveedores cloud (incluyendo Hostini), confirma también que no hay security group o firewall externo bloqueando el puerto. En el panel de la VPS Hostini, cualquier regla de filtro adicional aparece en “Firewall” — añade 2222/tcp ahí si es necesario.
SELinux (solo RHEL/CentOS/Rocky/AlmaLinux)
En distros con SELinux en modo enforcing, la policy bloquea a sshd de hacer bind en puertos no marcados como ssh_port_t. Sin este ajuste, el servicio falla al reiniciar y el error aparece en /var/log/audit/audit.log.
Instala la utilidad de management de puertos si no está disponible aún:
sudo dnf install -y policycoreutils-python-utilsEn Debian-based SELinux generalmente no está activo, así que salta este paso. Verifica con getenforce — si retorna Disabled o si el comando no existe, ignóralo.
Añade el nuevo puerto al type ssh_port_t:
sudo semanage port -a -t ssh_port_t -p tcp 2222Confirma:
sudo semanage port -l | grep sshEl output esperado debe listar el 2222 junto al 22 con el type ssh_port_t.
Reiniciar y probar
Reinicia el servicio SSH:
sudo systemctl restart sshEn RHEL-based: sudo systemctl restart sshd. Confirma que está escuchando en el puerto nuevo:
sudo ss -tlnp | grep sshOutput esperado: línea con LISTEN 0 128 *:2222 *:* (o variante IPv6). Si todavía aparece :22, el systemd socket no fue enmascarado correctamente — vuelve al paso 05.
SIN cerrar la sesión actual, abre una NUEVA terminal local y prueba la conexión en el puerto nuevo:
ssh -p 2222 usuario@tu_ip_de_la_vpsSi conecta, perfecto. Mantén las dos sesiones abiertas por unos minutos más para confirmar estabilidad — solo entonces cierra la sesión original.
NO cierres la sesión original. Verifica en este orden: firewall (UFW/firewalld), output de ss -tlnp | grep ssh, mensajes en journalctl -u ssh -n 50. En VPS con firewall externo del panel, confirma que el puerto fue liberado ahí también. Si nada resuelve, restaura el backup e investiga con calma.
Cerrar el puerto 22 antiguo
Solo haz este paso después de confirmar que SSH funciona estable en el 2222 por al menos 10 minutos en una sesión de prueba independiente.
sudo ufw delete allow 22/tcp
O en firewalld:
sudo firewall-cmd --permanent --remove-port=22/tcp
sudo firewall-cmd --reload
Confirma que el 22 ya no responde:
ss -tlnp | grep :22
Output esperado: vacío. A partir de aquí, cualquier conexión en el 22 cae inmediatamente en el firewall — exactamente el comportamiento que reduce el ruido en los logs.
Verificación final
Confirma todo de una vez con un snapshot del estado:
sudo ss -tlnp | grep ssh
sudo systemctl status ssh
sudo ufw status
Debes ver: SSH escuchando solo en el 2222, servicio active (running), firewall con 2222/tcp permitido y 22/tcp ausente. En 24 horas, compara el volumen de intentos fallidos:
sudo journalctl -u ssh --since '24 hours ago' | grep -c 'Failed password'
La caída esperada es del 90%+ en comparación con el 22 expuesto — el resto son escáneres que hacen range scan o ya mapearon tu IP.
Próximos pasos
Cambiar el puerto es solo el primer nivel de hardening. Próximos pasos recomendados:
- Deshabilitar autenticación por contraseña (
PasswordAuthentication noen sshd_config) y usar solo claves SSH coned25519. - Configurar fail2ban con jail personalizado para el puerto nuevo — el filtro default del paquete asume 22 y necesita override.
- Restringir login root:
PermitRootLogin prohibit-password(onosi tienes usuario sudo configurado). - Habilitar autenticación de dos factores vía Google Authenticator (
libpam-google-authenticator). - Configurar logging centralizado para correlacionar intentos entre múltiples VPS.
Si estás corriendo esto en producción, una VPS Hostini ya viene con consola serial nativa en el panel — así que incluso si te bloqueas fuera por un error de firewall, es posible recuperar el acceso sin soporte. Conoce las opciones en /vps.
Preguntas frecuentes
¿Cambiar el puerto SSH realmente aumenta la seguridad?
No contra un atacante dirigido — cualquier escaneo completo (nmap -p-) encuentra el puerto nuevo en segundos. La ganancia real es operacional: los escáneres automatizados de botnets apuntan solo al 22, así que moverlo a otro puerto corta el 95% del ruido en los logs y reduce la carga de CPU de fail2ban. Es hardening de bajo costo, no defensa en profundidad.
¿Qué puerto elegir para SSH?
Cualquier puerto alto no privilegiado entre 1024 y 65535 que no entre en conflicto con servicios conocidos. Evita puertos comunes de otros servicios (3306 MySQL, 5432 Postgres, 8080 HTTP alt). Buenas opciones: 2200, 2222, 22022, 49152+. No uses 222 — está registrado para rsh-spx y algunos firewalls corporativos lo bloquean.
¿Por qué mi conexión SSH sigue yendo al puerto 22 incluso después de cambiar el sshd_config?
En distros modernas (Ubuntu 22.04+, Debian 12+, Fedora) SSH se activa vía socket de systemd (ssh.socket), que tiene su propia configuración de puerto independiente del sshd_config. Necesitas editar /lib/systemd/system/ssh.socket o enmascarar el socket y usar solo el servicio. Este es el error más común en tutoriales antiguos.
¿Cómo descubro si algún escáner ya encontró mi nuevo puerto?
Cuenta intentos de auth fallidos por puerto en los últimos días: journalctl -u ssh --since '7 days ago' | grep 'Failed password' | wc -l. Compara antes y después del cambio. Esperado: caída del 90%+ en el volumen. Si sigue alto, el atacante ya mapeó el puerto — considera claves obligatorias (PasswordAuthentication no) y fail2ban.
¿Necesito reabrir el puerto 22 en el firewall después?
No. Después de confirmar que SSH funciona en el puerto nuevo en otra sesión, elimina explícitamente la regla del 22: sudo ufw delete allow 22/tcp. Dejar dos puertos abiertos duplica la superficie de ataque sin ganancia real. Si necesitas un fallback de emergencia, prefiere la consola serial del panel de la VPS.
¿SELinux necesita configuración extra?
Sí, en CentOS/RHEL/Rocky/AlmaLinux con SELinux enforcing. Sin esto, sshd no puede hacer bind en el puerto nuevo — el error queda en /var/log/audit/audit.log. Comando: sudo semanage port -a -t ssh_port_t -p tcp 2222. El paquete policycoreutils-python-utils debe estar instalado. En distros Debian-based SELinux generalmente no está activo, así que el paso no aplica.