Cómo cambiar el puerto SSH sin quedarte fuera del servidor

Mantén tu sesión abierta. Abre el puerto nuevo en el firewall, añade Port 22 y Port 2222 a la configuración de sshd y aplícala. En Ubuntu reciente eso significa sudo systemctl daemon-reload y sudo systemctl restart ssh.socket. Prueba ssh -p 2222 user@server en una terminal nueva y después quita el puerto 22. Reduce el ruido en los logs, no los ataques reales.

Actualizada el . Procedimiento completo ejecutado en Ubuntu 24.04 y 26.04 (socket y ufw), Debian 13 (servicio) y Rocky Linux 9 (firewalld), todo en contenedores desechables con systemd.

De qué protege y de qué no

Un puerto nuevo detiene los escaneos automáticos que solo prueban el puerto 22, así que tus logs se quedan mucho más tranquilos. Ese es todo el beneficio. Un escaneo de todos los puertos sigue encontrando SSH, porque el servidor se anuncia en cuanto algo se conecta. Las contraseñas débiles siguen siendo débiles en cualquier puerto. Haz primero lo que de verdad importa: desactiva el acceso con contraseña y revisa la configuración de sshd.

También tiene pequeños costes: ahora todas las herramientas necesitan el puerto, y tu known_hosts trata el puerto nuevo como una entrada nueva, así que confirmas la huella otra vez.

Elige un puerto que no use nada más. Los puertos por debajo de 1024 solo los puede abrir root, lo cual es una pequeña ventaja si sshd llega a caerse.

1. Deja una vía de vuelta

Mantén tu sesión actual abierta hasta el último paso. Una sesión existente normalmente sobrevive al reinicio de sshd, así que es tu vía de vuelta. Si puedes acceder a una consola de tu proveedor, localízala antes de empezar.

2. Abre primero el puerto nuevo

Con ufw:

sudo ufw allow 2222/tcp

Con firewalld, en RHEL, Rocky, AlmaLinux y Fedora:

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

Un servidor en la nube suele tener además un firewall o grupo de seguridad en el panel del proveedor. Abre allí el puerto también. Ese es el motivo más frecuente de un timeout tras este cambio.

SELinux

En sistemas de la familia RHEL con SELinux en modo enforcing, sshd no puede usar un puerto nuevo hasta que lo etiquetes. El sshd_config por defecto de esos sistemas también lo indica. Comprueba y añade la etiqueta:

getenforce
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh

Si getenforce dice Disabled, sáltatelo. En ese estado semanage falla con SELinux policy is not managed or store cannot be accessed, lo cual es inofensivo. Si falta semanage, viene en el paquete policycoreutils-python-utils.

3. Añade el puerto nuevo junto al antiguo

No sustituyas aún el puerto antiguo. Crea un archivo pequeño, que deja intacta la configuración principal:

printf 'Port 22\nPort 2222\n' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -t

Si sshd -t no muestra nada, la sintaxis es válida. Los sistemas antiguos sin esa carpeta necesitan las mismas dos líneas en /etc/ssh/sshd_config.

4. Aplícalo: depende del sistema

Primero averigua en qué caso estás:

systemctl is-active ssh.socket

Dice active (Ubuntu 24.04 y 26.04 por defecto). El socket sujeta el puerto y se genera a partir de tu configuración, así que reiniciar el servicio no basta:

sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

Esta es la trampa habitual. En nuestra prueba, sudo systemctl restart ssh a secas dejó los puertos antiguos escuchando y no dio ningún error.

Dice inactive (Debian, Ubuntu 22.04):

sudo systemctl restart ssh

Familia RHEL, donde el servicio tiene otro nombre:

sudo systemctl restart sshd

Ubuntu 22.10 a 23.10 usaban el socket de otra forma y ya no tienen soporte. Allí, comprueba systemctl cat ssh.socket antes de fiarte de estos pasos.

Ahora comprueba que ambos puertos están escuchando:

ss -tln | grep -E ':(22|2222)\b'

5. Prueba desde una terminal nueva

Deja abierta la sesión antigua y, desde tu propia máquina, ejecuta:

ssh -p 2222 user@server

Un timeout significa que un firewall sigue estorbando. Connection refused significa que nada escucha, o que SELinux impidió que sshd enlazara el puerto. Arréglalo ahora, mientras el puerto 22 aún funciona.

6. Cierra el puerto 22

Solo cuando la prueba funcione:

echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -t

Si el /etc/ssh/sshd_config principal tiene una línea Port 22 sin comentar, coméntala también, o sshd seguirá escuchando allí. Aplícalo como en el paso 4, confirma con sudo sshd -T | grep -i ^port y luego elimina la regla antigua del firewall, con la que corresponda:

sudo ufw delete allow 22/tcp
sudo ufw delete allow OpenSSH
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload

Prueba una vez más en una terminal nueva y solo entonces cierra la sesión antigua.

Actualiza tu cliente

Guarda el puerto para no tener que escribirlo:

Host server
    HostName 203.0.113.10
    Port 2222
    User user

Para más ajustes que guardar por host, mira estos ejemplos de archivo ssh config.

Ten en cuenta que scp usa una -P mayúscula para el puerto, a diferencia de ssh. Si usas fail2ban, indícale también el puerto nuevo. Consulta fail2ban para SSH.

Preguntas

¿Merece la pena cambiar el puerto SSH?

Reduce el ruido de los bots que solo prueban el puerto 22. No frena un ataque dirigido: importan más el acceso solo con clave y un servidor actualizado.

¿Por qué no funciona el puerto SSH nuevo en Ubuntu 24.04?

Ubuntu 24.04 arranca sshd mediante ssh.socket. Después de cambiar Port, ejecuta sudo systemctl daemon-reload y sudo systemctl restart ssh.socket, y comprueba con ss -tln.

¿Cómo me conecto por SSH a otro puerto?

Usa ssh -p 2222 usuario@servidor, o pon Port 2222 bajo la entrada Host del servidor en ~/.ssh/config. scp toma el puerto con -P mayúscula.

Fuentes

Más en Proteger un servidor

Todas las guías