Solución de problemas de la conexión SSH

En ciertas condiciones, una instancia de Compute Engine no acepta conexiones SSH. Hay muchas razones por las que esto podría suceder. Algunas causas comunes de problemas de conexión SSH son las siguientes:

  • El Acceso al SO está habilitado en la instancia. No puedes usar al mismo tiempo las llaves SSH basadas en metadatos y el Acceso al SO para conectarte a una instancia. Si el Acceso al SO está habilitado, la conexión con llaves SSH basadas en metadatos se inhabilita porque el Acceso al SO no almacena llaves SSH en archivos de claves autorizadas.
  • El Acceso al SO no está habilitado. Cuando el Acceso al SO no está habilitado, Google administra el archivo de claves 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 llaves SSH configuradas como parte de la cuenta de usuario.
    • El daemon de las cuentas almacena un archivo en el invitado para preservar el estado de las cuentas de usuario administradas por Google.
    • El archivo de claves autorizadas para una cuenta de usuario administrada por Google se borra cuando todas las llaves SSH de la cuenta de usuario se quitan de los metadatos.
    • El daemon de las cuentas no modifica las cuentas de usuario que no administra Google.
  • La instancia tiene el disco lleno. Verifica tu espacio en disco y límpialo según sea necesario.
  • El daemon sshd no está configurado de 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 consejos y enfoques para solucionar problemas comunes de SSH.

Requisitos

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

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

  • Instala la herramienta de línea de comandos de gcloud o actualízala a la última versión.
  • Instala la herramienta nmap de descubrimiento de red y de auditoría de seguridad para el sistema operativo. La usarás para probar la conexión de red a la instancia de VM.
  • Configura variables de entorno.

Configura variables de entorno

Puedes establecer variables de entorno para cualquier parámetro que pueda usarse con frecuencia en esta guía de solución de problemas, como el nombre de la instancia y el nombre del disco de arranque persistente de la instancia afectada.

Configura variables de entorno en la estación de trabajo local.

Linux o macOS

En una estación de trabajo Linux o macOS, usa el comando export.

    export PROB_INSTANCE='instance-name'
    export BOOT_DISK='boot-disk-name'
    

Reemplaza los siguientes elementos:

  • instance-name: El nombre de la instancia en la que estás solucionando problemas
  • boot-disk-name: El nombre del disco de arranque persistente para la instancia en la que estás solucionando problemas

Por ejemplo, si la instancia se llama instance1, y el disco de arranque se llama disk1, ejecuta los siguientes comandos:

export PROB_INSTANCE='instance1'
    export BOOT_DISK='disk1'
    

Windows

En el SO de Windows, usa el comando set:

    set PROB_INSTANCE='instance-name'
    set BOOT_DISK='boot-disk-name'
    

Reemplaza los siguientes elementos:

  • instance-name: El nombre de la instancia en la que estás solucionando problemas
  • boot-disk-name: El nombre del disco de arranque persistente para la instancia en la que estás solucionando problemas

Por ejemplo, si la instancia se llama instance1, y el disco de arranque se llama disk1, ejecuta los siguientes comandos:

set PROB_INSTANCE='instance1'
    set BOOT_DISK='disk1'
    

Prueba la conectividad

Es posible que no puedas establecer una conexión SSH a una instancia de VM debido a problemas de conectividad relacionados con los firewalls, la conexión de red o 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 la regla de firewall predeterminada que permite conexiones SSH se quita, no podrás 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
    

Prueba la conexión de red

Puedes usar la herramienta nmap para conectarte a la instancia en el puerto 22 y ver si la conexión de red funciona. 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 la instancia.

    Ejecuta el comando nmap para probar la conexión de red a la instancia y reemplaza external-ip por 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 que accedas 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 de forma correcta para el usuario.

Intenta acceder con otro usuario mediante 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 la 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. Esto es muy ú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 aprender a 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 sigue entregando tráfico de producción de forma correcta. En este caso, se recomienda inspeccionar el disco sin interrumpir la instancia.

Para inspeccionar el disco, debes tomar una instantánea del disco de arranque, crear un disco nuevo a partir de esa instantánea, crear una instancia temporal y, luego, conectar y activar el nuevo disco persistente en la instancia temporal a fin de solucionar los problemas del disco.

  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-name 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. Adjunta 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 funcionó, puedes crear una secuencia de comandos de inicio para recopilar información justo después de que se inicie la instancia. Sigue las instrucciones para ejecutar una secuencia de comandos de inicio.

Luego, también debes restablecer la instancia con 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 frecuentes.

Usa el disco en una instancia nueva

Si los otros pasos de este documento no funcionaron y necesitas recuperar datos del disco de arranque persistente, puedes desconectar el disco de arranque y, luego, conectarlo como disco secundario en una nueva instancia.

    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