Solução de problemas do SSH

Em determinadas condições, é possível que uma instância do Google Compute Engine não aceite mais conexões SSH. Há muitos motivos para isso acontecer. Algumas causas comuns para problemas de conexão SSH são estas:

  • Um 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. Verifique o guia de usuário do seu sistema operacional para garantir que o arquivo ssh_d (em inglês) esteja configurado corretamente.
  • O Login do SO está ativado na instância. Não é possível usar as chaves SSH e o Login do SO para se conectar a uma instância. Se o Login do SO estiver ativado, a conexão com as chaves SSH baseadas em metadados será desativada.

Neste documento, você vê várias dicas e abordagens para solucionar problemas do SSH, incluindo alguns dos mais comuns.

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:

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]'

em que:

  • [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 a instância for denominada instance1, e o disco de inicialização for disk1, execute os comandos a seguir:

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

Windows

No sistema operacional Windows, use o comando set.

set PROB_INSTANCE='[INSTANCE_NAME]'
set BOOT_DISK='[BOOT_DISK_NAME]'

em que:

  • [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 a instância for denominada instance1, e o disco de inicialização for 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

Cada projeto do Google Compute Engine é provisionado com um conjunto padrão de regras de firewall que permite o tráfego do SSH. Se por algum motivo essas regras forem removidas, não será possível acessar a instância. Veja a lista de firewalls com a ferramenta de linha de comando gcloud compute e verifique se a regra default-allow-ssh está 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 a conexão de rede

É possível usar a ferramenta nmap para se conectar à instância na porta 22 e ver se a conexão de rede está funcionando. Se você conseguir se conectar, e a mensagem 22/tcp open ssh for exibida, a conexão de rede estará funcionando e será possível descartar a possibilidade de problemas no firewall.

  1. Use a ferramenta da gcloud para conseguir 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 sua instância.

    Execute o comando nmap para testar a conexão de rede com sua instância:

    nmap [EXTERNAL_IP]
    

    em que [EXTERNAL_IP] é o IP externo da instância.

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

    user@local:~$  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 limitado à sua conta de usuário. Por exemplo, se as permissões no arquivo ~/.ssh/authorized_keys da instância foram definidas incorretamente para o usuário.

Tente fazer login como um usuário diferente com a ferramenta da gcloud. Basta especificar outro nome de usuário com a solicitação SSH. A ferramenta da gcloud atualizará os metadados do projeto para adicionar o novo usuário e permitir o acesso SSH.

user@local:~$ gcloud compute ssh [USER]@$PROB_INSTANCE

em que [USER] é um novo nome de usuário para fazer login.

Depurar o problema no console serial

Em alguns casos, talvez você encontre erros de conexão ao verificar os registros do console serial. É possível acessar o console serial a partir da 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ê possa fazer login no console e solucionar os problemas com essa instância. Isso é especialmente útil quando você não consegue fazer login com o SSH, ou se a instância não tem conexão com a rede. O console serial ainda pode ser acessado em ambas as situações.

Para saber como ativar o acesso interativo e conectar-se a um console serial de instância, leia Como interagir com o console serial.

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

Talvez você não consiga se conectar a uma instância que continua veiculando tráfego de produção corretamente. Nesse caso, inspecione o disco sem interromper a instância.

Para inspecionar a instância, você precisa capturar um snapshot do disco de inicialização, criar um novo disco a partir desse snapshot e gerar uma instância temporária. Por último, anexe e ative 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. Após fazer login na instância de depuração, resolva o problema da instância. Por exemplo, procure nos 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 nada disso ajudou, você pode criar um script de inicialização para coletar informações logo após a inicialização da instância. Siga as instruções para executar esse script.

Em seguida, também será necessário redefinir a instância com gcloud compute instances reset para que os metadados entrem em vigor. Como alternativa, recrie a instância com 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 nova instância

Se as outras etapas deste documento não funcionarem, e você precisar recuperar dados do disco de inicialização permanente, desanexe o disco de inicialização e, em seguida, conecte esse disco como um 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
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine