Fehlerbehebung für SSH

Unter bestimmten Umständen akzeptiert eine Compute Engine-Instanz keine SSH-Verbindungen mehr. Dies kann viele Gründe haben. Im Folgenden sind einige häufige Ursachen für SSH-Verbindungsprobleme aufgeführt:

  • OS Login ist für die Instanz aktiviert. Metadatenbasierte SSH-Schlüssel und OS Login können nicht gleichzeitig verwendet werden, um eine Verbindung zu einer Instanz herzustellen. Wenn OS Login aktiviert ist, kann keine Verbindung mit metadatenbasierten SSH-Schlüsseln hergestellt werden, da OS Login keine SSH-Schlüssel in Dateien für autorisierte Schlüssel speichert.
  • OS Login ist nicht aktiviert. Wenn OS Login nicht aktiviert ist, verwaltet Google die Datei mit den autorisierten Schlüsseln für neue Nutzerkonten basierend auf SSH-Schlüsseln in Metadaten. Eine Compute Engine-Instanz akzeptiert keine SSH-Verbindungen mehr, bei denen die SSH-Schlüssel als Bestandteil Ihres Nutzerkontos konfiguriert wurden.
    • Der Konten-Daemon speichert eine Datei im Gastkonto, um den Status für die von Google verwalteten Nutzerkonten beizubehalten.
    • Die Datei mit den autorisierten Schlüsseln für ein von Google verwaltetes Nutzerkonto wird gelöscht, wenn alle SSH-Schlüssel für das Nutzerkonto aus den Metadaten entfernt wurden.
    • Nutzerkonten, die nicht von Google verwaltet werden, werden vom Konten-Daemon nicht geändert.
  • Das Laufwerk der Instanz ist voll. Prüfen Sie den Speicherplatz und bereinigen Sie ihn nach Bedarf.
  • Der sshd-Daemon ist nicht ordnungsgemäß konfiguriert. Prüfen Sie anhand des Benutzerhandbuchs für Ihr Betriebssystem, ob die Datei sshd_config korrekt eingerichtet ist.

In diesem Thema wird eine Reihe von Tipps und Vorgehensweisen zur Behebung einiger der häufigsten SSH-Probleme vorgestellt.

Voraussetzungen

Sie können die meisten Schritte zur Fehlerbehebung auf Ihrer lokalen Workstation ausführen. Für die Verwendung einer lokalen Linux- oder Windows-Workstation zur Fehlerbehebung einer VM-Instanz müssen Sie die Workstation aber zuerst vorbereiten.

Zur Vorbereitung der Workstation sind folgende Schritte erforderlich:

  • Installieren Sie das gcloud-Befehlszeilentool oder aktualisieren Sie es auf die neueste Version.
  • Installieren Sie das nmap-Tool zur Netzwerkerkennung und Sicherheitsüberwachung für Ihr Betriebssystem. Mit diesem Tool testen Sie die Netzwerkverbindung zu Ihrer VM-Instanz.
  • Legen Sie Umgebungsvariablen fest.

Umgebungsvariablen festlegen

Sie können Umgebungsvariablen für alle Parameter festlegen, die in diesem Leitfaden zur Fehlerbehebung häufiger verwendet werden, etwa für den Instanznamen oder für den Namen des nichtflüchtigen Bootlaufwerks der betreffenden Instanz.

Sie können die Umgebungsvariablen auf Ihrer lokalen Workstation festlegen.

Linux oder MacOS

Verwenden Sie auf einer Linux- oder MacOS-Workstation den Befehl export.

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

Die Platzhalter müssen Sie durch folgende Angaben ersetzen:

  • instance-name: der Name der Instanz, für die Sie eine Fehlerbehebung durchführen
  • boot-disk-name: der Name des nichtflüchtigen Bootlaufwerks, für das Sie eine Fehlerbehebung durchführen

Führen Sie beispielsweise für eine Instanz mit dem Namen instance1 und ein Bootlaufwerk mit dem Namen disk1 folgende Befehle aus:

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

Windows

Verwenden Sie unter Windows den Befehl "set".

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

Die Platzhalter müssen Sie durch folgende Angaben ersetzen:

  • instance-name: der Name der Instanz, für die Sie eine Fehlerbehebung durchführen
  • boot-disk-name: der Name des nichtflüchtigen Bootlaufwerks, für das Sie eine Fehlerbehebung durchführen

Führen Sie beispielsweise für eine Instanz mit dem Namen instance1 und ein Bootlaufwerk mit dem Namen disk1 folgende Befehle aus:

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

Verbindung testen

Es kann vorkommen, dass Sie aufgrund von Verbindungsproblemen, die mit Firewalls, Netzwerkverbindungen oder dem Nutzerkonto zusammenhängen, keine SSH-Verbindung zu einer VM-Instanz herstellen können. Die Schritte dieses Abschnitts bieten die Möglichkeit, die jeweiligen Ursachen für die Verbindungsprobleme zu ermitteln.

Firewallregeln prüfen

Compute Engine stellt für jedes Projekt eine Gruppe standardmäßiger Firewallregeln bereit, die Traffic über SSH erlauben. Sollte die Standard-Firewallregel, die SSH-Verbindungen zulässt, auf irgendeine Weise entfernt worden sein, können Sie nicht auf die Instanz zugreifen. Prüfen Sie mit dem gcloud compute-Befehlszeilentool, ob in der Liste der Firewalls die Regel default-allow-ssh enthalten ist.

Führen Sie auf Ihrer lokalen Workstation den folgenden Befehl aus:

gcloud compute firewall-rules list

Wenn die Regel fehlt, fügen Sie sie wieder hinzu:

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

Netzwerkverbindung testen

Mit dem nmap-Tool können Sie eine Verbindung zu Ihrer Instanz an Port 22 herstellen und prüfen, ob die Netzwerkverbindung funktioniert. Wenn nach dem Herstellen einer Verbindung 22/tcp open ssh angezeigt wird, ist Ihre Netzwerkverbindung aktiv. Damit sind Firewallprobleme ausgeschlossen.

  1. Rufen Sie mit dem gcloud-Tool den externen natIP-Wert für Ihre Instanz auf:

    gcloud compute instances describe $PROB_INSTANCE
        --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
    198.51.100.1
    
  2. Testen Sie die Netzwerkverbindung zu Ihrer Instanz.

    Führen Sie den Befehl nmap aus, um die Netzwerkverbindung zu Ihrer Instanz zu testen. Ersetzen Sie dabei external-ip durch die externe IP-Adresse der Instanz:

    nmap external-ip
    

    Wenn die Instanz beispielsweise die externe IP-Adresse 198.51.100.1 hat, führen Sie den folgenden Befehl aus:

    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
    

Nutzer für eine Verbindung ändern

Eine fehlgeschlagene Anmeldung ist möglicherweise auf das verwendete Nutzerkonto zurückzuführen. Es kann beispielsweise sein, dass die Berechtigungen in der Datei ~/.ssh/authorized_keys der Instanz für den Nutzer nicht ordnungsgemäß festgelegt wurden.

Melden Sie sich zur Klärung mit dem gcloud-Tool als ein anderer Nutzer an. Ersetzen Sie dabei in der SSH-Anfrage another-username durch einen anderen Nutzernamen. Das gcloud-Tool aktualisiert dann die Metadaten des Projekts, um den neuen Nutzer hinzuzufügen und den SSH-Zugriff zuzulassen.

gcloud compute ssh another-username@$PROB_INSTANCE

Fehler mithilfe der seriellen Konsole beheben

Wir empfehlen Ihnen, die Logs der seriellen Konsole auf Verbindungsfehler zu prüfen. Von Ihrer lokalen Workstation aus können Sie mit einem Browser auf die serielle Konsole zugreifen.

Aktivieren Sie den Lese-/Schreibzugriff auf die serielle Konsole einer Instanz, damit Sie sich bei der Konsole anmelden und Probleme mit der Instanz beheben können. Dies ist besonders hilfreich, wenn eine Anmeldung mit SSH nicht möglich ist oder die Instanz keine Verbindung zum Netzwerk hat. Die serielle Konsole ist in beiden Situationen zugänglich.

Wie Sie interaktiven Zugriff aktivieren und eine Verbindung zur seriellen Konsole einer Instanz herstellen, erfahren Sie unter Mit der seriellen Konsole interagieren.

VM-Instanz ohne Herunterfahren prüfen

Es kann sein, dass Sie keine Verbindung zu einer Instanz herstellen können, obwohl sie Produktionstraffic weiterhin fehlerfrei verarbeitet. In einer solchen Situation müssen Sie das Laufwerk prüfen, ohne die Instanz zu unterbrechen.

Zur Prüfung des Laufwerks generieren Sie einen Snapshot des Bootlaufwerks und erstellen daraus ein neues Laufwerk. Dann erstellen Sie eine temporäre Instanz und fügen dieser temporären Instanz schließlich den neuen nichtflüchtigen Speicher hinzu bzw. stellen ihn dafür bereit, um das Problem mit dem Laufwerk zu beheben.

  1. Erstellen Sie ein neues VPC-Netzwerk, in dem die geklonte Instanz gehostet werden kann:

    gcloud compute networks create debug-network
    
  2. Fügen Sie eine Firewallregel hinzu, die SSH-Verbindungen zum Netzwerk zulässt:

    gcloud compute firewall-rules create debug-network-allow-ssh
       --allow tcp:22
    
  3. Erstellen Sie einen Snapshot des Bootlaufwerks:

    gcloud compute disks snapshot $BOOT_DISK
       --snapshot-names debug-disk-snapshot
    
  4. Erstellen Sie mit dem Snapshot aus dem vorigen Schritt ein neues Laufwerk:

    gcloud compute disks create example-disk-debugging
       --source-snapshot debug-disk-snapshot
    
  5. Erstellen Sie eine neue Debug-Instanz ohne externe IP-Adresse:

    gcloud compute instances create debugger
       --network debug-network
       --no-address
    
  6. Fügen Sie der Instanz das Debug-Laufwerk hinzu:

    gcloud compute instances attach-disk debugger
       --disk example-disk-debugging
    
  7. Folgen Sie der Anleitung zum Herstellen einer Verbindung zu einer Instanz ohne externe IP-Adresse.

  8. Nach der Anmeldung bei der Debugger-Instanz führen Sie die Fehlerbehebung für die Instanz durch. Prüfen Sie zum Beispiel die Instanzlogs:

    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
    

Startskript verwenden

Wenn keiner der vorherigen Vorschläge weitergeholfen hat, können Sie ein Startskript erstellen, um Informationen unmittelbar nach dem Start der Instanz zu erfassen. Folgen Sie der Anleitung zum Ausführen von Startskripts.

Anschließend müssen Sie mit gcloud compute instances reset die Instanz zurücksetzen, damit die Metadaten wirksam werden.

Alternativ können Sie die Instanz auch neu erstellen, indem Sie ein Diagnose-Startskript ausführen:

  1. Führen Sie gcloud compute instances delete mit dem Flag --keep-disks aus.

    gcloud compute instances delete $PROB_INSTANCE
       --keep-disks boot
    
  2. Fügen Sie eine neue Instanz mit demselben Laufwerk hinzu und geben Sie das Startskript an.

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

Das Skript compute-ssh-diagnostic ist bei den häufigsten Problemen ein guter Ausgangspunkt für die Erfassung von Diagnoseinformationen.

Laufwerk auf einer neuen Instanz verwenden

Wenn die anderen Schritte in diesem Dokument zu keiner Behebung des Fehlers geführt haben und Sie Daten von Ihrem nichtflüchtigen Bootlaufwerk wiederherstellen müssen, können Sie das Bootlaufwerk trennen und als sekundäres Laufwerk an eine neue Instanz anhängen.

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