Cómo Cambiar el Puerto SSH por Defecto
Cambiar el puerto SSH por defecto del 22 a un puerto personalizado es una medida de seguridad simple pero efectiva que reduce significativamente los ataques automatizados en tu servidor Linux. Esta guía completa te guía a través del proceso de cambiar el puerto SSH en varias distribuciones de Linux, configurar cortafuegos e implementar mejores prácticas para una configuración segura de puerto SSH.
Tabla de Contenidos
- Prerrequisitos
- Comprendiendo Por Qué Cambiar el Puerto SSH
- Paso 1: Elegir un Nuevo Número de Puerto SSH
- Paso 2: Respaldar la Configuración SSH
- Paso 3: Configurar el Nuevo Puerto SSH
- Paso 4: Configurar el Cortafuegos para el Nuevo Puerto
- Paso 5: Configurar SELinux (Sistemas Basados en RHEL)
- Paso 6: Reiniciar el Servicio SSH
- Paso 7: Probar el Nuevo Puerto SSH
- Paso 8: Actualizar la Configuración SSH del Cliente
- Paso 9: Cerrar el Puerto SSH Antiguo
- Verificación
- Solución de Problemas
- Mejores Prácticas
- Conclusión
- Recursos Adicionales
Prerrequisitos
Antes de cambiar tu puerto SSH, asegúrate de tener:
- Servidor Linux (Ubuntu, Debian, CentOS, Rocky Linux o similar)
- Acceso root o privilegios sudo
- Conexión SSH activa al servidor
- Acceso a la consola del servidor vía panel del proveedor de hosting (acceso de respaldo crítico)
- Comprensión básica de la línea de comandos de Linux
- Conocimiento de gestión de cortafuegos (UFW, firewalld o iptables)
- Para sistemas basados en RHEL: Comprensión de conceptos básicos de SELinux
Advertencia crítica: Siempre mantén acceso a la consola de tu servidor antes de hacer cambios SSH. Si pierdes el acceso SSH y no tienes acceso a la consola, podrías quedar bloqueado de tu servidor.
Comprendiendo Por Qué Cambiar el Puerto SSH
Beneficios de Seguridad
1. Reduce ataques automatizados:
- Los bots y scripts escanean el puerto 22 por defecto
- Cambiar el puerto elimina el 99% de los intentos de fuerza bruta automatizados
- Reduce significativamente el desorden de registros del servidor por intentos fallidos de inicio de sesión
2. Seguridad por oscuridad:
- No es un reemplazo para medidas de seguridad apropiadas
- Agrega una capa adicional a la estrategia de defensa en profundidad
- Hace que los ataques dirigidos sean ligeramente más difíciles
3. Mejora el rendimiento del servidor:
- Menos intentos de inicio de sesión automatizados reducen el uso de CPU y red
- Registros de autenticación más limpios para un monitoreo más fácil
- Consumo reducido de ancho de banda de escáneres de puerto
Limitaciones y Conceptos Erróneos
Lo que NO hace cambiar el puerto SSH:
- No protege contra ataques dirigidos
- No reemplaza la autenticación fuerte (claves SSH, 2FA)
- No elimina la necesidad de fail2ban o herramientas similares
- No es suficiente como única medida de seguridad
Importante: Cambiar el puerto SSH es una medida de seguridad complementaria, no un reemplazo para el endurecimiento apropiado de SSH, autenticación fuerte y configuración de cortafuegos.
Cuándo Cambiar el Puerto SSH
Escenarios recomendados:
- Servidores públicos con SSH expuesto a internet
- Servidores experimentando grandes volúmenes de ataques automatizados
- Requisitos de cumplimiento para puertos no estándar
- Servidores de desarrollo compartidos entre múltiples usuarios
- Servidores detrás de cortafuegos corporativos restrictivos
No necesario:
- Servidores solo accesibles vía VPN
- Servidores con reglas de cortafuegos de lista blanca de IP
- Servidores solo de red interna
- Contenedores o instancias temporales
Paso 1: Elegir un Nuevo Número de Puerto SSH
Criterios de Selección de Puerto
Rangos de puerto válidos:
- 1-1023: Puertos del sistema/privilegiados (requieren root)
- 1024-49151: Puertos registrados (algunos asignados a servicios)
- 49152-65535: Puertos dinámicos/privados (rango recomendado)
Opciones recomendadas de puerto SSH:
- 2222: Alternativa común, fácil de recordar
- 22000: Fácil de recordar, rango alto
- 50000-60000: Rango menos comúnmente escaneado
- Puerto alto aleatorio: Usar puerto aleatorio entre 49152-65535
Puertos a evitar:
# Verificar si el puerto ya está en uso
sudo ss -tlnp | grep :NÚMERO_PUERTO
sudo netstat -tlnp | grep :NÚMERO_PUERTO
# Puertos comunes a evitar:
# 80, 443 (HTTP/HTTPS)
# 3306 (MySQL)
# 5432 (PostgreSQL)
# 6379 (Redis)
# 8080, 8443 (HTTP/HTTPS alternativo)
# 3389 (RDP)
# 21, 22, 23, 25 (FTP, SSH, Telnet, SMTP)
Generar número de puerto aleatorio:
# Generar puerto aleatorio en rango seguro
shuf -i 49152-65535 -n 1
# O usar este método
echo $((RANDOM + 49152))
Ejemplo: Verificar si el puerto 2222 está disponible:
# Verificar si algo está escuchando en el puerto 2222
sudo ss -tlnp | grep :2222
# Si no hay salida, el puerto está disponible
# Probar conectividad al puerto (debería fallar si no está en uso)
telnet localhost 2222
nc -zv localhost 2222
Para esta guía, usaremos el puerto 2222 como ejemplo. Reemplaza con tu puerto elegido en todos los pasos.
Paso 2: Respaldar la Configuración SSH
Antes de hacer cambios, siempre respalde la configuración SSH original.
# Respaldar configuración SSH con marca de tiempo
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d_%H%M%S)
# Verificar que se creó el respaldo
ls -lh /etc/ssh/sshd_config.backup.*
# Alternativa: Crear directorio de respaldo
sudo mkdir -p /root/backups/ssh
sudo cp /etc/ssh/sshd_config /root/backups/ssh/sshd_config.$(date +%Y%m%d_%H%M%S)
Ver configuración SSH actual:
# Mostrar configuración actual de puerto SSH
grep -i "^Port" /etc/ssh/sshd_config
# Si está comentado, SSH está usando el puerto por defecto 22
# Ver todas las configuraciones activas (sin comentarios)
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"
Documentar configuración actual:
# Crear documentación de configuración
cat > /tmp/ssh-config-pre-change.txt << EOF
Configuración SSH Antes del Cambio de Puerto
Fecha: $(date)
Servidor: $(hostname)
Puerto Actual: $(grep -i "^Port" /etc/ssh/sshd_config || echo "22 (por defecto)")
Escuchando: $(sudo ss -tlnp | grep sshd)
EOF
cat /tmp/ssh-config-pre-change.txt
Paso 3: Configurar el Nuevo Puerto SSH
Editar la Configuración del Daemon SSH
# Editar archivo de configuración SSH
sudo nano /etc/ssh/sshd_config
# O usar vi/vim
sudo vi /etc/ssh/sshd_config
Encontrar y modificar la directiva Port:
Busca esta línea (puede estar comentada con #):
#Port 22
Opción 1: Configuración de puerto único (recomendado después de probar)
Cambiar a tu nuevo puerto:
Port 2222
Opción 2: Configuración de puerto dual (recomendado durante la transición)
Escuchar en ambos puertos antiguo y nuevo temporalmente:
Port 22
Port 2222
¿Por qué configuración de puerto dual?
- Permite probar el nuevo puerto sin perder acceso en el puerto 22
- Proporciona respaldo si el nuevo puerto tiene problemas
- Permite transición gradual para múltiples usuarios
- Puede revertirse fácilmente si ocurren problemas
Configuraciones adicionales recomendadas de endurecimiento SSH:
Mientras editas, considera estas mejoras de seguridad:
# Deshabilitar inicio de sesión root
PermitRootLogin no
# Deshabilitar autenticación por contraseña (usar claves SSH)
PasswordAuthentication no
# Deshabilitar contraseñas vacías
PermitEmptyPasswords no
# Limitar intentos de autenticación
MaxAuthTries 3
# Establecer tiempo de gracia de inicio de sesión
LoginGraceTime 30
# Deshabilitar reenvío X11 si no es necesario
X11Forwarding no
# Usar solo cifrados fuertes
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
# Usar MACs fuertes
MACs [email protected],[email protected]
# Usar algoritmos de intercambio de claves fuertes
KexAlgorithms curve25519-sha256,[email protected],diffie-hellman-group-exchange-sha256
Guardar y salir del archivo:
- nano: Presionar Ctrl+X, luego Y, luego Enter
- vi/vim: Presionar Esc, escribir
:wq, presionar Enter
Probar sintaxis de configuración SSH:
# Verificar que la configuración no tenga errores de sintaxis
sudo sshd -t
# Si se muestran errores, corregirlos antes de continuar
# Sin salida significa que la configuración es válida
Ver cambios de configuración:
# Comparar con respaldo
diff /etc/ssh/sshd_config.backup.* /etc/ssh/sshd_config
# Mostrar configuración de puerto
grep -i "^Port" /etc/ssh/sshd_config
Paso 4: Configurar el Cortafuegos para el Nuevo Puerto
Antes de reiniciar SSH, configura tu cortafuegos para permitir el nuevo puerto.
Cortafuegos UFW (Ubuntu/Debian)
# Verificar estado de UFW
sudo ufw status
# Permitir nuevo puerto SSH
sudo ufw allow 2222/tcp comment 'Puerto SSH personalizado'
# Verificar que se agregó la regla
sudo ufw status numbered
# Opcional: Permitir solo desde IP específica
sudo ufw allow from 203.0.113.50 to any port 2222 proto tcp
# Recargar UFW
sudo ufw reload
Firewalld (CentOS/Rocky Linux/RHEL)
# Verificar estado de firewalld
sudo firewall-cmd --state
# Agregar nuevo puerto SSH permanentemente
sudo firewall-cmd --permanent --add-port=2222/tcp
# O crear definición de servicio personalizado
sudo firewall-cmd --permanent --new-service=ssh-custom
sudo firewall-cmd --permanent --service=ssh-custom --set-description="SSH en puerto personalizado"
sudo firewall-cmd --permanent --service=ssh-custom --add-port=2222/tcp
sudo firewall-cmd --permanent --add-service=ssh-custom
# Recargar cortafuegos
sudo firewall-cmd --reload
# Verificar reglas
sudo firewall-cmd --list-all
sudo firewall-cmd --list-ports
Iptables (Configuración Directa)
# Permitir nuevo puerto SSH
sudo iptables -A INPUT -p tcp --dport 2222 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 2222 -m conntrack --ctstate ESTABLISHED -j ACCEPT
# Guardar reglas de iptables (Ubuntu/Debian)
sudo netfilter-persistent save
# O
sudo iptables-save | sudo tee /etc/iptables/rules.v4
# Guardar reglas de iptables (CentOS/Rocky Linux)
sudo service iptables save
# O
sudo iptables-save | sudo tee /etc/sysconfig/iptables
# Ver reglas
sudo iptables -L -n -v | grep 2222
Cortafuegos de Proveedores de Nube
No olvides los cortafuegos externos:
Si usas proveedores de nube (AWS, DigitalOcean, GCP, Azure, etc.), también configura sus grupos de seguridad/cortafuegos:
Grupos de Seguridad de AWS:
- Agregar regla de entrada: Puerto TCP 2222 desde tu IP o 0.0.0.0/0
Cortafuegos en la Nube de DigitalOcean:
- Agregar regla de entrada: Puerto TCP 2222
Google Cloud Platform:
- Crear regla de cortafuegos permitiendo TCP:2222
Grupos de Seguridad de Red de Azure:
- Agregar regla de seguridad de entrada para puerto 2222
Paso 5: Configurar SELinux (Sistemas Basados en RHEL)
En CentOS, Rocky Linux, AlmaLinux y RHEL, SELinux debe configurarse para permitir SSH en el nuevo puerto.
Verificar Estado de SELinux
# Verificar si SELinux está en modo enforcing
sestatus
getenforce
# Ver puertos SSH actuales permitidos por SELinux
sudo semanage port -l | grep ssh
# Salida por defecto incluye: ssh_port_t tcp 22
Agregar Nuevo Puerto a SELinux
# Instalar herramientas de gestión de SELinux si no están presentes
sudo dnf install policycoreutils-python-utils -y
# Agregar nuevo puerto SSH a la política de SELinux
sudo semanage port -a -t ssh_port_t -p tcp 2222
# Verificar que se agregó el puerto
sudo semanage port -l | grep ssh
# Ahora debería mostrar: ssh_port_t tcp 22, 2222
Si el puerto ya está definido para otro servicio:
# Puede ocurrir este error:
# ValueError: Port tcp/2222 already defined
# Verificar qué servicio usa el puerto
sudo semanage port -l | grep 2222
# Si necesitas reasignar el puerto
sudo semanage port -m -t ssh_port_t -p tcp 2222
Alternativa: Establecer temporalmente SELinux en permisivo (no recomendado):
# Solo para solución de problemas - no para producción
sudo setenforce 0
# Después de solucionar problemas, volver a enforcing
sudo setenforce 1
Verificar Configuración de SELinux
# Verificar denegaciones de SELinux
sudo ausearch -m AVC -ts recent | grep sshd
# Si existen denegaciones, generar política
sudo ausearch -m AVC -ts recent | grep sshd | audit2allow -M ssh_custom_port
sudo semodule -i ssh_custom_port.pp
Paso 6: Reiniciar el Servicio SSH
Ahora reinicia el servicio SSH para aplicar la nueva configuración de puerto.
Crítico: No cierres tu sesión SSH actual hasta que hayas verificado que el nuevo puerto funciona.
# Probar configuración una vez más
sudo sshd -t
# Reiniciar servicio SSH (sistemas systemd)
sudo systemctl restart sshd
# Verificar que el servicio SSH está ejecutándose
sudo systemctl status sshd
# Métodos alternativos de reinicio (sistemas antiguos)
sudo service sshd restart
sudo /etc/init.d/ssh restart
Verificar si SSH está escuchando en el nuevo puerto:
# Verificar que SSH está escuchando en el nuevo puerto
sudo ss -tlnp | grep sshd
sudo netstat -tlnp | grep sshd
# Debería mostrar líneas como:
# tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
# tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 1234/sshd
Ver registros del servicio SSH:
# Verificar errores en registros SSH
sudo journalctl -u sshd -n 50 --no-pager
# O ver registro de autenticación
sudo tail -f /var/log/auth.log # Ubuntu/Debian
sudo tail -f /var/log/secure # CentOS/Rocky
Paso 7: Probar el Nuevo Puerto SSH
Crítico: Prueba el nuevo puerto en una sesión de terminal separada antes de cerrar tu conexión actual.
Probar desde Máquina Local
Abre una nueva ventana de terminal en tu máquina local:
# Probar conexión SSH en nuevo puerto
ssh -p 2222 username@ip_de_tu_servidor
# Modo verbose para solución de problemas
ssh -v -p 2222 username@ip_de_tu_servidor
# Probar con timeout
timeout 10 ssh -p 2222 username@ip_de_tu_servidor
Si la conexión tiene éxito:
Deberías poder iniciar sesión normalmente. Mantén ambas sesiones abiertas (antigua y nueva) por ahora.
Si la conexión falla:
NO cierres tu sesión SSH original. Soluciona problemas usando los pasos en la sección de Solución de Problemas más abajo.
Probar Conectividad de Puerto
# Probar si el puerto es alcanzable (desde máquina local)
nc -zv ip_de_tu_servidor 2222
telnet ip_de_tu_servidor 2222
# Probar desde el servidor mismo
nc -zv localhost 2222
telnet localhost 2222
# Verificar si el puerto está abierto (desde servicio externo)
# Usar verificador de puertos en línea: https://www.yougetsignal.com/tools/open-ports/
Verificar que Ambos Puertos Funcionan (si usas configuración dual)
# Probar puerto antiguo (puerto 22)
ssh -p 22 username@ip_de_tu_servidor
# Probar nuevo puerto (puerto 2222)
ssh -p 2222 username@ip_de_tu_servidor
# Ambos deberían funcionar si configuraste puertos duales
Paso 8: Actualizar la Configuración SSH del Cliente
Hacer la conexión a tu servidor conveniente actualizando la configuración de tu cliente SSH.
Configuración SSH en Linux/macOS
# Editar archivo de configuración SSH
nano ~/.ssh/config
# Agregar o modificar entrada de servidor:
Host myserver
HostName ip_de_tu_servidor
User username
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
# O para dominio específico
Host example.com
Port 2222
User admin
# O para todos los servidores (usar con precaución)
Host *
Port 2222
Ahora puedes conectarte simplemente con:
ssh myserver
# En lugar de: ssh -p 2222 username@ip_de_tu_servidor
Establecer permisos apropiados:
# La configuración SSH debe tener permisos correctos
chmod 600 ~/.ssh/config
Actualizar Scripts de Automatización
Actualizar cualquier script o automatización que se conecte vía SSH:
# En scripts, actualizar comandos SSH:
# Antiguo:
ssh user@host 'command'
# Nuevo:
ssh -p 2222 user@host 'command'
# O para scp:
scp -P 2222 file.txt user@host:/path/
# O para rsync:
rsync -avz -e "ssh -p 2222" /local/ user@host:/remote/
Actualizar Claves SSH y Agentes
# Agregar clave de host para nuevo puerto
ssh-keyscan -p 2222 ip_de_tu_servidor >> ~/.ssh/known_hosts
# O eliminar clave de host antigua y agregar nueva en primera conexión
ssh-keygen -R ip_de_tu_servidor
ssh -p 2222 username@ip_de_tu_servidor
Paso 9: Cerrar el Puerto SSH Antiguo
Después de confirmar que el nuevo puerto funciona de manera confiable durante varios días, cierra el puerto antiguo.
Actualizar Configuración SSH
# Editar configuración SSH
sudo nano /etc/ssh/sshd_config
# Eliminar o comentar puerto antiguo:
# Port 22 <- Comentar o eliminar esta línea
Port 2222
# Guardar y probar
sudo sshd -t
# Reiniciar SSH
sudo systemctl restart sshd
Eliminar Puerto Antiguo del Cortafuegos
UFW:
# Eliminar regla SSH antigua (¡ten cuidado!)
sudo ufw delete allow 22/tcp
# O deshabilitar solo desde fuente específica
sudo ufw status numbered
sudo ufw delete [número_regla]
# Verificar
sudo ufw status
Firewalld:
# Eliminar servicio SSH antiguo
sudo firewall-cmd --permanent --remove-service=ssh
# O eliminar puerto
sudo firewall-cmd --permanent --remove-port=22/tcp
# Recargar
sudo firewall-cmd --reload
# Verificar
sudo firewall-cmd --list-all
Iptables:
# Eliminar reglas SSH antiguas
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# Guardar reglas
sudo netfilter-persistent save
Verificar que el Puerto Antiguo está Cerrado
# Verificar que SSH no está escuchando en puerto 22
sudo ss -tlnp | grep :22
# Probar conexión (debería fallar)
ssh -p 22 username@ip_de_tu_servidor
# Debería agotar tiempo de espera o ser rechazado
Verificación
Lista de Verificación Completa
# 1. Verificar que SSH está escuchando en nuevo puerto
sudo ss -tlnp | grep sshd
# 2. Verificar que el cortafuegos permite nuevo puerto
sudo ufw status | grep 2222 # Ubuntu/Debian
sudo firewall-cmd --list-ports # CentOS/Rocky
# 3. Verificar que SELinux permite nuevo puerto (basado en RHEL)
sudo semanage port -l | grep ssh
# 4. Probar conexión desde fuente externa
ssh -p 2222 username@ip_de_tu_servidor
# 5. Verificar estado del servicio SSH
sudo systemctl status sshd
# 6. Revisar registros SSH para errores
sudo journalctl -u sshd -n 50 --no-pager
# 7. Verificar que el puerto antiguo está cerrado (después de transición)
sudo ss -tlnp | grep :22
nc -zv ip_de_tu_servidor 22 # Debería fallar
# 8. Verificar conexiones SSH activas
sudo ss -tnp | grep sshd
w
# 9. Verificar que la autenticación funciona
ssh -p 2222 username@ip_de_tu_servidor 'whoami'
# 10. Verificar configuración de fail2ban (si está instalado)
sudo fail2ban-client status sshd
Crear Script de Verificación
# Crear script de verificación
cat << 'EOF' | sudo tee /usr/local/bin/verify-ssh-port.sh
#!/bin/bash
echo "=== Verificación de Configuración de Puerto SSH ==="
echo ""
echo "Estado del Servicio SSH:"
systemctl status sshd | grep Active
echo ""
echo "Puertos de Escucha:"
ss -tlnp | grep sshd
echo ""
echo "Configuración de Puerto SSH:"
grep -i "^Port" /etc/ssh/sshd_config
echo ""
echo "Reglas de Cortafuegos:"
if command -v ufw &> /dev/null; then
ufw status | grep -E "22|2222"
elif command -v firewall-cmd &> /dev/null; then
firewall-cmd --list-ports | grep -E "22|2222"
fi
echo ""
if command -v getenforce &> /dev/null; then
echo "Puertos SSH de SELinux:"
semanage port -l | grep ssh
fi
echo ""
echo "Conexiones SSH Activas:"
ss -tnp | grep sshd | grep ESTAB
EOF
sudo chmod +x /usr/local/bin/verify-ssh-port.sh
sudo /usr/local/bin/verify-ssh-port.sh
Solución de Problemas
No se Puede Conectar al Nuevo Puerto
Problema: La conexión SSH agota tiempo de espera o es rechazada en nuevo puerto.
Lista de verificación de solución:
# 1. Verificar que SSH está escuchando en el puerto
sudo ss -tlnp | grep sshd
sudo netstat -tlnp | grep sshd
# 2. Verificar que el servicio SSH está ejecutándose
sudo systemctl status sshd
# 3. Verificar configuración SSH
sudo sshd -t
grep -i "^Port" /etc/ssh/sshd_config
# 4. Verificar que el cortafuegos permite el puerto
sudo ufw status | grep 2222
sudo firewall-cmd --list-ports
# 5. Verificar SELinux (basado en RHEL)
sudo semanage port -l | grep ssh
sudo ausearch -m AVC -c sshd
# 6. Probar conectividad local
nc -zv localhost 2222
telnet localhost 2222
# 7. Verificar grupos de seguridad del proveedor de nube
# Revisar reglas de cortafuegos de AWS/GCP/Azure
# 8. Revisar registros
sudo journalctl -u sshd -n 100 --no-pager
sudo tail -100 /var/log/auth.log
SELinux Bloqueando SSH (Basado en RHEL)
Problema: Conexión rechazada debido a política SELinux.
Solución:
# Verificar denegaciones de SELinux
sudo ausearch -m AVC -c sshd -ts recent
# Agregar puerto a política SELinux
sudo semanage port -a -t ssh_port_t -p tcp 2222
# Generar política personalizada si es necesario
sudo ausearch -m AVC -c sshd | audit2allow -M ssh_custom
sudo semodule -i ssh_custom.pp
# Verificar que el puerto está permitido
sudo semanage port -l | grep ssh
# Verificar modo SELinux
getenforce
# Ver alertas detalladas de SELinux
sudo sealert -a /var/log/audit/audit.log
Bloqueado Después de Cerrar el Puerto 22
Problema: Cerró el puerto 22 demasiado pronto y ahora no puede conectarse.
Solución:
- Acceder vía consola (panel del proveedor de hosting):
# Conectar vía consola
# Verificar estado de SSH
sudo systemctl status sshd
# Editar configuración SSH para agregar puerto 22 de nuevo
sudo nano /etc/ssh/sshd_config
# Agregar:
Port 22
Port 2222
# Reiniciar SSH
sudo systemctl restart sshd
# Permitir puerto 22 en cortafuegos
sudo ufw allow 22/tcp
sudo firewall-cmd --add-port=22/tcp
# Probar conexión en puerto 22
- Prevención: Siempre usar configuración de puerto dual inicialmente
Cortafuegos No Permite Nuevo Puerto
Problema: El cortafuegos bloquea el nuevo puerto SSH a pesar de las reglas.
Solución:
# Solución de problemas UFW
sudo ufw status verbose
sudo ufw show added
sudo ufw reload
# Agregar regla si falta
sudo ufw allow 2222/tcp
# Verificar orden de reglas
sudo ufw status numbered
# Solución de problemas Firewalld
sudo firewall-cmd --state
sudo firewall-cmd --list-all
sudo firewall-cmd --reload
# Agregar puerto si falta
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
# Verificar iptables directamente
sudo iptables -L INPUT -n -v | grep 2222
sudo ip6tables -L INPUT -n -v | grep 2222
El Servicio SSH No Inicia
Problema: El servicio SSH falla al iniciar después del cambio de configuración.
Solución:
# Verificar errores de configuración
sudo sshd -t
# Ver mensajes de error detallados
sudo systemctl status sshd -l
sudo journalctl -u sshd -n 50 --no-pager
# Problemas comunes:
# - Error de sintaxis en sshd_config
# - Puerto ya en uso
# - Problemas de permisos
# Verificar si el puerto ya está en uso
sudo ss -tlnp | grep :2222
sudo fuser 2222/tcp
# Matar proceso usando puerto
sudo fuser -k 2222/tcp
# Restaurar respaldo si es necesario
sudo cp /etc/ssh/sshd_config.backup.* /etc/ssh/sshd_config
sudo systemctl restart sshd
La Conexión se Cae Inmediatamente
Problema: La conexión se establece pero se cae inmediatamente.
Solución:
# Conectar con salida verbose
ssh -vvv -p 2222 username@ip_de_tu_servidor
# Verificar problemas de autenticación
sudo tail -f /var/log/auth.log
# Verificar permisos de usuario
id username
sudo grep username /etc/passwd
# Verificar permisos de clave SSH
ls -la ~/.ssh/
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# Verificar contextos SELinux (basado en RHEL)
ls -Z ~/.ssh/
restorecon -Rv ~/.ssh
Mejores Prácticas
Recomendaciones de Seguridad
-
Usar puertos de numeración alta (49152-65535) para evitar escaneos comunes
-
Combinar con otras medidas de seguridad:
- Autenticación con clave SSH (deshabilitar contraseñas)
- Fail2ban para prevención de intrusiones
- Reglas de cortafuegos limitando acceso por IP
- Autenticación de dos factores (2FA)
- Auditorías de seguridad regulares
-
Monitorear registros de autenticación:
# Crear alias de monitoreo
echo "alias ssh-logs='sudo tail -f /var/log/auth.log | grep sshd'" >> ~/.bashrc
source ~/.bashrc
# Ejecutar monitoreo
ssh-logs
- Documentar cambios de puerto:
# Crear archivo de documentación
cat > /root/ssh-port-info.txt << EOF
Configuración de Puerto SSH
Fecha de Cambio: $(date)
Nuevo Puerto: 2222
Cambiado Por: $(whoami)
Razón: Endurecimiento de seguridad - reducir ataques automatizados
Cortafuegos Actualizado: Sí
SELinux Actualizado: Sí (basado en RHEL)
Configuraciones de Cliente Actualizadas: Sí
EOF
- Usar port knocking para seguridad adicional:
# Instalar knockd
sudo apt install knockd # Ubuntu/Debian
sudo dnf install knockd # CentOS/Rocky
# Configurar secuencia de knock
sudo nano /etc/knockd.conf
Mejores Prácticas Operativas
- Mantener acceso de puerto dual inicialmente (22 y puerto personalizado)
- Probar exhaustivamente antes de eliminar puerto 22
- Actualizar a todos los miembros del equipo antes de cerrar puerto antiguo
- Documentar en runbooks y procedimientos
- Actualizar sistemas de monitoreo para verificar nuevo puerto
- Configurar métodos de acceso de respaldo (consola, VPN)
- Programar cambio durante ventana de mantenimiento
Automatización y Monitoreo
# Crear script de monitoreo de puerto SSH
cat << 'EOF' | sudo tee /usr/local/bin/monitor-ssh-port.sh
#!/bin/bash
PORT=2222
LOG_FILE="/var/log/ssh-port-monitor.log"
if ! ss -tln | grep -q ":$PORT "; then
echo "$(date): SSH no está escuchando en puerto $PORT" >> "$LOG_FILE"
systemctl restart sshd
echo "$(date): Servicio SSH reiniciado" >> "$LOG_FILE"
fi
# Verificar intentos fallidos excesivos
FAILED=$(grep "Failed password" /var/log/auth.log | grep "port $PORT" | tail -100 | wc -l)
if [ $FAILED -gt 50 ]; then
echo "$(date): Alto número de intentos fallidos: $FAILED" >> "$LOG_FILE"
fi
EOF
sudo chmod +x /usr/local/bin/monitor-ssh-port.sh
# Agregar a crontab para monitoreo periódico
(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/monitor-ssh-port.sh") | crontab -
Gestión de Múltiples Servidores
Cuando gestionas múltiples servidores:
# Crear configuración SSH con puertos personalizados
cat >> ~/.ssh/config << EOF
Host servidor1
HostName 192.0.2.10
Port 2222
User admin
Host servidor2
HostName 192.0.2.11
Port 50000
User root
Host servidor3
HostName 192.0.2.12
Port 22022
User deploy
# Coincidencia de patrón para todos los servidores
Host servidor*
ServerAliveInterval 60
ServerAliveCountMax 3
IdentityFile ~/.ssh/id_ed25519
EOF
# Usar ansible para cambios masivos de puerto
# Crear playbook: change-ssh-port.yml
Revertir Cambios
Si necesitas revertir al puerto 22:
# Restaurar configuración de respaldo
sudo cp /etc/ssh/sshd_config.backup.* /etc/ssh/sshd_config
# O editar manualmente
sudo nano /etc/ssh/sshd_config
# Cambiar: Port 2222 → Port 22
# Probar y reiniciar
sudo sshd -t
sudo systemctl restart sshd
# Actualizar cortafuegos
sudo ufw allow 22/tcp
sudo firewall-cmd --add-service=ssh
# Eliminar puerto personalizado de SELinux (basado en RHEL)
sudo semanage port -d -t ssh_port_t -p tcp 2222
Conclusión
Cambiar el puerto SSH por defecto del 22 a un puerto personalizado es una mejora de seguridad simple que reduce significativamente los ataques automatizados y mejora la postura de seguridad de tu servidor. Aunque no es una solución definitiva, es un componente efectivo de una estrategia de seguridad de defensa en profundidad.
Logros clave:
- Puerto SSH cambiado exitosamente del 22 a puerto personalizado
- Cortafuegos configurado para permitir nuevo puerto SSH
- SELinux configurado (sistemas basados en RHEL)
- Configuraciones SSH de cliente actualizadas
- Conexión probada y verificada
- Puerto antiguo cerrado después de transición exitosa
Recordatorios importantes:
- Los cambios de puerto por sí solos no reemplazan el endurecimiento apropiado de SSH
- Siempre mantén acceso a consola antes de hacer cambios
- Prueba exhaustivamente antes de cerrar puerto 22
- Documenta cambios para miembros del equipo y referencia futura
- Monitorea registros para problemas después del cambio
Próximos pasos de seguridad:
- Implementar autenticación con clave SSH (deshabilitar contraseñas)
- Configurar Fail2Ban para prevención de intrusiones
- Configurar autenticación de dos factores (2FA)
- Implementar lista blanca de IP si es posible
- Auditorías de seguridad regulares y monitoreo de registros
Siguiendo esta guía, has implementado una capa de seguridad importante que reducirá dramáticamente el ruido de ataques automatizados y hará tu servidor ligeramente más difícil de atacar.
Recursos Adicionales
- Documentación de Configuración OpenSSH
- Mejores Prácticas de Seguridad de Puerto SSH
- Directrices de Seguridad SSH de NIST
- Documentación UFW
- Documentación Firewalld
- Guía del Usuario SELinux
Guías Relacionadas
- Cómo Conectarse a Tu Servidor vía SSH
- Configuración de Seguridad Inicial en Ubuntu/Debian
- Configuración de Seguridad Inicial en CentOS/Rocky Linux
- Configuración de Fail2Ban para Protección contra Fuerza Bruta
- Gestión de Claves SSH: Generación y Mejores Prácticas
- Configuración de Cortafuegos con firewalld (CentOS/Rocky)
- Endurecimiento de Servidor Linux: Guía Completa


