Problemas de Conectividad SSH: Diagnósticos
Introducción
SSH (Secure Shell) es el protocolo principal para la administración remota segura de servidores, haciendo que los problemas de conectividad SSH sean uno de los problemas más frustrantes que los administradores de sistemas encuentran. Cuando no puede conectarse a su servidor vía SSH, está efectivamente bloqueado de las capacidades de gestión remota, lo que puede impactar severamente las operaciones y la productividad.
Esta guía completa proporciona un enfoque sistemático para diagnosticar y resolver problemas de conectividad SSH. Ya sea que esté lidiando con timeouts de conexión, fallos de autenticación o problemas de configuración, esta guía le guiará a través de pasos metódicos de solución de problemas usando herramientas de diagnóstico de línea de comandos.
Entender los problemas de conectividad SSH es esencial para ingenieros DevOps, administradores de sistemas y cualquiera que gestione servidores Linux. Esta guía cubre todo, desde pruebas básicas de conectividad hasta técnicas avanzadas de depuración SSH, ayudándole a identificar y resolver problemas rápidamente.
Entendiendo el Proceso de Conexión SSH
Flujo de Conexión SSH
Para solucionar efectivamente problemas de SSH, comprenda el proceso de conexión:
- Resolución DNS: El cliente resuelve el hostname del servidor a dirección IP
- Conectividad de Red: Conexión TCP establecida en puerto 22 (predeterminado)
- Negociación de Protocolo SSH: Cliente y servidor acuerdan versión de protocolo
- Intercambio de Claves: Claves criptográficas intercambiadas para encriptación
- Autenticación: Credenciales de usuario verificadas (contraseña o basada en clave)
- Establecimiento de Sesión: Sesión shell creada para usuario
Los problemas pueden ocurrir en cualquiera de estas etapas, requiriendo diferentes enfoques de diagnóstico.
Mensajes de Error SSH Comunes
Entender los mensajes de error ayuda a identificar el problema rápidamente:
- "Connection timed out": Red inalcanzable, firewall bloqueando, IP/puerto incorrecto
- "Connection refused": Servicio SSH no ejecutándose o puerto incorrecto
- "Permission denied": Fallo de autenticación, credenciales o claves incorrectas
- "Host key verification failed": Clave del servidor cambió o ataque man-in-the-middle
- "Too many authentication failures": Excedió intentos máximos de autenticación
- "No route to host": Problema de enrutamiento de red
- "Network is unreachable": Problema de configuración de red local
Evaluación Inicial
Recopilando Información
Antes de solucionar problemas, recopile información esencial:
# ¿Cuál es el mensaje de error exacto?
ssh usuario@ip-servidor 2>&1 | tee ssh-error.log
# ¿Qué funcionaba antes?
# - ¿Esta conexión alguna vez funcionó?
# - ¿Qué cambió recientemente?
# - ¿Pueden otros conectarse?
# ¿Cuál es su método de conexión?
# - Nombre de usuario y método de autenticación (contraseña/clave)
# - Dirección IP o hostname de destino
# - Número de puerto (si no es estándar)
Lista de Verificación Rápida
Comience con estas verificaciones rápidas:
- ¿Puede hacer ping al servidor?
- ¿Está abierto el puerto SSH?
- ¿Está ejecutándose el servicio SSH (si tiene acceso a consola)?
- ¿Son correctas las credenciales?
- ¿Ha cambiado la configuración del firewall?
Paso 1: Pruebas de Conectividad de Red
Pruebas Básicas de Alcanzabilidad
Verificar que el servidor sea alcanzable en la red:
# Prueba básica de ping
ping -c 4 ip-servidor
# Si se usa hostname, probar resolución DNS
nslookup hostname-servidor
dig hostname-servidor +short
# Probar con IPv4 e IPv6
ping -4 hostname-servidor
ping -6 hostname-servidor
# Ping continuo para detectar problemas intermitentes
ping -i 0.2 ip-servidor
# Verificar ruta de red
traceroute ip-servidor
mtr -c 50 ip-servidor
Interpretando Resultados:
- Sin respuesta de ping: Servidor caído, problema de red o ICMP bloqueado por firewall
- Alta pérdida de paquetes: Congestión de red o conexión inestable
- Alta latencia: Problemas de rendimiento de red
- Fallo de resolución DNS: Problema DNS, no problema SSH
Pruebas de Conectividad de Puerto
Verificar que el puerto SSH sea accesible:
# Probar puerto SSH (predeterminado 22)
telnet ip-servidor 22
nc -zv ip-servidor 22
# Si se usa puerto personalizado
nc -zv ip-servidor 2222
# Verificar si el puerto está filtrado
nmap -p 22 ip-servidor
nmap -Pn -p 22 ip-servidor # Saltar verificación de ping
# Probar con timeout
timeout 5 bash -c "</dev/tcp/ip-servidor/22" && echo "Puerto 22 abierto" || echo "Puerto 22 cerrado"
# Escanear servicio SSH en puertos no estándar
nmap -p 1-65535 ip-servidor | grep ssh
Análisis de Resultados:
- Conexión establecida: Puerto está abierto y alcanzable
- Conexión rechazada: Servicio no ejecutándose o firewall bloqueando
- Timeout de conexión: Firewall descartando paquetes o problema de enrutamiento
- No route to host: Problema de configuración de red
Paso 2: Diagnósticos del Lado del Cliente SSH
Pruebas de Conexión SSH Verbosa
Usar modos verbosos SSH para ver información detallada de conexión:
# Modo verboso básico (-v)
ssh -v usuario@ip-servidor
# Más verboso (-vv)
ssh -vv usuario@ip-servidor
# Verbosidad máxima (-vvv)
ssh -vvv usuario@ip-servidor 2>&1 | tee ssh-debug.log
# Verboso con puerto específico
ssh -vvv -p 2222 usuario@ip-servidor
# Verboso con archivo de identidad específico
ssh -vvv -i ~/.ssh/id_rsa usuario@ip-servidor
Análisis de Salida Debug:
Buscar estos indicadores clave en la salida verbosa:
# Etapas exitosas:
debug1: Connecting to ip-servidor [IP] port 22.
debug1: Connection established.
debug1: Remote protocol version 2.0
debug1: Server host key: ssh-rsa SHA256:xxxxx
debug1: Authentication succeeded (publickey).
# Indicadores de problema:
debug1: connect to address X.X.X.X port 22: Connection timed out
debug1: connect to address X.X.X.X port 22: Connection refused
debug1: Connection closed by remote host
debug1: No more authentication methods to try.
Probando Diferentes Métodos de Autenticación
Probar varios enfoques de autenticación:
# Forzar autenticación por contraseña
ssh -o PreferredAuthentications=password usuario@ip-servidor
# Forzar autenticación por clave pública
ssh -o PreferredAuthentications=publickey usuario@ip-servidor
# Deshabilitar verificación estricta de clave de host (temporal, para pruebas)
ssh -o StrictHostKeyChecking=no usuario@ip-servidor
# Usar archivo de identidad específico
ssh -i ~/.ssh/clave_personalizada usuario@ip-servidor
# Probar con diferentes tipos de clave
ssh -o PubkeyAcceptedKeyTypes=ssh-rsa usuario@ip-servidor
ssh -o PubkeyAcceptedKeyTypes=ecdsa-sha2-nistp256 usuario@ip-servidor
# Deshabilitar todos los métodos de autenticación excepto uno
ssh -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes usuario@ip-servidor
Problemas de Archivo de Configuración SSH
Verificar la configuración del cliente SSH local:
# Ver su configuración SSH
cat ~/.ssh/config
# Verificar configuración a nivel de sistema
cat /etc/ssh/ssh_config
# Probar con configuración mínima (ignorar archivos de configuración)
ssh -F /dev/null usuario@ip-servidor
# Ver configuración efectiva para host
ssh -G hostname-servidor
Problemas comunes de configuración del cliente:
# Verificar directivas problemáticas
grep -i "Host\|HostName\|Port\|IdentityFile" ~/.ssh/config
# Verificar permisos de archivo
ls -la ~/.ssh/config
# Debería ser: -rw------- (600)
# Corregir permisos si es necesario
chmod 600 ~/.ssh/config
Paso 3: Diagnósticos de Claves SSH
Verificando Claves SSH
Verificar su configuración de claves SSH:
# Listar sus claves SSH
ls -la ~/.ssh/
# Ver clave pública
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_ed25519.pub
# Verificar permisos de clave
ls -l ~/.ssh/id_rsa
# Debería ser: -rw------- (600)
# Corregir permisos de clave
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
# Probar validez de clave
ssh-keygen -l -f ~/.ssh/id_rsa
ssh-keygen -y -f ~/.ssh/id_rsa
# Verificar si la clave está cargada en ssh-agent
ssh-add -l
# Agregar clave a ssh-agent
eval $(ssh-agent)
ssh-add ~/.ssh/id_rsa
Probando Autenticación Basada en Clave
Verificar configuración de autenticación basada en clave:
# Copiar clave al servidor (si tiene acceso por contraseña)
ssh-copy-id usuario@ip-servidor
ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@ip-servidor
# Verificación manual de clave (lo que hace ssh-copy-id)
cat ~/.ssh/id_rsa.pub | ssh usuario@ip-servidor "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# Probar clave específica
ssh -i ~/.ssh/id_rsa -vvv usuario@ip-servidor
# Verificar formato de clave
ssh-keygen -l -f ~/.ssh/id_rsa.pub
Problemas Comunes de Claves
# Verificar múltiples claves causando "too many authentication failures"
ssh-add -l
# Si hay demasiadas claves, limpiar y agregar clave específica
ssh-add -D
ssh-add ~/.ssh/id_rsa
# Generar nuevo par de claves si está corrupto
ssh-keygen -t ed25519 -C "[email protected]"
ssh-keygen -t rsa -b 4096 -C "[email protected]"
# Convertir formato de clave antiguo a nuevo
ssh-keygen -p -f ~/.ssh/id_rsa -m pem
Paso 4: Diagnósticos del Lado del Servidor
Accediendo a la Consola del Servidor
Si SSH no está disponible, use acceso alternativo:
- Consola del Proveedor de Nube: Consola AWS EC2, Consola DigitalOcean, etc.
- IPMI/iLO/iDRAC: Gestión fuera de banda
- VNC/KVM: Acceso a escritorio remoto
- Acceso Físico: Teclado/monitor directo
Verificando Estado del Servicio SSH
Una vez que tenga acceso a consola:
# Verificar estado del servicio SSH
systemctl status sshd
systemctl status ssh
# Verificar si SSH está ejecutándose
ps aux | grep sshd
pgrep sshd
# Reiniciar servicio SSH
systemctl restart sshd
systemctl restart ssh
# Habilitar SSH al arrancar
systemctl enable sshd
# Verificar errores de inicio del servicio SSH
journalctl -u sshd -n 50
systemctl status sshd -l
Verificación de Puerto del Servicio SSH
Verificar en qué puerto está escuchando SSH:
# Verificar puertos en escucha
ss -tlnp | grep sshd
netstat -tlnp | grep sshd
# Verificar puerto de configuración SSH
grep "^Port" /etc/ssh/sshd_config
# Verificar todas las direcciones de escucha SSH
lsof -i -P | grep sshd
Análisis de Archivo de Configuración SSH
Verificar configuración del demonio SSH del servidor:
# Ver configuración del demonio SSH
cat /etc/ssh/sshd_config
# Probar validez de configuración
sshd -t
sshd -T # Mostrar configuración efectiva
# Verificar problemas comunes
grep -E "^PermitRootLogin|^PasswordAuthentication|^PubkeyAuthentication|^Port|^ListenAddress" /etc/ssh/sshd_config
# Respaldar y ver configuración sin comentarios
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"
Directivas de Configuración Críticas:
# ¿Permitir login de root?
grep "PermitRootLogin" /etc/ssh/sshd_config
# Debería ser: PermitRootLogin no (mejor práctica)
# ¿Permitir autenticación por contraseña?
grep "PasswordAuthentication" /etc/ssh/sshd_config
# PasswordAuthentication yes (o no si solo clave)
# ¿Permitir autenticación por clave pública?
grep "PubkeyAuthentication" /etc/ssh/sshd_config
# PubkeyAuthentication yes
# ¿Qué usuarios pueden conectarse?
grep "AllowUsers\|DenyUsers\|AllowGroups" /etc/ssh/sshd_config
# Intentos máximos de autenticación
grep "MaxAuthTries" /etc/ssh/sshd_config
Verificando Claves Autorizadas
Verificar archivo authorized_keys en el servidor:
# Verificar archivo authorized_keys
cat ~/.ssh/authorized_keys
# Verificar permisos de archivo
ls -la ~/.ssh/
ls -l ~/.ssh/authorized_keys
# Permisos correctos
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# Verificar propietario
ls -l ~/.ssh/authorized_keys
# Debería ser propiedad del usuario
# Corregir propietario
chown usuario:usuario ~/.ssh/authorized_keys
chown -R usuario:usuario ~/.ssh/
# Verificar formato de clave en authorized_keys
grep "ssh-rsa\|ssh-ed25519\|ecdsa" ~/.ssh/authorized_keys
# Verificar entradas inválidas
awk '{print NF, $1}' ~/.ssh/authorized_keys
Paso 5: Diagnósticos de Firewall y Seguridad
Verificando Reglas de Firewall
Los firewalls son causas comunes de problemas de conectividad SSH:
# Verificar reglas iptables
iptables -L -n -v
iptables -L INPUT -n -v | grep -E "22|ssh"
# Verificar si el puerto SSH está permitido
iptables -L INPUT -n | grep "dpt:22"
# Deshabilitar temporalmente firewall (¡solo para pruebas!)
systemctl stop iptables
systemctl stop firewalld
ufw disable
# Verificar estado UFW
ufw status verbose
ufw status numbered
# Verificar firewalld
firewall-cmd --list-all
firewall-cmd --list-ports
firewall-cmd --list-services | grep ssh
# Verificar nftables
nft list ruleset | grep -i ssh
Permitiendo SSH a Través del Firewall
# UFW
ufw allow 22/tcp
ufw allow ssh
ufw allow from ip-específica to any port 22
# firewalld
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --reload
# iptables
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables-save > /etc/iptables/rules.v4
Verificando TCP Wrappers
TCP Wrappers pueden bloquear conexiones SSH:
# Verificar hosts.allow
cat /etc/hosts.allow
grep sshd /etc/hosts.allow
# Verificar hosts.deny
cat /etc/hosts.deny
grep sshd /etc/hosts.deny
# Permitir todo SSH (para pruebas)
echo "sshd: ALL" >> /etc/hosts.allow
# Permitir IP específica
echo "sshd: 192.168.1.100" >> /etc/hosts.allow
Verificando Fail2Ban
Fail2Ban puede haber bloqueado su IP:
# Verificar si fail2ban está ejecutándose
systemctl status fail2ban
# Verificar IPs bloqueadas
fail2ban-client status sshd
iptables -L -n | grep DROP
# Desbloquear su IP
fail2ban-client set sshd unbanip SU-IP
# Verificar log de fail2ban
tail -100 /var/log/fail2ban.log
grep "Ban" /var/log/fail2ban.log
Problemas de SELinux
SELinux puede interferir con SSH:
# Verificar estado de SELinux
getenforce
sestatus
# Verificar denegaciones de SELinux
ausearch -m avc -ts recent
grep "sshd" /var/log/audit/audit.log
# Deshabilitar temporalmente (para pruebas)
setenforce 0
# Verificar contexto SELinux de SSH
ls -Z /etc/ssh/sshd_config
ls -Z ~/.ssh/authorized_keys
# Restaurar contexto correcto
restorecon -Rv /etc/ssh/
restorecon -Rv ~/.ssh/
Paso 6: Problemas de Autenticación
Problemas de Autenticación por Contraseña
# Probar autenticación por contraseña explícitamente
ssh -o PreferredAuthentications=password usuario@ip-servidor
# Verificar si la autenticación por contraseña está habilitada
grep "PasswordAuthentication" /etc/ssh/sshd_config
# Verificar configuración PAM
cat /etc/pam.d/sshd
# Verificar estado de cuenta
passwd -S nombreusuario
chage -l nombreusuario
# Desbloquear cuenta si está bloqueada
passwd -u nombreusuario
Problemas de Autenticación por Clave
# Verificar que existe archivo authorized_keys y tiene contenido
[ -f ~/.ssh/authorized_keys ] && echo "Archivo existe" || echo "Archivo faltante"
wc -l ~/.ssh/authorized_keys
# Verificar que la clave en authorized_keys coincida con su clave pública
# En cliente:
cat ~/.ssh/id_rsa.pub
# En servidor:
grep "$(cat ~/.ssh/id_rsa.pub | cut -d' ' -f2)" ~/.ssh/authorized_keys
# Verificar StrictModes
grep "StrictModes" /etc/ssh/sshd_config
# Si yes, el directorio home no debe ser escribible por otros
ls -ld /home/nombreusuario
chmod 755 /home/nombreusuario
Problemas de Permisos
SSH es estricto sobre permisos de archivo:
# Verificar todos los permisos relacionados con SSH
# Directorio home
ls -ld /home/nombreusuario # Debería ser 755 o 700
# Directorio .ssh
ls -ld /home/nombreusuario/.ssh # Debería ser 700
# authorized_keys
ls -l /home/nombreusuario/.ssh/authorized_keys # Debería ser 600
# Corregir todos los permisos
chmod 755 /home/nombreusuario
chmod 700 /home/nombreusuario/.ssh
chmod 600 /home/nombreusuario/.ssh/authorized_keys
chown -R nombreusuario:nombreusuario /home/nombreusuario/.ssh
Paso 7: Análisis de Logs
Logs del Servidor SSH
Verificar logs del demonio SSH para intentos de conexión:
# Entradas recientes de log SSH
journalctl -u sshd -n 100
journalctl -u ssh -n 100
# Seguir logs SSH en tiempo real
journalctl -u sshd -f
# Logs de autenticación
tail -100 /var/log/auth.log # Debian/Ubuntu
tail -100 /var/log/secure # CentOS/RHEL
# Buscar usuario específico
grep "usuario@" /var/log/auth.log
journalctl -u sshd | grep "nombreusuario"
# Intentos de autenticación fallidos
grep "Failed password" /var/log/auth.log | tail -20
grep "Connection closed" /var/log/auth.log | tail -20
# Logins exitosos
grep "Accepted" /var/log/auth.log | tail -20
# Errores relacionados con claves
grep "publickey" /var/log/auth.log | tail -20
Mensajes de Error Comunes en Logs
# "Permission denied (publickey)"
# Causa: Fallo de autenticación por clave
# Verificar: authorized_keys, permisos de clave
# "User nombreusuario from IP not allowed"
# Causa: Restricción AllowUsers/DenyUsers
# Verificar: /etc/ssh/sshd_config
# "Authentication refused: bad ownership or modes"
# Causa: Permisos incorrectos en .ssh o authorized_keys
# Corregir: chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
# "Could not load host key"
# Causa: Claves de host faltantes o corruptas
# Corregir: ssh-keygen -A
# "Connection closed by authenticating user"
# Causa: Varios fallos de autenticación
# Verificar: journalctl -u sshd para detalles
Demonio SSH en Modo Debug
Ejecutar demonio SSH en modo debug (cuidado - detiene SSH normal):
# Detener servicio SSH
systemctl stop sshd
# Ejecutar en modo debug
/usr/sbin/sshd -d -p 2222
# En otra terminal, conectar
ssh -p 2222 usuario@localhost
# Para salida más verbosa
/usr/sbin/sshd -ddd -p 2222
# Cuando termine, detener demonio debug y reiniciar servicio normal
systemctl start sshd
Análisis de Causa Raíz
Problemas Comunes de Conectividad SSH
1. Problemas de Red/Firewall
- Firewall bloqueando puerto 22
- Dirección IP o hostname incorrectos
- Problemas de enrutamiento de red
- Grupos de seguridad de proveedor de nube
2. Problemas de Servicio SSH
- Demonio SSH no ejecutándose
- Configuración de puerto incorrecta
- Servicio se cayó o falla al iniciar
- Errores de sintaxis de configuración
3. Problemas de Autenticación
- Nombre de usuario o contraseña incorrectos
- Claves SSH no configuradas correctamente
- Problemas con archivo authorized_keys
- Problemas de permisos en archivos/directorios
4. Problemas de Configuración
- PermitRootLogin establecido en no
- PasswordAuthentication deshabilitada
- Usuario no en lista AllowUsers
- MaxAuthTries excedido
5. Problemas del Sistema
- Disco lleno previniendo escrituras
- Demasiados archivos abiertos
- SELinux/AppArmor bloqueando
- Problemas de configuración PAM
Soluciones y Remediación
Soluciones Rápidas para Problemas Comunes
Connection Timeout:
# Verificar y permitir SSH a través del firewall
ufw allow 22/tcp
firewall-cmd --add-service=ssh --permanent && firewall-cmd --reload
# Verificar que SSH está ejecutándose
systemctl start sshd && systemctl enable sshd
Connection Refused:
# Iniciar servicio SSH
systemctl start sshd
# Verificar que SSH está escuchando
ss -tlnp | grep :22
Permission Denied:
# Corregir permisos de archivos SSH
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chown -R $USER:$USER ~/.ssh
Host Key Verification Failed:
# Eliminar clave antigua de known_hosts
ssh-keygen -R hostname-servidor
ssh-keygen -R ip-servidor
# Regenerar claves de host del servidor (en servidor)
rm /etc/ssh/ssh_host_*
ssh-keygen -A
systemctl restart sshd
Too Many Authentication Failures:
# Limpiar ssh-agent y agregar solo clave necesaria
ssh-add -D
ssh-add ~/.ssh/id_rsa
# O especificar clave explícitamente
ssh -i ~/.ssh/clave_especifica usuario@servidor
Recuperación de Acceso de Emergencia
Si está completamente bloqueado:
- Usar consola de proveedor de nube (AWS, DigitalOcean, etc.)
- Usar IPMI/iLO/iDRAC para bare metal
- Arrancar desde modo de rescate y corregir configuración
- Contactar al proveedor de hosting para acceso a consola
Restaurando Configuración SSH
# Respaldar configuración actual
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
# Restaurar configuración predeterminada
# Debian/Ubuntu
cp /usr/share/openssh/sshd_config /etc/ssh/sshd_config
# O crear configuración mínima funcional
cat > /etc/ssh/sshd_config << 'EOF'
Port 22
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
EOF
# Probar y reiniciar
sshd -t && systemctl restart sshd
Prevención y Mejores Prácticas
Configuración SSH Segura
# Configuraciones recomendadas de /etc/ssh/sshd_config
cat >> /etc/ssh/sshd_config << 'EOF'
# Endurecimiento de seguridad
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
# Limitar usuarios
AllowUsers nombreusuario1 nombreusuario2
# Configuraciones de conexión
MaxAuthTries 3
LoginGraceTime 60
ClientAliveInterval 300
ClientAliveCountMax 2
# Deshabilitar características no usadas
X11Forwarding no
PermitTunnel no
AllowAgentForwarding no
EOF
sshd -t && systemctl restart sshd
Monitoreo y Alertas
# Crear script de monitoreo SSH
cat > /usr/local/bin/ssh-monitor.sh << 'EOF'
#!/bin/bash
if ! systemctl is-active --quiet sshd; then
echo "¡Servicio SSH está caído!" | mail -s "Alerta SSH" [email protected]
systemctl start sshd
fi
# Verificar intentos fallidos excesivos
FAILED=$(grep "Failed password" /var/log/auth.log | tail -10 | wc -l)
if [ $FAILED -gt 5 ]; then
echo "Alto número de intentos SSH fallidos" | mail -s "Alerta de Seguridad SSH" [email protected]
fi
EOF
chmod +x /usr/local/bin/ssh-monitor.sh
# Agregar a crontab
echo "*/5 * * * * /usr/local/bin/ssh-monitor.sh" | crontab -
Métodos de Acceso de Respaldo
Siempre mantener acceso de respaldo:
# Configurar múltiples puertos SSH
cat >> /etc/ssh/sshd_config << 'EOF'
Port 22
Port 2222
EOF
# Permitir ambos en firewall
ufw allow 22/tcp
ufw allow 2222/tcp
# Probar configuración y reiniciar
sshd -t && systemctl restart sshd
Bastion/Jump Host SSH
Configurar jump host para seguridad adicional:
# En cliente, configurar SSH config
cat >> ~/.ssh/config << 'EOF'
Host bastion
HostName ip-bastion
User nombreusuario
IdentityFile ~/.ssh/clave_bastion
Host servidor-interno
HostName ip-interno
User nombreusuario
IdentityFile ~/.ssh/clave_interna
ProxyJump bastion
EOF
# Conectar a través de bastion
ssh servidor-interno
Mantenimiento Regular
# Script de verificación semanal de salud SSH
cat > /usr/local/bin/ssh-health-check.sh << 'EOF'
#!/bin/bash
echo "Verificación de Salud SSH - $(date)" > /tmp/ssh-health.txt
# Verificar servicio SSH
systemctl is-active sshd >> /tmp/ssh-health.txt
# Verificar puertos en escucha
ss -tlnp | grep sshd >> /tmp/ssh-health.txt
# Verificar intentos fallidos recientes
echo "Intentos fallidos en últimas 24h:" >> /tmp/ssh-health.txt
grep "Failed password" /var/log/auth.log | grep "$(date +%b\ %d)" | wc -l >> /tmp/ssh-health.txt
# Verificar permisos de archivos
echo "Permisos de directorio SSH:" >> /tmp/ssh-health.txt
ls -ld ~/.ssh >> /tmp/ssh-health.txt
ls -l ~/.ssh/authorized_keys >> /tmp/ssh-health.txt
mail -s "Reporte de Salud SSH" [email protected] < /tmp/ssh-health.txt
EOF
chmod +x /usr/local/bin/ssh-health-check.sh
Solución de Problemas Avanzada
Problemas de Túneles SSH y Port Forwarding
# Local port forwarding
ssh -L 8080:localhost:80 usuario@servidor -v
# Remote port forwarding
ssh -R 8080:localhost:80 usuario@servidor -v
# Dynamic SOCKS proxy
ssh -D 1080 usuario@servidor -v
# Verificar si el forwarding está permitido
grep "AllowTcpForwarding\|GatewayPorts" /etc/ssh/sshd_config
Problemas de X11 Forwarding
# Habilitar X11 forwarding
ssh -X usuario@servidor
# Verificar configuración X11
grep "X11Forwarding" /etc/ssh/sshd_config
grep "X11UseLocalhost" /etc/ssh/sshd_config
# Probar X11
echo $DISPLAY
xauth list
MTU y Problemas de Red
# Probar tamaño MTU
ping -M do -s 1472 ip-servidor
# Ajustar MTU si es necesario
ip link set dev eth0 mtu 1400
# SSH con consideración de MTU
ssh -o "IPQoS=throughput" usuario@servidor
Conclusión
Los problemas de conectividad SSH pueden derivarse de numerosas fuentes incluyendo problemas de red, configuraciones de firewall, fallos de autenticación o problemas de servicio. La clave para la solución efectiva de problemas es un enfoque sistemático:
- Comenzar con lo básico: Conectividad de red y estado del servicio
- Usar modo verboso: SSH -vvv proporciona información de depuración invaluable
- Verificar logs: Los logs del servidor revelan la mayoría de los problemas de autenticación y configuración
- Verificar permisos: SSH es estricto sobre permisos de archivo
- Probar incrementalmente: Aislar variables probando una cosa a la vez
- Documentar cambios: Mantener registro de lo que ha modificado
- Mantener acceso de respaldo: Siempre tener métodos de acceso alternativos
El mantenimiento regular, monitoreo apropiado, configuración segura y comprensión de los internos de SSH ayudarán a prevenir la mayoría de los problemas de conectividad. Cuando ocurran problemas, este enfoque de diagnóstico sistemático le ayudará a identificarlos y resolverlos rápidamente.
Recuerde siempre probar cambios en entornos que no sean de producción primero, mantener respaldos de archivos de configuración y documentar sus pasos de solución de problemas para referencia futura.


