SSH ClientAliveCountMax 设置似乎不起作用并断开用户连接

Tom*_*son 3 ssh ubuntu

我已经/etc/ssh/sshd_config按如下方式配置了我的 Ubuntu Linux 服务器文件:

ClientAliveInterval 60
ClientAliveCountMax 60
Run Code Online (Sandbox Code Playgroud)

我假设服务器会以 60 秒的间隔发送 60 个空数据包以保持连接有效。连接确实保持活动状态,但可以无限期地保持连接,并且在 1 小时左右后不会断开连接。

我在 1 小时 20 分钟不活动时尝试了它(我只是让 SSH 终端打开而不输入任何内容),它仍然存在。

可能是什么问题?

Kam*_*ski 5

如果“1 小时 20 分钟不活动”是指

  • 用户有 1 小时 20 分钟没有在他们的 shell 中输入
  • 或用户在ssh -N …1 小时 20 分钟前使用过
  • 一般情况: 1 小时 20 分钟没有数据传输

那么这对ClientAlive*机制来说不是不活动。


为了理解 的观点ClientAlive*,让我们从一个健壮的sshd.

  1. 客户端可以正常断开连接。在这种情况下ssh通知sshd,服务器肯定知道连接已终止。
  2. ssh可执行文件可能出于某种原因意外死亡(例如,它被强行杀死了),所以它可以在其无意沟通脱节。客户端的操作系统仍然能够正确关闭 TCP 连接,因此sshd识别出连接不再存在。
  3. 无论出于何种原因(例如,由于未插入网络电缆),整个客户端机器都会被杀死或消失。现在sshd无法判断客户端是否沉默是因为它没有数据要发送,还是因为它不再存在。

ClientAlive*机制检测到最后一种情况。服务器发送客户端活动消息,客户端响应,如果客户端在那里。这在 SSH 协议中自动发生。使用 SSH 作为传输的应用程序既不受影响也不干扰。

ClientAliveIntervalClientAliveCountMax你使用的设置配置服务器多长时间问及有多少未回应的尝试需要,才可以放弃,并考虑终止连接。

该客户端能够检测类似的方式得益于死连接ServerAliveIntervalServerAliveCountMax

还有一种更通用的 TCP 连接机制(不是特定于 SSH):TCP keepalive。比较我的这个答案

任何类型的 Keepalive 数据包不仅允许连接端点检测连接是否失效。他们还“更新”了两者之间的联系。我的意思是,例如,如果很长时间没有看到属于它的数据包,我的带有 NAT 的家用路由器可能会将连接识别为死连接。如果发生这种情况,NAT 条目将被遗忘,当连接最终激活时,路由器将无法正确处理它。比较这个答案


让 SSH 终端打开而不输入任何内容并不会阻止ssh响应服务器生成的客户端活动消息。如果客户端在那里,客户端将响应。

要注销在一段时间内未与其 shell 交互的用户,您需要 shell:TMOUT或类似变量的帮助(取决于 shell)。但是用户可以重新配置他们的外壳。

互联网上有一些指南将该ClientAlive*机制视为TMOUT. 现在你知道这些是不同的东西。


有很多方法可以让操作系统检测用户的“不活动”(例如人丁不新工艺,只sshdbash运行,没有数据通过其流PTS)。即使我知道它们,我也不会使用它们来终止看起来不活动的SSH 连接。

如果用户请求通过 SSH 进行端口转发怎么办?与转发端口的连接可能随时进入。愿意使用端口的应用程序可以是任何东西,在不知道涉及转发的情况下。用户可能希望依靠 SSH 静默等待连接发生。IMO 仅因为没有流量而终止 SSH 连接不是一个好习惯。只要客户端响应客户端活动消息,连接就应该保持。

在您的情况下,客户一直在响应。