Die Meldung
Unter macOS:
ssh: connect to host 203.0.113.10 port 22: Operation timed out
Unter Linux:
ssh: connect to host 203.0.113.10 port 22: Connection timed out
Ihr Computer hat eine Anfrage zum Öffnen einer Verbindung gesendet und nichts zurückgehört. SSH hat nie begonnen, Schlüssel und Passwörter sind also nicht beteiligt.
Wie es sich von Connection refused unterscheidet
Wir haben jeden Fall auf einem Testserver aufgebaut, und das hat ssh ausgegeben:
| Situation | Meldung | Was sie Ihnen sagt |
|---|---|---|
| Firewall-Regel auf Drop | Connection timed out | Nichts hat geantwortet |
| Firewall-Regel auf Reject | Connection refused | Etwas hat mit Nein geantwortet |
| Nichts lauscht auf dem Port | Connection refused | Die Maschine hat mit Nein geantwortet |
| Keine Route auf Ihrem eigenen Rechner | Network is unreachable | Ihr Computer hat keinen Weg zum Probieren |
Schauen Sie also aufs Netzwerk, nicht auf sshd. Bekommen Sie eine Abweisung, gehen Sie zu Connection refused.
Schnell testen
Standardmäßig können Sie bei jedem Fehlschlag eine Minute oder länger warten. ConnectTimeout verkürzt das Warten:
ssh -o ConnectTimeout=5 user@203.0.113.10
Testen Sie nur den Port, zuerst unter Linux, dann unter macOS:
nc -vz -w 5 203.0.113.10 22
nc -vz -G 5 203.0.113.10 22
Prüfen Sie dann, was Ihre Konfiguration für diesen Namen wirklich verwendet:
ssh -G server | grep -E '^(hostname|port) '
Ursachen, nach Wahrscheinlichkeit geordnet
1. Eine Cloud-Firewall oder Security Group blockiert Sie
Cloud-Firewalls verwerfen normalerweise, was sie nicht erlauben, ohne Antwort. Prüfen Sie, dass eine eingehende Regel TCP-Port 22 von Ihrer aktuellen öffentlichen Adresse erlaubt. Eine häufige Falle ist eine Regel für eine einzelne Adresse, nachdem sich Ihre Heim- oder Büroadresse geändert hat.
Prüfen Sie bei AWS außerdem die Routing-Tabelle des Subnetzes, die Network-ACL und ob die Instance eine öffentliche Adresse hat, wie in der AWS-Anleitung unten beschrieben. Andere Anbieter haben ähnliche Einstellungen unter anderen Namen.
2. Die Adresse ist falsch, oder die Maschine ist aus
dig +short server
ping -c 3 203.0.113.10
Vergleichen Sie das Ergebnis mit der Adresse, die Ihr Anbieter anzeigt, die sich nach einem Stopp und Start ändern kann. Ping allein beweist wenig: Viele Server blockieren es, keine Antwort heißt also nicht, dass der Server aus ist. Prüfen Sie den Zustand der Maschine in der Konsole des Anbieters.
3. Eine Firewall auf dem Server verwirft es
Das zeigt, ob Ihre Pakete den Server überhaupt erreichen. Führen Sie es in der Konsole des Anbieters aus, während Sie versuchen, sich zu verbinden:
sudo tcpdump -ni any 'tcp port 22'
- Keine Pakete: Sie werden vor dem Server blockiert, prüfen Sie also Cloud-Firewall, Router und Route.
- Pakete kommen an, keine Antwort: Die eigene Firewall des Servers verwirft sie, oder die Antwort geht einen anderen Weg hinaus.
Listen Sie die Regeln des Servers mit sudo iptables -L INPUT -n oder sudo nft list ruleset auf und suchen Sie eine Drop-Regel für Port 22.
4. Ihr eigenes Netz blockiert Port 22
Hotels, Büros und manche öffentlichen WLANs blockieren ausgehendes SSH. Der Hinweis: Es schlägt in einem Netz fehl und funktioniert in einem anderen. Probieren Sie einen Handy-Hotspot oder einen anderen SSH-Server aus demselben Netz.
5. Ein Routing-Problem
traceroute -n 203.0.113.10
Sterne bei einigen Hops sind normal, weil viele Router nicht antworten. Sehen Sie, wo der Pfad endgültig aufhört. Unter Linux sendet diese Variante TCP an Port 22, was durch mehr Firewalls geht, und sie braucht Root:
sudo traceroute -n -T -p 22 203.0.113.10
Hat der Server keine öffentliche Adresse, erreichen Sie ihn von außerhalb seines privaten Netzes nicht direkt. Nutzen Sie ein VPN oder einen Jump-Host.
Timeout während des Handshakes
Diese Meldung ist anders:
Connection timed out during banner exchange
Connection to 203.0.113.10 port 22 timed out
Der Port hat die Verbindung angenommen, aber es kam nicht rechtzeitig eine SSH-Begrüßung zurück. Wir haben sie mit einem Test-Listener erhalten, der die Verbindung annahm und dann schwieg, mit gesetztem ConnectTimeout. Der Netzwerkweg funktioniert also. Schauen Sie auf den Server: eine überlastete oder festgefahrene Maschine, ein anderer Dienst als SSH auf diesem Port oder eine Middlebox, die die Verbindung festhält. ConnectTimeout gilt auch für diese Phase, ein sehr niedriger Wert kann auf einem langsamen Server also die Meldung auslösen.
Ein Timeout in Ihrer Konfiguration setzen
Das behebt nichts, aber Fehler kommen schneller zurück, und Skripte hängen nicht:
Host *
ConnectTimeout 10
Weitere Einstellungen pro Host finden Sie in diesen Beispielen für die ssh-config-Datei.
Fragen
Was ist der Unterschied zwischen Connection timed out und Connection refused?
Timed out heißt, dass nichts geantwortet hat, meist eine Firewall, die Pakete verwirft. Refused heißt, dass etwas mit Nein geantwortet hat: Auf dem Port lauscht nichts, oder eine Firewall weist ab.
Wie lasse ich SSH schneller scheitern?
Mit ssh -o ConnectTimeout=5 benutzer@server, oder Sie setzen ConnectTimeout 10 unter Host * in ~/.ssh/config.
Warum läuft SSH bei AWS in einen Timeout?
Meist fehlt in der Security Group eine eingehende Regel für TCP-Port 22 von Ihrer aktuellen Adresse. Prüfen Sie auch die Network ACL, die Routing-Tabelle und ob die Instanz eine öffentliche Adresse hat.