Solución de problemas de SSH

Existen muchas razones por las que una instancia de Compute Engine podría rechazar conexiones SSH. Algunas causas comunes de problemas de conexión SSH son las siguientes:

  • OS Login está habilitado en la instancia. No puedes utilizar al mismo tiempo las Llaves SSH basadas en metadatos y el acceso a SO para conectarte a una instancia. Si el Acceso al SO está habilitado, la conexión con claves SSH basadas en metadatos se inhabilita porque el Acceso al SO no almacena claves SSH en archivos de claves autorizadas.
  • El Acceso al SO no está habilitado. Cuando el acceso a SO no está habilitado, Google administra el archivo de llaves autorizadas para las nuevas cuentas de usuario en función de las Llaves SSH en los metadatos. Una instancia de Compute Engine ya no acepta conexiones SSH con las claves SSH configuradas como parte de la cuenta de usuario.
    • Todas las imágenes públicas tienen el acceso con contraseñas SSH inhabilitado.
    • El daemon de las cuentas almacena un archivo en el invitado para preservar el estado de las cuentas de usuario administradas por Google.
    • Cuando quitas todas las claves SSH de la cuenta de usuario de los metadatos, se borra el archivo de claves autorizadas para una cuenta de usuario administrada por Google.
    • El daemon de las cuentas no modifica las cuentas de usuario que Google no administra.
  • La instancia tiene el disco lleno. Verifica tu espacio en disco y límpialo según sea necesario.
  • El daemon sshd no está configurado en forma correcta. Revisa la guía del usuario del sistema operativo para asegurarte de que el archivo ssh_d esté configurado de forma correcta.

En este tema, se describen formas de solucionar y resolver algunos de los problemas de SSH más comunes.

Requisitos

Puedes ejecutar la mayoría de los pasos para la solución de problemas desde tu estación de trabajo local. Para usar una estación de trabajo local de Linux o Windows a fin de solucionar problemas de una instancia de VM, primero debes prepararla.

Sigue estos pasos para preparar la estación de trabajo:

Prueba la conectividad

Es posible que no puedas acceder mediante SSH a una instancia de VM debido a problemas de conectividad relacionados con firewalls, con la conexión de red o con la Cuenta de usuario. Sigue los pasos de esta sección para identificar cualquier problema de conectividad.

Verifica las reglas de firewall

Compute Engine aprovisiona cada proyecto con un conjunto predeterminado de reglas de firewall que permiten el tráfico SSH. Si no puedes acceder a la instancia, usa la herramienta de línea de comandos de gcloud compute para verificar la lista de firewalls y asegurarte de que la regla default-allow-ssh está presente.

En la estación de trabajo local, ejecuta el siguiente comando:

gcloud compute firewall-rules list

Si falta la regla de firewall, agrégala de nuevo:

gcloud compute firewall-rules create default-allow-ssh --allow tcp:22

Para ver todos los datos asociados a la regla de firewall default-allow-ssh en el proyecto, usa el comando gcloud compute firewall-rules describe:

gcloud compute firewall-rules describe default-allow-ssh --project

Prueba la conexión de red

A fin de determinar si la conexión de red funciona, usa la herramienta nmap para conectarte a la instancia en el puerto 22. Si cuando te conectas ves 22/tcp open ssh, significa que la conexión de red funciona y puedes descartar problemas de firewall.

  1. Usa la herramienta de gcloud a fin de obtener la natIP externa para la instancia:

    gcloud compute instances describe $PROB_INSTANCE \
        --format='get(networkInterfaces[0].accessConfigs[0].natIP)' \
    198.51.100.1
    
  2. Prueba la conexión de red a tu instancia.

    Ejecuta el comando nmap para probar la conexión de red a tu instancia y reemplazar external-ip con la IP externa de la instancia:

    nmap external-ip
    

    Por ejemplo, si la instancia tiene la IP externa 198.51.100.1, ejecuta el siguiente comando:

    nmap 198.51.100.1
    Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-18 16:04 Greenwich Standard Time
    Nmap scan report for 229.30.196.35.bc.googleusercontent.com (198.51.100.1)
    Host is up (0.0061s latency).
    Not shown: 998 filtered ports
    PORT     STATE  SERVICE
    22/tcp   open   ssh
    Nmap done: 1 IP address (1 host up) scanned in 6.22 seconds
    

Conéctate como un usuario diferente

El problema que impide el acceso puede estar limitado a tu cuenta de usuario. Por ejemplo, es posible que los permisos del archivo ~/.ssh/authorized_keys en la instancia no estén configurados correctamente para el usuario.

Intenta acceder como otro usuario con la herramienta de gcloud. Para ello, especifica another-username con la solicitud SSH. La herramienta de gcloud actualizará los metadatos del proyecto a fin de agregar el usuario nuevo y permitir el acceso SSH.

gcloud compute ssh another-username@$PROB_INSTANCE

Depura el problema en la consola en serie

Te recomendamos que revises los registros de la consola en serie para detectar errores de conexión. Puedes acceder a la consola en serie desde tu estación de trabajo local con un navegador.

Habilita el acceso de lectura/escritura a la consola en serie de una instancia para poder acceder a la consola y solucionar problemas con la instancia. Este enfoque es útil cuando no puedes acceder con SSH o si la instancia no tiene conexión a la red. La consola en serie permanece accesible en ambas situaciones.

Para saber cómo habilitar el acceso interactivo y conectarte a la consola en serie de una instancia, consulta Interactúa con la consola en serie.

Inspecciona la instancia de VM sin cerrarla

Es posible que tengas una instancia a la que no puedas conectarte que siga entregando tráfico de producción de forma correcta. En este caso, se recomienda inspeccionar el disco sin interrumpir la instancia.

Para inspeccionar y solucionar problemas en el disco, sigue estos pasos:

  1. Crea una copia de seguridad de tu disco de arranque. Para ellos, crea una instantánea del disco.
  2. Crea un disco persistente regular a partir de esa instantánea.
  3. Crea una instancia temporal.
  4. Conecta y activa el disco persistente regular a la instancia temporal nueva.

En este procedimiento, se crea una red aislada que solo permite conexiones SSH. Esta configuración evita que cualquier consecuencia no deseada de la instancia clonada interfiera en los servicios de producción.

  1. Crea una nueva red de VPC para alojar la instancia clonada:

    gcloud compute networks create debug-network
    
  2. Agrega una regla de firewall para permitir conexiones SSH a la red:

    gcloud compute firewall-rules create debug-network-allow-ssh \
       --allow tcp:22
    
  3. Crea una instantánea del disco de arranque.

    gcloud compute disks snapshot $BOOT_DISK \
       --snapshot-names debug-disk-snapshot
    
  4. Crea un disco nuevo con la instantánea que acabas de crear:

    gcloud compute disks create example-disk-debugging \
       --source-snapshot debug-disk-snapshot
    
  5. Crea una instancia de depuración nueva sin una dirección IP externa:

    gcloud compute instances create debugger \
       --network debug-network \
       --no-address
    
  6. Conecta el disco de depuración a la instancia:

    gcloud compute instances attach-disk debugger \
       --disk example-disk-debugging
    
  7. Sigue las instrucciones para conectarte a una instancia sin una dirección IP externa.

  8. Después de acceder a la instancia del depurador, soluciona los problemas de la instancia. Por ejemplo, puedes ver los registros de instancias:

    sudo su -
    
    mkdir /mnt/$PROB_INSTANCE
    
    mount /dev/disk/by-id/scsi-0Google_PersistentDisk_example-disk-debugging /mnt/$PROB_INSTANCE
    
    cd /mnt/$PROB_INSTANCE/var/log
    
    # Identify the issue preventing ssh from working
    ls
    

Usa una secuencia de comandos de inicio

Si nada de lo anterior te ayudó, puedes crear una secuencia de comandos de inicio para recopilar información justo después de que comience la instancia. Sigue las instrucciones para ejecutar una secuencia de comandos de inicio.

Luego, también debes restablecer la instancia mediante gcloud compute instances reset para que se apliquen los metadatos.

Como alternativa, puedes volver a crear la instancia si ejecutas una secuencia de comandos de inicio de diagnóstico:

  1. Ejecuta gcloud compute instances delete con la marca --keep-disks.

    gcloud compute instances delete $PROB_INSTANCE \
       --keep-disks boot
    
  2. Agrega una instancia nueva con el mismo disco y especifica la secuencia de comandos de inicio.

    gcloud compute instances create new-instance \
       --disk name=$BOOT_DISK,boot=yes \
       --startup-script-url URL
    

Como punto de partida, puedes usar la secuencia de comandos compute-ssh-diagnostic para recopilar información de diagnóstico de los problemas más comunes.

Usa el disco en una instancia nueva

Si aún necesitas recuperar datos del disco de arranque persistente, puedes desconectarlo y, luego, conectarlo como disco secundario en una instancia nueva.

gcloud compute instances delete $PROB_INSTANCE \
    --keep-disks=boot 
gcloud compute instances create new-instance \
    --disk name=$BOOT_DISK,boot=yes,auto-delete=no 
gcloud compute ssh new-instance