Ich erhalte die Fehler „Connection refused“ (Verbindung verweigert) oder „Connection timed out“ (Zeitüberschreitung der Verbindung), wenn ich versuche, mit SSH eine Verbindung zu meiner EC2-Instance herzustellen. Wie löse ich das?

Letzte Aktualisierung: 28.10.2022

Ich erhalte die Fehlermeldungen „Connection refused“ (Verbindung verweigert) oder „Connection timed out“ (Verbindung abgelaufen), wenn ich versuche, eine Verbindung zu meiner Amazon Elastic Compute Cloud (Amazon EC2)-Instance über SSH herzustellen.

Kurzbeschreibung

Fehlermeldung: „ssh: Verbindung zum Host ec2-X-X-X-X-X.compute-1.amazonaws.com Port 22: Verbindungs-Timeout“. Diese Fehlermeldung stammt vom SSH-Client. Der Fehler zeigt an, dass der Server nicht auf den Client reagiert hat und das Clientprogramm aufgegeben hat (Zeitüberschreitung). Im Folgenden sind häufige Ursachen für diesen Fehler aufgeführt:

  • Die Sicherheitsgruppe oder Netzwerk-ACL erlaubt keinen Zugriff.
  • Auf dem Betriebssystem der Instance befindet sich eine Firewall.
  • Zwischen dem Client und dem Server befindet sich eine Firewall.
  • Der Host existiert nicht.

Fehlermeldung: „ssh: Verbindung zum Host ec2-X-X-X-X.compute-1.amazonaws.com Port 22: Verbindung verweigert“. Diese Nachricht stammt von einem Remote-Host. Im Folgenden sind häufige Ursachen für diesen Fehler aufgeführt:

  • Der Host erreichte die Instance, aber es gab keinen Service, der auf dem SSH-Port lauschte.
  • Eine Firewall blockierte und sollte das Paket ablehnen, anstatt es fallen zu lassen.

Auflösung

Überprüfen Sie Folgendes für den Fehler „Connection timed out“ (Verbindung abgelaufen)

  • Die IP-Adresse oder der Hostname der Instance ist korrekt.
  • Die Instance besteht ihre Zustandsprüfungen.
  • Die Sicherheitsgruppe der Instance lässt eingehenden Datenverkehr auf TCP-Port 22 zu.
  • Die Netzwerk-ACLs des Instance-Subnetzes erlauben eingehenden Verkehr auf dem TCP-Port 22 und erlauben einen kurzlebigen Port für den ausgehenden Datenverkehr.
  • Die Routing-Tabelle des Subnetzes der Instance ist ordnungsgemäß konfiguriert, um die Konnektivität zwischen der EC2-Instance und dem SSH-Client bereitzustellen.
  • Es gibt keine Firewall, die die Verbindung zwischen dem SSH-Client und der EC2-Instance blockiert.
  • SSH wird nicht von TCP-Wrappern in der Instance blockiert.

Hinweis: Die letzten beiden Überprüfungsschritte erfordern den Zugriff auf die Instance auf Betriebssystemebene.

Überprüfen Sie Folgendes für den Fehler „Connection refused“ (Verbindung verweigert)

  • Es gibt keine Firewall auf der Instance, die die SSH-Verbindung ablehnt.
  • Der SSH-Daemon (sshd) läuft und wartet auf Port 22.

Hinweis: Beide Überprüfungsschritte erfordern den Zugriff auf die Instance auf Betriebssystemebene.

Wenn die Instance beide Zustandsprüfungen besteht, verwenden Sie eine der folgenden vier aufgelisteten Methoden für Ihre Konfiguration

  • Methode 1: Verwenden Sie die serielle EC2-Konsole für Linux.
  • Methode 2: Verwenden Sie den AWS System Manager Session Manager.
  • Methode 3: Führen Sie das AWSSupport-TroubleshootSSH-Automatisierungs-Runbook aus.
  • Methode 4: Verwenden Sie ein Benutzerdatenskript.

Methode 1: Verwenden Sie die serielle EC2-Konsole für Linux

Falls konfiguriert, können Sie die serielle EC2-Konsole für Linux verwenden, um Probleme auf Betriebssystemebene bei unterstützten Nitro-basierten Instance-Typen zu beheben. Die serielle Konsole ermöglicht die Fehlersuche bei Problemen mit dem Bootvorgang, der Netzwerkkonfiguration und der SSH-Konfiguration. Die serielle Konsole ist über die Amazon-EC2-Konsole oder die AWS Command Line Interface (AWS CLI) zugänglich.

Bevor Sie die serielle Konsole verwenden, müssen Sie ihr den Zugriff auf der Kontoebene gewähren. Erstellen Sie dann AWS Identity and Access Management (IAM)-Richtlinien, die Ihren IAM-Benutzern Zugriff gewähren.

Hinweis: Jede Instance, die die serielle Konsole verwendet, muss mindestens einen kennwortbasierten Linux-Benutzer mit sudo-Zugriff enthalten.

Mehr Informationen zur Konfiguration der seriellen EC2-Konsole für Linux finden Sie unter Konfigurieren des Zugriffs auf die serielle EC2-Konsole. Wenn kein Linux-Konto mit einem konfigurierten Anmeldekennwort vorhanden ist, müssen Sie ssm-user ausführen, um das Passwort für ein Konto mit sudo-Zugriff zurückzusetzen. Weitere Informationen zum Ausführen von ssm-user-Befehlen finden Sie im Abschnitt Verwalten der sudo-Kontoberechtigungen für ssm-user unter Linux und macOS.

Stellen Sie nach der Konfiguration über die serielle EC2-Konsole unter Verwendung eines kennwortkonfigurierten Linux-Benutzers eine Verbindung zur EC2-Instance her.

Führen Sie dann die folgenden Befehle aus. Diese Befehle überprüfen, ob die SSH-Verbindungen nicht von der Betriebssystem-Firewall oder dem TCP-Wrapper blockiert werden. Die Befehle überprüfen auch, ob der sshd-Service ausgeführt wird und auf Port 22 wartet.

1.    Wenn Sie iptables-Regeln konfiguriert haben, führen Sie den folgenden Befehl aus, um eine Regel in iptables hinzuzufügen, die alle SSH-Verbindungen auf dem Standardport 22 akzeptiert:

$ sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

Da es eine bewährte Methode ist, Sicherheitsgruppen anstelle einer OS-basierten Firewall zu verwenden, kann die Firewall vollständig deaktiviert werden. Um die betriebssystembasierte Firewall zu deaktivieren, verwenden Sie einen der folgenden Befehle, je nach Betriebssystem:

Wichtig: Die folgenden Befehle löschen alle wichtigen iptables-Regeln. Sie fügen auch eine Regel hinzu, die eingehende SSH-Verbindungen zulässt. Darüber hinaus ändern sie die Standardrichtlinie der Hauptkette in ACCEPT, sodass das Löschen der iptables-Regel die Netzwerkkonnektivität der Instance nicht beeinträchtigt. Da diese Befehle alle Haupt-iptables löschen, löschen sie auch alle vorhandenen Regeln.

Verteilungen, die UFW verwenden (Ubuntu, Debian)

$ sudo iptables -F
$ sudo iptables -P INPUT ACCEPT
$ sudo ufw disable

Verteilungen, die firewalld verwenden (Red Hat, CentOS)

$ sudo iptables -F 
$ sudo iptables -P INPUT ACCEPT
$ sudo systemctl disable firewalld

Hinweis: Nachdem Sie wieder Zugriff auf Ihre Instance haben, überprüfen Sie Ihre Firewall-Konfiguration (UFW, firewalld, iptables).

2.    Stellen Sie sicher, dass SSH läuft und dass sich der SSH-TCP-Port (22) in einem Listening-Zustand (Zuhören) befindet:

$ sudo systemctl restart sshd
$ sudo ss -tpln | grep -iE '22|ssh'
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1901,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1901,fd=4))

Hinweis: Wenn Ihr System nicht über den Befehl ss verfügt, können Sie den Legacy-Befehl netstat mit derselben Syntax verwenden, die im vorherigen Beispiel gezeigt wurde.

3.    Stellen Sie sicher, dass der TCP-Wrapper keine SSH-Verbindung blockiert:

$ if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\
then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi

4.    Als Nächstes stellen Sie über SSH eine Verbindung zu der Instance her.

5.    Trennen Sie die Sitzung der seriellen EC2-Konsole, wenn sie nicht mehr benötigt wird.

Methode 2: Verwenden des AWS System Manager Session Managers

Hinweis: Um diese Methode verwenden zu können, muss es sich bei der Instance um eine von SSM-verwaltete Instance handeln und ihr Ping-Status des SSM-Agenten muss Online lauten. Weitere Informationen zum Session Manager und eine vollständige Liste der Voraussetzungen finden Sie unter Einrichten des Session Managers.

Bestätigen Sie, dass SSH-Verbindungen nicht von der Firewall oder dem TCP-Wrapper blockiert werden und dass der sshd-Service läuft und auf Port 22 wartet, wie folgt:

1.    Öffnen Sie den AWS Systems Manager.

2.    Starten Sie eine Sitzung für die Instance mit dem Session Manager.

3.    Führen Sie die Schritte 1–4 von Methode 1 aus: Verwenden Sie die serielle EC2-Konsole für Linux.

4.    Schließen Sie die Session-Manager-Sitzung, wenn sie nicht mehr benötigt wird.

Methode 3: Ausführen des AWSSupport-TroubleshootSSH-Runbooks

Das AWSSupport-TroubleshootSSH-Automatisierungs-Runbook installiert das Amazon-EC2Rescue-Tool auf der Instance. Dieses Tool sucht und behebt Probleme, die eine Remote-Verbindung des Linux-Hosts über SSH verhindern.

Führen Sie das AWSSupport-TroubleshootSSH-Runbook aus wie folgt:

1.    Öffnen Sie die Seite AWSSupport-TroubleshootSSH.

2.    Wählen Sie Diese Automatisierung ausführen (Konsole) aus.

Weitere Informationen finden Sie unter Wie kann ich den AWSSupport-TroubleshootSSH-Automatisierungsworkflow verwenden, um SSH-Verbindungsprobleme zu beheben?

Methode 4: Verwenden eines Benutzerdatenskripts

Wenn keine der beschriebenen Methoden in Ihrer Umgebung geeignet ist, verwenden Sie ein EC2-Benutzerdatenskript. Das EC2-Benutzerdatenskript schaltet die Firewall auf Betriebssystemebene und den TCP-Wrapper aus und startet dann den sshd-Service neu.

Wichtig:

  • Dieses Verfahren erfordert einen Stopp und Start der EC2-Instance. Wenn die Instance über Daten verfügt, die auf Instance-Speicher-Volumes gespeichert sind, werden diese Daten nach dem Stoppen der Instance gelöscht.
  • Wenn die Instance Teil einer Gruppe von Amazon EC2 Auto Scaling ist, können beim Beenden der Instance auch Instances innerhalb der Auto-Scaling-Gruppe gestoppt werden.
  • Wenn die Instance von Services gestartet wird, die AWS Auto Scaling verwenden, können beim Beenden der Instance auch Instances innerhalb der Auto-Scaling-Gruppe gestoppt werden.
  • Die Beendigung der Instance hängt von den Einstellungen des Instance-Abskalierungs-Schutzes für die Auto-Scaling-Gruppe ab. Wenn Ihre Instance Teil einer Auto-Scaling-Gruppe ist, entfernen Sie die Instance vorübergehend aus der Auto-Scaling-Gruppe, bevor Sie mit den Auflösungsschritten beginnen.
  • Das Stoppen und Starten der Instance ändert die öffentliche IP-Adresse der Instance. Es ist eine bewährte Methode, eine Elastic IP-Adresse anstelle einer öffentlichen IP-Adresse zu verwenden, wenn Sie externen Datenverkehr an die Instance weiterleiten.

Führen Sie die folgenden Schritte aus, um Benutzerdaten für die Instance zu konfigurieren:

1.    Öffnen Sie die Amazon-EC2-Konsole.

2.    Wählen Sie im Navigationsbereich Instances und wählen Sie dann die Instance aus, mit der Sie eine Verbindung herstellen möchten.

3.    Stoppen Sie die Instance.

4.    Wählen Sie Aktionen, Instance-Einstellungen, Benutzerdaten bearbeiten.

5.    Kopieren Sie das folgende Benutzerdatenskript in das Dialogfeld Benutzerdaten bearbeiten und wählen Sie dann Speichern.

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
 
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
 
#cloud-config
cloud_final_modules:
- [scripts-user, always]
 
--//
Content-Type:
    text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
 
#!/bin/bash
iptables -P INPUT ACCEPT
iptables -F
systemctl restart sshd.service || service sshd restart
if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\
then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi
--//

6.    Verbinden Sie sich mit SSH mit der Instance.

7.    Das vorhergehende Benutzerdatenskript wird so eingestellt, dass es bei jedem Neustart der Instance ausgeführt wird. Entfernen Sie das Benutzerdatenskript, nachdem Sie wieder Zugriff auf Ihre Instance erhalten haben.

Hinweis: Der vorhergehende Befehl löscht alle iptables-Hauptregeln. Nachdem Sie wieder Zugriff auf Ihre Instance haben, überprüfen Sie Ihre Firewall-Konfiguration auf Richtigkeit (z. B. UFW, firewalld, iptables).

Entfernen Sie Benutzerdaten wie folgt:

1.    Führen Sie die Schritte 1–4 im Abschnitt Methode 4: Verwenden eines Benutzerdatenskripts aus.

2.    Löschen Sie das Benutzerdatenskript im Dialogfeld Benutzerdaten bearbeiten.