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
- sshd_config(5), manual de OpenBSD
- Error 2069041 de Launchpad: cambiar Port requiere daemon-reload
- Configuración de SELinux para configuraciones no estándar, Red Hat
- ufw(8), manual de Ubuntu