ssh 连接需要永远启动,停留在“承诺:网络”

M-J*_*ack 71 ssh

使用 ssh 连接到我的一台服务器需要 20 多秒才能启动。

这与 LAN 或 WAN 条件无关,因为与自身的连接采用相同的 (ssh localhost)。最终建立连接后,与服务器交互速度超快。

使用 -vvv 显示说“承诺:网络”后连接卡住了。此时,身份验证(此处使用密钥)已经完成,如下所示:

...
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
Run Code Online (Sandbox Code Playgroud)

(...卡在这里 15 到 25 秒...)

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
...
Run Code Online (Sandbox Code Playgroud)

服务器是 Ubuntu 16.04。过去我在另一台服务器(是 Ubuntu 12.04)上已经发生过这种情况,神经找到了解决方案,一段时间后问题消失了......

sshd_config 是 Ubuntu 提供的默认配置。

到目前为止,我已经尝试过:

  • 在 ssh 命令中使用 -o GSSAPIAuthentication=no
  • 使用密码而不是密钥
  • 在 sshd_config 中使用 UsePrivilegeSeparation no 而不是 yes

Str*_*dic 52

这可能是D-Bus和的问题systemd。如果dbus服务由于某种原因重新启动,您还需要重新启动systemd-logind.

您可以通过打开 ssh 守护进程日志(在 Ubuntu 上应该是/var/log/auth.log)来检查这是否是问题,并检查它是否有以下几行:

sshd[2721]: pam_systemd(sshd:session): Failed to create session: Connection timed out
Run Code Online (Sandbox Code Playgroud)

如果是,只需重新启动systemd-logind服务:

systemctl restart systemd-logind
Run Code Online (Sandbox Code Playgroud)

我在 CentOS 7 上遇到了同样的问题,因为它messagebus已重新启动(这就是D-Bus在 CentOS 上调用服务的方式)。


M-J*_*ack 28

找到答案:

在 sshd_config 文件中将 UsePAM 从 yes 更改为 no

重新启动 ssh 服务后,现在可以立即连接到服务器。在这台服务器上,PAM 链接到 ldap,所以这可能是原因,即使我在这里连接的是在服务器本身上声明的用户,而不是 LDAP 用户。

嗯,这更像是一种绕过问题的方法,而不是真正的解决方案......我有其他服务器以相同的方式设置,但没有出现此问题。

希望这可以帮助某人...

  • PAM 用于现代系统中帐户管理的其他方面。与其关闭它,不如调查 PAM 堆栈中发生的事情以及为什么它需要这么长时间。 (10认同)
  • 这真的不是一个好主意。 (6认同)
  • 留下非常常用的未使用的 PAM 模块“启用”以进行 SSH 访问是一个安全漏洞。从安全角度来看,限制对 SSH 等关键服务的访问对于任何其他服务来说始终是一个好主意。什么时候需要PAM模块与SSH配合?例如:当您需要通过 winbind 将其与活动目录集成时,当您需要使用 google 令牌进行两因素身份验证时等。在其他情况下(使用 passwd 和 Shadow 时),关闭它是非常安全的。PAM 的每个用户都应该看到:https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=pam (3认同)
  • 将 UsePAM 更改为 no 会产生其他影响。请参阅[此讨论](http://serverfault.com/questions/381967/ssh-login-using-public-key-failed)所以我必须为用户设置密码,因为我收到诸如 User nagios not allowed 之类的错误因为帐户被锁定 (2认同)
  • 为什么 ??任何选择? (2认同)

Ric*_*arn 18

这发生在我的两台 Fedora 25 服务器上,是由于多次尝试 SSH 登录失败造成的。

(使用GSSAPIAuthentication=noandUseDNS=no或重新启动的常见建议systemd-logind没有区别。)

在这些服务器上,/etc/pam.d/postlogin包含:

session     optional      pam_lastlog.so silent noupdate showfailed
Run Code Online (Sandbox Code Playgroud)

手册页pam_lastlog解释了该showfailed选项将:

从 btmp 显示失败的登录尝试次数和最后一次失败尝试的日期。

在这些服务器上,/var/log/btmp由于多次登录尝试失败,文件非常庞大。该btmp日志文件没有被任何旋转。

我安装了这个logrotate包以确保日志文件将来会被轮换。(在 Fedora 上,随附的配置logrotate处理 . 的旋转/var/log/btmp。)

我还删除了巨大的btmp日志文件;一旦我这样做了,连接到服务器又是瞬间的。

  • 这解决了我的问题!谢谢你。不错的收获。SSH 需要 5-10 秒,现在它不到一眨眼的时间。这是在我已经连接到公共互联网多年的虚拟机上。现在我想到了它的防火墙规则可能会稍微调整得更好。对其他人来说,这就是我所做的一切:`sudo truncate -s 0 /var/log/btmp` - 我的大小为 2.7G。 (2认同)

小智 7

在 Ubuntu 16+ 上,每次我看到它ssh -v XXX@YYY停滞时pledge: network都可以按照我在此处找到的说明进行修复 修复慢速 SSH 登录的综合指南。具体来说,似乎不需要的可选 PAM 模块导致了延迟。

/etc/pam.d/common-session机器上,您会看到(即服务器)登录缓慢。注释掉该行session optional pam_systemd.so。那应该立即解决问题。

这避免了必须完全关闭 PAM,这会削弱使用密码登录的能力。


小智 6

我的问题(Ubuntu 19.10)是我的:

/etc/pam.d/sshd

# Print the message of the day upon successful login.
# This includes a dynamically generated part from /run/motd.dynamic
# and a static (admin-editable) part from /etc/motd.
session    optional     pam_motd.so  motd=/run/motd.dynamic
session    optional     pam_motd.so noupdate
Run Code Online (Sandbox Code Playgroud)

评论 motd 设置让我很受用。


小智 5

对我来说,这个问题是由大(数百 MB)btmp文件引起的。此文件记录登录尝试。当人们试图暴力破解您的密码时,此文件可能会很大并导致该"pledge: network"阶段的延迟。

尝试清除日志文件

echo "" > /var/log/btmp

看看它是否有帮助。

  • 这需要更多的解释。首先,你为什么认为这有帮助? (4认同)