Solução de problemas de SSH

Em determinadas condições, é possível que uma instância do Compute Engine não aceite mais conexões SSH. Há muitos motivos para isso acontecer. 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 (em inglês). 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.
    • O daemon de contas armazena um arquivo no ambiente para convidado para preservar o estado das contas de usuário gerenciadas pelo Google.
    • O arquivo de chaves autorizadas para uma conta de usuário gerenciada pelo Google é excluído quando todas as chaves SSH dessa conta são removidas dos metadados.
    • As contas de usuário que não são gerenciadas pelo Google não são modificadas pelo daemon de contas.
  • 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ê verá várias dicas e abordagens para solucionar problemas, incluindo alguns dos mais comuns de 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:

  • Instale a ferramenta de linha de comando da gcloud ou atualize-a para a versão mais recente.
  • Instale a ferramenta de auditoria de segurança e descoberta de rede nma (em inglês) do seu sistema operacional. Ela será usada para testar a conexão de rede com a instância de VM.
  • Defina variáveis de ambiente.

Definir as variáveis de ambiente

Defina variáveis de ambiente para quaisquer parâmetros que possam ser usados com frequência neste guia de solução de problemas. Isso inclui o nome da instância e do disco de inicialização permanente da instância afetada.

Defina variáveis de ambiente na estação de trabalho local.

Linux ou macOS

Em uma estação de trabalho Linux ou macOS, use o comando export.

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

Substitua os valores a seguir:

  • instance-name: o nome da instância com o problema a ser solucionado.
  • boot-disk-name: o nome do disco de inicialização permanente da instância com o problema a ser solucionado.

Por exemplo, se sua instância e disco de inicialização tiverem os nomes, respectivamente, instance1 e disk1, execute os comandos a seguir:

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

Windows

No sistema operacional Windows, use o comando set (em inglês).

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

Substitua os valores a seguir:

  • instance-name: o nome da instância com o problema a ser solucionado.
  • boot-disk-name: o nome do disco de inicialização permanente da instância com o problema a ser solucionado.

Por exemplo, se sua instância e disco de inicialização tiverem os nomes, respectivamente, instance1 e disk1, execute os comandos a seguir:

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

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 por algum motivo a regra de firewall que permite conexões SSH for removida, não será possível acessar a instância. Use a ferramenta de linha de comando gcloud compute para verificar a lista de firewalls e garantir que a regra default-allow-ssh esteja presente.

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

Testar conexão de rede

É possível usar a ferramenta nmap para se conectar à instância na porta 22 e verificar se a conexão de rede está funcionando. Se você conseguir se conectar e vir 22/tcp open ssh, significará que sua 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. Basta especificar another-username com a solicitação SSH. A ferramenta 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 principalmente quando não é possível fazer login com SSH ou a instância não tem conexão com a rede. O console serial ainda pode ser acessado 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 fazer isso, é necessário gerar um snapshot do disco de inicialização, criar um disco novo a partir desse snapshot, gerar uma instância temporária e, por fim, anexar e ativar o novo disco permanente na instância temporária para solucionar o problema.

  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-name 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 as outras etapas deste documento não funcionarem e você precisar recuperar dados do disco de inicialização permanente, desanexe esse disco e, em seguida, conecte-o como um disco secundário em uma instância nova.

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
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine