Cualquier servidor con el puerto 22 abierto a Internet recibe miles de intentos de login automatizados al día. Mover SSH a otro puerto no sustituye a la autenticación por claves ni a un firewall, pero elimina casi todo ese ruido de los logs y reduce la carga de Fail2Ban. En esta guía cambiarás el puerto SSH sin arriesgarte a quedarte fuera: primero abrirás el nuevo puerto manteniendo el 22, lo probarás y solo entonces cerrarás el antiguo. Los pasos principales son para Ubuntu 24.04, que gestiona SSH con activación por socket de systemd, e incluyen las diferencias para Debian 12 y Rocky Linux 9.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS, Debian 12 o Rocky Linux 9, por ejemplo un VPS de CubePath.
- Un usuario no root con privilegios
sudoy acceso SSH funcionando. - Un firewall activo: UFW en Ubuntu/Debian o firewalld en Rocky Linux. La guía de configuración inicial de seguridad explica cómo activarlo.
- Acceso a la consola del panel de CubePath como vía de emergencia si algo sale mal.
Importanteno cierres tu sesión SSH actual hasta el final de la guía. Todas las pruebas se hacen desde una segunda terminal.
Paso 1: Elegir el nuevo puerto
Elige un puerto entre 1024 y 32767 que no use otro servicio. Evita el rango 32768-60999, que Linux reserva por defecto para las conexiones salientes, y puertos conocidos como 3306, 5432 u 8080. En esta guía se usa 2222; sustitúyelo por el tuyo en todos los comandos.
Comprueba que nada escucha ya en ese puerto. Si el comando no devuelve nada, está libre:
sudo ss -tlnp | grep ':2222 '
Paso 2: Abrir el nuevo puerto en el firewall
Abre el puerto antes de cambiar SSH. Si lo haces al revés, el servicio empezará a escuchar en un puerto que el firewall bloquea.
En Ubuntu y Debian con UFW:
sudo ufw allow 2222/tcp
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2222/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
2222/tcp (v6) ALLOW Anywhere (v6)
En Rocky Linux con firewalld:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
2222/tcp
Si además filtras el tráfico en un firewall externo, de red o de otro proveedor, abre allí también el puerto.
Paso 3: Registrar el puerto en SELinux (solo Rocky Linux)
En Rocky Linux, SELinux solo deja que sshd escuche en puertos etiquetados como ssh_port_t. Si te saltas este paso, el servicio no arrancará en el nuevo puerto. Instala semanage y añade el puerto:
sudo dnf install -y policycoreutils-python-utils
sudo semanage port -a -t ssh_port_t -p tcp 2222
Comprueba que está registrado:
sudo semanage port -l | grep ssh_port_t
ssh_port_t tcp 2222, 22
Si semanage responde que el puerto ya está definido, es que otra política lo usa; cambia su tipo con -m en lugar de -a, o elige otro puerto. En Ubuntu y Debian este paso no es necesario.
Paso 4: Configurar sshd para escuchar en ambos puertos
Durante la transición, SSH escuchará en el 22 y en el nuevo puerto a la vez, así tienes una red de seguridad. Crea un archivo propio en /etc/ssh/sshd_config.d/ en lugar de editar sshd_config, que puede sobrescribirse al actualizar:
sudo nano /etc/ssh/sshd_config.d/10-port.conf
Port 22
Port 2222
Cada línea Port añade un puerto de escucha. En cuanto defines uno, el 22 deja de usarse por defecto, por eso se incluye explícitamente. Valida la sintaxis (sin salida si todo está bien) y comprueba los puertos efectivos:
sudo sshd -t
sudo sshd -T | grep '^port'
port 22
port 2222
Notasi
sshd -Tno muestra el 2222, revisa que ningún otro archivo de/etc/ssh/sshd_config.d/ni el propio/etc/ssh/sshd_configtengan una líneaPortsin comentar.
Paso 5: Aplicar el cambio
La forma de aplicar el cambio depende de la distribución.
Ubuntu 24.04. SSH usa activación por socket: quien escucha en el puerto es la unidad ssh.socket de systemd, no sshd. Un generador de systemd lee los puertos de la configuración de SSH, por lo que hay que recargar systemd y reiniciar el socket:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
Si en tu servidor desactivaste la activación por socket (systemctl is-active ssh.socket devuelve inactive), usa sudo systemctl restart ssh en su lugar.
Debian 12. No usa activación por socket; reinicia el servicio:
sudo systemctl restart ssh
Rocky Linux 9. El servicio se llama sshd:
sudo systemctl restart sshd
Las sesiones SSH abiertas no se cortan al reiniciar. Comprueba que el sistema escucha en los dos puertos:
sudo ss -tlnp | grep -E ':(22|2222) '
LISTEN 0 4096 0.0.0.0:2222 0.0.0.0:* users:(("systemd",pid=1,fd=110))
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:* users:(("systemd",pid=1,fd=109))
LISTEN 0 4096 [::]:2222 [::]:* users:(("systemd",pid=1,fd=112))
LISTEN 0 4096 [::]:22 [::]:* users:(("systemd",pid=1,fd=111))
En Ubuntu 24.04 el proceso que aparece es systemd, porque es quien mantiene el socket. En Debian y Rocky Linux verás sshd.
Paso 6: Probar el nuevo puerto
Desde una segunda terminal en tu equipo local, conéctate indicando el puerto con -p:
ssh -p 2222 your_user@your_server_ip
Si entras sin problemas, el nuevo puerto funciona. Para no tener que escribir -p cada vez, añade el puerto a tu ~/.ssh/config local:
Host mi-vps
HostName your_server_ip
User your_user
Port 2222
Con esto basta con ssh mi-vps. Recuerda que scp usa -P (mayúscula) para el puerto, mientras que rsync lo recibe con -e "ssh -p 2222"; con el alias de ~/.ssh/config ninguno de los dos lo necesita.
Paso 7: Actualizar Fail2Ban
Si usas Fail2Ban, su jail sshd bloquea por defecto el puerto ssh (22). Con SSH en otro puerto, las IPs bloqueadas podrían seguir intentándolo en el nuevo. Edita tu jail.local:
sudo nano /etc/fail2ban/jail.local
Añade la línea port a la sección [sshd]:
[sshd]
enabled = true
backend = systemd
port = 2222
Reinicia Fail2Ban y comprueba que la jail sigue activa:
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
Paso 8: Cerrar el puerto 22
Una vez confirmado que entras por el nuevo puerto, quita el 22 de la configuración:
sudo nano /etc/ssh/sshd_config.d/10-port.conf
Port 2222
Valida y aplica el cambio igual que en el paso 5. En Ubuntu 24.04:
sudo sshd -t
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
Después elimina la regla del firewall para el 22. En Ubuntu y Debian:
sudo ufw delete allow OpenSSH
sudo ufw status
En Rocky Linux:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
Comprueba desde tu equipo local que el 22 ya no responde y que el nuevo puerto sí:
nc -vz -w 5 your_server_ip 22
nc -vz -w 5 your_server_ip 2222
nc: connect to your_server_ip port 22 (tcp) timed out: Operation now in progress
Connection to your_server_ip 2222 port [tcp/*] succeeded!
Abre una última conexión nueva con ssh mi-vps antes de cerrar la sesión original.
Solución de problemas
Connection refused en el nuevo puerto. El puerto llega al servidor pero nada escucha en él. En Ubuntu 24.04 es casi siempre porque falta sudo systemctl daemon-reload antes de reiniciar ssh.socket. Comprueba lo que escucha realmente con sudo ss -tlnp.
Connection timed out en el nuevo puerto. El firewall bloquea el paquete. Revisa sudo ufw status o sudo firewall-cmd --list-all, y cualquier firewall externo.
sshd no arranca en Rocky Linux. Revisa sudo journalctl -u sshd -n 20. Un error como error: Bind to port 2222 on 0.0.0.0 failed: Permission denied indica que falta la etiqueta de SELinux del paso 3.
Te has quedado sin acceso. Entra por la consola del panel de CubePath, vuelve a añadir Port 22 a /etc/ssh/sshd_config.d/10-port.conf, abre el 22 en el firewall (sudo ufw allow OpenSSH) y aplica el cambio como en el paso 5.
Conclusión
SSH escucha ahora solo en tu puerto personalizado, el firewall y Fail2Ban están alineados con él y tu cliente se conecta con un alias. Recuerda que esto reduce el ruido, pero la protección real sigue viniendo de usar solo claves SSH y desactivar el login de root. Como siguientes pasos, revisa la configuración inicial de seguridad de tu distribución y la gestión de claves SSH si vas a dar acceso a más personas.
