La connexion SSH prend une éternité à démarrer, bloquée à “engagement: réseau”

44

La connexion à l'un de mes serveurs à l'aide de ssh nécessite plus de 20 secondes pour être initiée.

Cela n’est pas lié aux conditions LAN ou WAN, car la connexion à lui-même prend la même chose (ssh localhost). Une fois la connexion établie, l’interaction avec le serveur est très rapide.

L'utilisation de -vvv montre que la connexion est bloquée après avoir dit "gage: réseau". A ce stade, l'authentification (ici en utilisant la clé) est déjà faite, comme visible ici:

...
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 [email protected]
debug1: Entering interactive session.
debug1: pledge: network

(... coincé ici pendant 15 à 25 secondes ...)

debug1: client_input_global_request: rtype [email protected] want_reply 0
debug2: callback start
debug2: fd 3 setting TCP_NODELAY
debug2: client_session2_setup: id 0
...

Le serveur est Ubuntu 16.04. Cela m'est déjà arrivé par le passé avec un autre serveur (Ubuntu 12.04), nerver a trouvé la solution et le problème a disparu au bout d'un moment ...

sshd_config est celui par défaut fourni par Ubuntu.

Jusqu'ici j'ai essayé:

  • en utilisant -o GSSAPIAuthentication = no dans la commande ssh
  • en utilisant un mot de passe au lieu d'une clé
  • en utilisant UsePrivilegeSeparation no au lieu de yes, dans sshd_config
M-Jack
la source
1
Habituellement, pour moi, les connexions SSH lentes sont des problèmes de DNS, est-ce que ce pourrait être le cas ici? Par exemple, le serveur peut être bloqué en train d'essayer de faire un DNS inversé pour l'IP du client et d'attendre l'expiration de ce délai
Eric Renouf
En fait, non: par défaut, UseDNS n'est pas défini dans sshd_config et la page de manuel indique que cette option est "non" par défaut.
M-Jack
3
Certains utilisateurs de Google suggèrent que cela peut être causé par la mise à jour de systemd sans redémarrage. Et il y avait une mise à jour de systemd pour xenial le 12 juillet . systemctl restart systemd-logindrésout le problème que pour une courte période de temps pour moi.
Ivan Kozik
Ou si vous voyez ce pam_systemd(sshd:session): Failed to create session: Connection timed outqui est mentionné dans une réponse, cela pourrait être github.com/systemd/systemd/issues/2925
Ivan Kozik
Je suis arrivé ici après avoir eu ce problème après une mise à jour, et la suggestion de @ IvanKozik a résolu le problème - c'est-à-dire que systemctl redémarre systemd-logind - alors merci pour cela.
Paul M

Réponses:

43

Ceci est probablement un problème avec D-Buset systemd. Si le dbusservice est redémarré pour une raison quelconque, vous devrez également redémarrer systemd-logind.

Vous pouvez vérifier si cela est le problème en ouvrant le journal du démon ssh (sur Ubuntu, cela devrait être le cas /var/log/auth.log) et vérifiez s'il contient les lignes suivantes:

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

Si oui, redémarrez simplement le systemd-logindservice:

systemctl restart systemd-logind

J'ai eu ce même problème sur CentOS 7, car le a messagebusété redémarré (c'est comment le D-Busservice est appelé sur CentOS).

Strahinja Kustudic
la source
J'ai essayé de redémarrer systemd-logind, mais après un moment, le démon PolicyKit s'est déconnecté du bus. Nous ne sommes plus un agent d'authentification enregistré. Le travail pour systemd-logind.service a échoué car un délai a été dépassé. Voir "systemctl status systemd-logind.service" et "journalctl -xe" pour plus de détails.
Kun Ren
@KunRen vous devez probablement redémarrer le polkitservice avec systemctl restart polkit.
Strahinja Kustudic
16

trouvé la réponse:

modifié UsePAM de oui à non dans le fichier sshd_config

Après avoir redémarré le service ssh, la connexion est maintenant immédiate sur le serveur. Sur ce serveur, PAM est lié à ldap, ce qui explique probablement pourquoi, même si je me connecte ici à un utilisateur déclaré sur le serveur lui-même, pas à un utilisateur LDAP.

Eh bien, c’est plus une façon de contourner le problème, pas vraiment une solution… J’ai d’autres serveurs configurés de la même manière qui n’ont pas ce problème.

J'espère que cela pourra aider quelqu'un ...

M-Jack
la source
1
changer UsePAM en no a d'autres effets. See this discussion J'ai donc dû définir un mot de passe pour l'utilisateur, car des erreurs telles que l'utilisateur nagios ne sont pas autorisées car le compte est verrouillé
M-Jack le
4
Ce n'est vraiment pas une bonne idée.
Jakuje
1
Pourquoi ?? une alternative?
M-Jack
8
Le PAM est utilisé pour d'autres tâches liées à la gestion des comptes dans les systèmes modernes. Plutôt que de l'éteindre, vous feriez mieux d'enquêter sur ce qui se passe dans la pile PAM et pourquoi cela prend-il si longtemps.
Jakuje
Le fait de laisser très fréquemment un module PAM inutilisé activé pour l'accès SSH constitue une faille de sécurité. Limiter l'accès à des services critiques tels que SSH du point de vue de la sécurité est toujours une bonne idée pour TOUT autre service. Quand vous voulez que le module PAM coopère avec SSH? Par exemple: lorsque vous avez besoin d'intégrer Active Directory via Winbind, lorsque vous avez besoin d'une authentification à deux facteurs avec Google Tokens, etc. Dans d'autres cas (lorsque vous utilisez passwd et shadow), sa fermeture est parfaitement sécurisée. Chaque utilisateur de PAM verra ceci: cve.mitre.org/cgi-bin/cvekey.cgi?keyword=pam
Michal Sokolowski
10

Cela s'est produit sur deux de mes serveurs Fedora 25 et était dû à de nombreuses tentatives de connexion SSH ayant échoué.

(Les suggestions courantes d'utilisation GSSAPIAuthentication=noet de UseDNS=noredémarrage systemd-logindne font aucune différence.)

Sur ces serveurs, /etc/pam.d/postlogincontient:

session     optional      pam_lastlog.so silent noupdate showfailed

La page de manuel pour pam_lastlogexplique que l’ showfailedoption va:

Affiche le nombre de tentatives de connexion infructueuses et la date de la dernière tentative infructueuse de btmp.

Sur ces serveurs, les /var/log/btmpfichiers étaient énormes en raison de nombreuses tentatives de connexion infructueuses. Les btmpfichiers journaux n'étaient pas non plus en rotation.

J'ai installé le logrotatepackage pour assurer la rotation des fichiers journaux à l'avenir. (Sur Fedora, la configuration livrée avec logrotategère la rotation de /var/log/btmp.)

J'ai également supprimé les énormes btmpfichiers journaux; Dès que j'ai fait cela, la connexion aux serveurs était de nouveau instantanée.

Richard Fearn
la source
Cela a résolu mon problème! Merci. Belle prise. SSH prenait entre 5 et 10 secondes, et maintenant, il n’ya qu’un clin d’œil. Il s’agit d’une machine virtuelle que je connecte à l’Internet public depuis des années. Les règles de son pare-feu pourraient probablement être légèrement améliorées, maintenant que j'y pense. Pour d'autres, c'est tout ce que j'ai fait: sudo truncate -s 0 /var/log/btmp- Le mien avait une taille de 2,7G.
Carl Bennett
2

Dans mon cas, la raison était un plantage de rsyslogd. J'ai découvert cela parce qu'il n'y avait plus de messages de journalisation dans, par exemple, / var / log / syslog ou /var/log/mail.log

Alors service rsyslog restartrésolu le problème pour nous.

contrôle aléatoire
la source
Même cause sur un de nos serveurs exécutant CentOS 6.10. Le redémarrage de rsyslog s'en est occupé. Le truc, c'est que ce n'était pas mort. Il courait mais ne faisait apparemment rien d’utile.
UtahJarhead
1

Pour moi, ce problème est causé par un btmpfichier volumineux (des centaines de Mo) . Ce fichier enregistre les tentatives de connexion. Lorsque les gens essaient de forcer brutalement votre mot de passe, ce fichier peut être volumineux et causer des retards dans la "pledge: network"phase.

Essayez d'effacer le fichier journal

echo "" > /var/log/btmp

et voir si ça aide.

Marek Nagy
la source
3
Cela nécessite beaucoup plus d'explications. Pour commencer, pourquoi pensez-vous que cela est utile?
Sven
:> /var/log/btmpConseil : il suffit de taper pour faire la même chose.
Marius
1

Pour moi, la solution consistait à ajouter

UseDNS no

sur /etc/ssh/sshd_configet puis bien sûr service ssh restart(sur notre serveur Debian / Jessie). Rien d'autre...

avant :

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

après :

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
Tamasgal
la source
Non, l'ajout UseDNS noest une solution à un problème complètement différent.
Kasperd
@ kasperd Cela n'a pas d'importance. Dans mon cas, j’ai eu les mêmes symptômes (brièvement: coincé après avoir dit "gage: réseau") et c’est ce qui a finalement aidé, c’est donc une solution à au moins un problème très similaire et je suis sûr que cela aidera tout un chacun. autre à un moment donné.
Tamasgal
Idem ici, deux sont bloqués pendant la connexion, un après sign_and_send_pubkey, un plus long après pledge: network. Ajouter uniquement UseDNS nopar la suite service ssh restarta résolu le problème sur une ancienne installation Ubuntu 14.04.5 LTS ici.
Hound
0

J'ai remarqué la ligne suivante dans mes commentaires de débogage:

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

Qui était un fichier qui appartenait à root:rootpendant que je suis jenkins. Supprimer ce fichier a résolu mes problèmes.

Ambidex
la source