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:

  1. Resolución DNS: El cliente resuelve el hostname del servidor a dirección IP
  2. Conectividad de Red: Conexión TCP establecida en puerto 22 (predeterminado)
  3. Negociación de Protocolo SSH: Cliente y servidor acuerdan versión de protocolo
  4. Intercambio de Claves: Claves criptográficas intercambiadas para encriptación
  5. Autenticación: Credenciales de usuario verificadas (contraseña o basada en clave)
  6. 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:

  1. ¿Puede hacer ping al servidor?
  2. ¿Está abierto el puerto SSH?
  3. ¿Está ejecutándose el servicio SSH (si tiene acceso a consola)?
  4. ¿Son correctas las credenciales?
  5. ¿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:

  1. Consola del Proveedor de Nube: Consola AWS EC2, Consola DigitalOcean, etc.
  2. IPMI/iLO/iDRAC: Gestión fuera de banda
  3. VNC/KVM: Acceso a escritorio remoto
  4. 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:

  1. Usar consola de proveedor de nube (AWS, DigitalOcean, etc.)
  2. Usar IPMI/iLO/iDRAC para bare metal
  3. Arrancar desde modo de rescate y corregir configuración
  4. 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:

  1. Comenzar con lo básico: Conectividad de red y estado del servicio
  2. Usar modo verboso: SSH -vvv proporciona información de depuración invaluable
  3. Verificar logs: Los logs del servidor revelan la mayoría de los problemas de autenticación y configuración
  4. Verificar permisos: SSH es estricto sobre permisos de archivo
  5. Probar incrementalmente: Aislar variables probando una cosa a la vez
  6. Documentar cambios: Mantener registro de lo que ha modificado
  7. 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.