SSH-Verbindung dauert ewig zu initiieren, stecken bei "Versprechen: Netzwerk"


44

Die Herstellung einer Verbindung zu einem meiner Server mit ssh dauert mehr als 20 Sekunden.

Dies hat nichts mit LAN- oder WAN-Bedingungen zu tun, da die Verbindung zu sich selbst dasselbe erfordert (ssh localhost). Nachdem die Verbindung hergestellt wurde, ist es superschnell, mit dem Server zu kommunizieren.

Die Verwendung von -vvv zeigt an, dass die Verbindung nach dem Aussprechen von "pledge: network" blockiert ist. Zu diesem Zeitpunkt ist die Authentifizierung (hier mit Schlüssel) bereits erfolgt, wie hier zu sehen:

...
debug1: Authentication succeeded (publickey).
Authenticated to myserver.mydomain.com ([xx.xx.xx.xx]:22).
debug1: channel 0: new [client-session]
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network

(... hier für 15 bis 25 Sekunden stecken ...)

debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug2: callback start
debug2: fd 3 setting TCP_NODELAY
debug2: client_session2_setup: id 0
...

Server ist Ubuntu 16.04. Es ist mir schon in der Vergangenheit mit einem anderen Server passiert (war Ubuntu 12.04), nerver fand die Lösung und das Problem verschwand nach einer Weile ...

sshd_config ist die Standardeinstellung von Ubuntu.

Bisher habe ich versucht:

  • Verwenden von -o GSSAPIAuthentication = no im Befehl ssh
  • mit Passwort anstelle eines Schlüssels
  • using UsePrivilegeSeparation no statt yes in sshd_config

1
Normalerweise sind für mich langsame SSH-Verbindungen DNS-Probleme, könnte das hier der Fall sein? Beispielsweise kann es sein, dass der Server feststeckt und versucht, eine DNS-Umkehrung für die IP des Clients durchzuführen, und darauf wartet, dass die Zeit abgelaufen ist
Eric Renouf

Eigentlich nein: UseDNS ist standardmäßig nicht in sshd_config definiert und die Manpage gibt an, dass diese Option standardmäßig "nein" ist.
M-Jack

3
Einige Googler schlagen vor, dass dies durch ein Update von systemd ohne Neustart verursacht werden kann. Und am 12. Juli gab es ein System-Update für xenial . systemctl restart systemd-logindbehebt das problem nur für kurze zeit für mich.
Ivan Kozik

Oder wenn Sie sehen, pam_systemd(sshd:session): Failed to create session: Connection timed outwie in einer Antwort erwähnt, könnte dies github.com/systemd/systemd/issues/2925
Ivan Kozik

Ich bin hierher gekommen, nachdem ich dieses Problem nach einem Update hatte, und der Vorschlag von @ IvanKozik hat das Problem behoben - dh systemctl restart systemd-logind - also danke dafür.
Paul M

Antworten:


43

Dies ist wahrscheinlich ein Problem mit D-Busund systemd. Wenn der dbusDienst aus irgendeinem Grund neu gestartet wird, müssen Sie auch neu starten systemd-logind.

Sie können überprüfen, ob dies das Problem ist, indem Sie das ssh-Daemon-Protokoll öffnen (unter Ubuntu sollte es das sein /var/log/auth.log) und prüfen, ob es die folgenden Zeilen enthält:

sshd[2721]: pam_systemd(sshd:session): Failed to create session: Connection timed out

Wenn ja, starten Sie den systemd-logindDienst einfach neu :

systemctl restart systemd-logind

Ich hatte das gleiche Problem unter CentOS 7, weil das messagebusneu gestartet wurde (so wird der D-BusDienst unter CentOS aufgerufen).


Ich habe versucht, systemd-logind neu zu starten, aber nach einer Weile wird angezeigt, dass der PolicyKit-Dämon vom Bus getrennt wurde. Wir sind kein registrierter Authentifizierungsagent mehr. Der Job für systemd-logind.service ist fehlgeschlagen, da ein Timeout überschritten wurde. Weitere Informationen finden Sie unter "systemctl status systemd-logind.service" und "journalctl -xe".
Kun Ren

@ KunRen müssen Sie wahrscheinlich den polkitDienst mit neu starten systemctl restart polkit.
Strahinja Kustudic

16

fand die Antwort:

UsePAM wurde in der Datei sshd_config von yes in no geändert

Nach dem Neustart des SSH-Dienstes ist die Verbindung zum Server sofort hergestellt. Auf diesem Server ist PAM mit ldap verknüpft. Dies ist wahrscheinlich der Grund, auch wenn ich hier eine Verbindung mit einem Benutzer herstelle, der auf dem Server selbst deklariert ist, und nicht mit einem LDAP-Benutzer.

Nun, dies ist eher eine Möglichkeit, das Problem zu umgehen, nicht wirklich eine Lösung ... Ich habe andere Server auf die gleiche Weise eingerichtet, auf die dieses Problem nicht zutrifft.

Hoffe das kann jemandem helfen ...


1
Das Ändern von UsePAM auf no hat andere Auswirkungen. Siehe diese Diskussion Also musste ich ein Passwort für den Benutzer festlegen, weil ich Fehler bekam, wie User Nagios nicht erlaubt, weil Konto gesperrt ist
M-Jack

4
Das ist wirklich keine gute Idee.
Jakuje

1
Warum ?? irgendeine Alternative?
M-Jack

8
Die PAM wird in modernen Systemen für andere Dinge rund um die Kontoverwaltung verwendet. Anstatt es auszuschalten, sollten Sie besser untersuchen, was im PAM-Stapel vor sich geht und warum es so lange dauert.
Jakuje

Das häufig nicht verwendete PAM-Modul für den SSH-Zugriff aktiviert zu lassen, ist eine Sicherheitslücke. Das Einschränken des Zugriffs auf wichtige Dienste wie SSH aus Sicherheitsgründen ist auch für JEDEN anderen Dienst immer eine gute Idee. Wann soll das PAM-Modul mit SSH zusammenarbeiten? Zum Beispiel: Wenn Sie es über winbind in Active Directory integrieren müssen, wenn Sie eine Zwei-Faktor-Authentifizierung mit Google-Token usw. benötigen. In anderen Fällen (bei Verwendung von passwd und shadow) ist das Ausschalten absolut sicher. Jeder Nutzer von PAM sieht dies: cve.mitre.org/cgi-bin/cvekey.cgi?keyword=pam
Michal Sokolowski

10

Dies geschah auf zwei meiner Fedora 25-Server und war auf viele fehlgeschlagene SSH-Anmeldeversuche zurückzuführen.

(Die allgemeinen Vorschläge für die Verwendung GSSAPIAuthentication=nound UseDNS=no/ oder den Neustart systemd-logindmachten keinen Unterschied.)

Auf diesen Servern /etc/pam.d/postloginenthält:

session     optional      pam_lastlog.so silent noupdate showfailed

Die Manpage für pam_lastlogerklärt, dass die showfailedOption:

Zeigt die Anzahl der fehlgeschlagenen Anmeldeversuche und das Datum des letzten fehlgeschlagenen Versuchs von btmp an.

Auf diesen Servern waren die /var/log/btmpDateien aufgrund vieler fehlgeschlagener Anmeldeversuche enorm. Die btmpProtokolldateien wurden ebenfalls nicht gedreht.

Ich habe das logrotatePaket installiert , um sicherzustellen, dass die Protokolldateien in Zukunft gedreht werden. (Auf Fedora regelt die Konfiguration, mit logrotateder ausgeliefert wird, die Drehung von /var/log/btmp.)

Ich habe auch die riesigen btmpLogdateien gelöscht ; Sobald ich dies tat, war die Verbindung zu den Servern sofort wieder hergestellt.


Das hat mein Problem gelöst! Danke. Schöner Fang. SSH dauerte 5-10 Sekunden, und jetzt ist es weniger als ein Wimpernschlag. Dies ist auf einer VM, die ich seit Jahren mit dem öffentlichen Internet verbunden habe. Die Firewall-Regeln könnten jetzt, wo ich darüber nachdenke, wahrscheinlich etwas besser angepasst werden. Für andere ist dies alles, was ich getan habe: sudo truncate -s 0 /var/log/btmp- Meine war 2,7 g groß.
Carl Bennett

2

In meinem Fall war der Grund ein abgestürztes rsyslogd. Ich habe das herausgefunden, weil es keine weiteren Logmeldungen in zB / var / log / syslog oder /var/log/mail.log gab

So service rsyslog restartlöste sich das Problem für uns.


Gleiche Ursache auf einem Server mit CentOS 6.10. Der Neustart von rsyslog hat sich darum gekümmert. Die Sache ist, es war nicht tot. Es lief, machte aber anscheinend nichts Sinnvolles.
UtahJarhead

1

Für mich wird dieses Problem durch eine große btmpDatei (Hunderte von MB) verursacht . Diese Datei protokolliert Anmeldeversuche. Wenn Leute versuchen, Ihr Passwort brutal zu erzwingen, kann diese Datei groß sein und Verzögerungen in der "pledge: network"Phase verursachen.

Versuchen Sie, die Protokolldatei zu löschen

echo "" > /var/log/btmp

und sehen, ob es hilft.


3
Das bedarf noch viel mehr Erklärung. Warum ist das für den Anfang hilfreich?
Sven

:> /var/log/btmptipp : Einfach nur tippen geht übrigens genauso.
Marius

1

Für mich fügte die Lösung hinzu

UseDNS no

zum /etc/ssh/sshd_configund dann natürlich service ssh restart(auf unserem Debian / Jessie-Server). Nichts anderes...

vorher :

ssh git@git.*****.de true  0.03s user 0.01s system 0% cpu 13.440 total
ssh git@git.*****.de true  0.03s user 0.01s system 0% cpu 20.990 total
ssh git@git.*****.de true  0.03s user 0.02s system 0% cpu 31.114 total
ssh git@git.*****.de true  0.03s user 0.01s system 0% cpu 25.898 total

nachher :

ssh git@git.*****.de true  0.03s user 0.02s system 5% cpu 0.832 total
ssh git@git.*****.de true  0.03s user 0.01s system 7% cpu 0.523 total
ssh git@git.*****.de true  0.03s user 0.01s system 7% cpu 0.574 total

Nein, das Hinzufügen UseDNS noist eine Lösung für ein völlig anderes Problem.
Kasperd

@kasperd Es spielt keine Rolle. In meinem Fall hatte ich die gleichen Symptome (kurz: stecken geblieben, nachdem ich "Versprechen: Netzwerk" gesagt hatte) und dies hat mir letztendlich geholfen, so dass dies eine Lösung für mindestens ein sehr ähnliches Problem ist und ich bin sicher, dass es einem oder dem helfen wird andere irgendwann.
Tamasgal

Gleiches gilt hier, zwei hängen während der Verbindung, eine nach der anderen sign_and_send_pubkey, eine nach der anderen pledge: network. Das Hinzufügen nur UseDNS nomit anschließendem service ssh restartlöste das Problem auf einer alten Ubuntu 14.04.5 LTS-Installation hier.
Hound

0

In meinem Debug-Feedback ist mir folgende Zeile aufgefallen:

Control socket connect(/var/lib/jenkins/.ssh/USER@HOST:22): Permission denied

Welches war eine Datei, die gehört, root:rootwährend ich bin jenkins. Durch das Entfernen dieser Datei wurden meine Probleme behoben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.