Solução de problemas de SSH

Existem muitas razões para uma instância do Compute Engine recusar conexões SSH. Veja abaixo algumas causas comuns para problemas de conexão SSH:

  • O Login do SO está ativado na instância. Não é possível usar simultaneamente chaves SSH baseadas em metadados e o Login do SO para se conectar a uma instância. Se o Login do SO estiver ativado, a conexão com chaves SSH baseadas em metadados será desativada, já que o Login do SO não armazena chaves SSH em arquivos de chaves autorizadas.
  • O Login do SO não está ativado. Quando o Login do SO não está ativado, o Google gerencia o arquivo de chaves autorizadas para novas contas de usuário com base em chaves SSH nos metadados. A instância do Compute Engine para de aceitar conexões SSH que usam as chaves SSH configuradas como parte da conta de usuário.
    • A senha de login de SSH de todas as imagens públicas está desativada.
    • O daemon de contas armazena um arquivo no ambiente para convidado para preservar o estado das contas de usuário gerenciadas pelo Google.
    • Quando você remove todas as chaves SSH da conta de usuário dos metadados, o arquivo de chaves autorizadas da conta gerenciada pelo Google é excluído.
    • O daemon de contas não modifica contas de usuário que não são gerenciadas pelo Google.
  • O disco da instância está cheio. Verifique o espaço em disco e faça a limpeza conforme necessário.
  • O daemon sshd não foi configurado corretamente. Consulte o guia do usuário do seu sistema operacional para garantir que o arquivo ssh_d (em inglês) esteja configurado corretamente.

Neste documento, você aprende a resolver problemas e algumas das questões mais comuns do SSH.

Requisitos

Realize a maioria das etapas de solução de problemas na estação de trabalho local. Primeiro, é necessário preparar a estação de trabalho Linux ou Windows local se quiser usá-la para solucionar problemas em uma instância de VM.

Siga estas etapas para preparar a estação de trabalho:

Testar a conectividade

Talvez não seja possível executar o SSH em uma instância de VM devido a problemas de conectividade vinculados a firewalls, conexão de rede ou conta de usuário. Siga as etapas nesta seção para identificar problemas de conectividade.

Verificar as regras de firewall

O Compute Engine provisiona a cada projeto um conjunto padrão de regras de firewall que permitem o tráfego SSH. Se não for possível acessar a instância, use a ferramenta de linha de comando gcloud compute para verificar a lista de firewalls e garantir a presença da regra default-allow-ssh.

Na estação de trabalho local, execute o comando a seguir:

gcloud compute firewall-rules list

Se você não encontrar a regra de firewall, adicione-a novamente:

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

Para visualizar todos os dados associados à regra de firewall default-allow-ssh no seu projeto, use o comando gcloud compute firewall-rules describe:

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

Testar conexão de rede

Para determinar se a conexão de rede está funcionando, use a ferramenta nmap para se conectar à instância da porta 22. Se você conseguir se conectar e vir 22/tcp open ssh, significará que a conexão de rede está funcionando e é possível descartar os problemas de firewall.

  1. Use a ferramenta gcloud para receber o natIP externo da instância:

    gcloud compute instances describe $PROB_INSTANCE \
        --format='get(networkInterfaces[0].accessConfigs[0].natIP)' \
    198.51.100.1
    
  2. Teste a conexão de rede com a instância.

    Execute o comando nmap para testar a conexão de rede, substituindo external-ip pelo IP externo da instância:

    nmap external-ip
    

    Por exemplo, se a instância tiver o IP externo 198.51.100.1, execute o comando a seguir:

    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
    

Conectar-se como um usuário diferente

Talvez o problema que impeça você de fazer login esteja restrito à sua conta de usuário. Por exemplo, pode ser que as permissões no arquivo ~/.ssh/authorized_keys da instância não estejam definidas corretamente para o usuário.

Tente fazer login como um usuário diferente com a ferramenta gcloud. Para isso, especifique another-username com a solicitação SSH. A ferramenta gcloud atualizará os metadados do projeto para adicionar o novo usuário e permitir o acesso por SSH.

gcloud compute ssh another-username@$PROB_INSTANCE

Depurar o problema no console serial

Recomendamos que você revise os registros do console serial para verificar se há erros de conexão. É possível acessar o console serial na sua estação de trabalho local usando um navegador.

Ative o acesso de leitura e gravação ao console serial de uma instância para que você consiga fazer login no console e solucionar os problemas nela. Isso é útil quando não é possível fazer login com SSH ou quando a instância não tem conexão com a rede. Ainda é possível acessar o console serial em ambas as situações.

Para aprender como ativar o acesso interativo e se conectar ao console serial de uma instância, consulte Como interagir com o console serial.

Inspecionar a instância de VM sem encerrá-la

Talvez você esteja com problemas para se conectar a uma instância que continua a exibir tráfego de produção corretamente. Nesse caso, convém inspecionar o disco sem interromper a instância.

Para inspecionar e resolver problemas do disco:

  1. Faça backup do disco de inicialização criando um snapshot do disco.
  2. Crie um disco permanente regular a partir desse snapshot.
  3. Crie uma instância temporária.
  4. Anexe e ative o disco permanente regular na nova instância temporária.

Esse procedimento cria uma rede isolada que permite apenas conexões SSH. Essa configuração impede que a instância clonada produza efeitos indesejados nos serviços de produção.

  1. Crie uma nova rede VPC para hospedar a instância clonada:

    gcloud compute networks create debug-network
    
  2. Adicione uma regra de firewall para possibilitar conexões SSH à rede:

    gcloud compute firewall-rules create debug-network-allow-ssh \
       --allow tcp:22
    
  3. Crie um snapshot do disco de inicialização.

    gcloud compute disks snapshot $BOOT_DISK \
       --snapshot-names debug-disk-snapshot
    
  4. Crie um novo disco com esse snapshot:

    gcloud compute disks create example-disk-debugging \
       --source-snapshot debug-disk-snapshot
    
  5. Crie uma instância de depuração sem um endereço IP externo:

    gcloud compute instances create debugger \
       --network debug-network \
       --no-address
    
  6. Anexe o disco de depuração à instância:

    gcloud compute instances attach-disk debugger \
       --disk example-disk-debugging
    
  7. Siga as instruções para conectar-se a uma instância sem um endereço IP externo.

  8. Depois de fazer login na instância de depuração, solucione o problema nela. Por exemplo, analise os registros da instância:

    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
    

Usar um script de inicialização

Se nenhuma das opções anteriores tiver ajudado, crie um script de inicialização para coletar informações logo após o início da instância. Siga as instruções para executar esse script.

Depois, também será necessário redefinir a instância antes que os metadados entrem em vigor. Para isso, use o comandogcloud compute instances reset.

Como alternativa, é possível recriar a instância executando um script de inicialização de diagnóstico:

  1. Execute gcloud compute instances delete com a sinalização --keep-disks.

    gcloud compute instances delete $PROB_INSTANCE \
       --keep-disks boot
    
  2. Adicione uma nova instância com o mesmo disco e especifique o script de inicialização.

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

Como ponto de partida, use o script compute-ssh-diagnostic (em inglês) para coletar informações de diagnóstico dos problemas mais comuns.

Usar seu disco em uma instância nova

Se ainda for necessário recuperar dados do disco de inicialização permanente, desanexe-o e, em seguida, conecte-o como um disco secundário em uma nova instância.

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