sshd_config 中的选项 `ServerAliveInterval` 和 `ClientAliveInterval` 到底有什么作用?

sshd_config 中的选项 `ServerAliveInterval` 和 `ClientAliveInterval` 到底有什么作用?

我发现这个问题,但很抱歉,我不太了解接受的响应中提到的ServerAliveInterval两个变量的设置。ClientAliveInterval如果我的本地服务器超时,我应该将此值设置为零吗?那么它永远不会超时吗?我应该将其设置为 300 秒还是其他值?

我的问题很简单,当我暂停然后通过响应取消暂停我的笔记本电脑时,我的一些连接超时,Write failed: Broken pipe而另一些则没有。如何正确配置本地 sshd,使其不会因管道损坏而失败?

答案1

服务器活动间隔:秒数客户将在向服务器发送空数据包之前等待(以保持连接处于活动状态)。

客户端活动间隔:秒数服务器将在向客户端发送空数据包之前等待(以保持连接处于活动状态)。

设置值 0(默认值)将禁用这些功能,因此如果闲置时间过长,连接可能会断开。

ServerAliveInterval 似乎是保持连接活动的最常见策略。为了防止管道损坏问题,这是我在 .ssh/config 文件中使用的 ssh 配置:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

上述设置将按以下方式工作,

  1. 客户端将空闲等待 60 秒(ServerAliveInterval 时间),并向服务器发送“无操作空数据包”并期待响应。如果没有响应,那么它将继续尝试上述过程,直到 10 (ServerAliveCountMax) 次(600 秒)。如果服务器仍然没有响应,则客户端断开 ssh 连接。

服务器端的 ClientAliveCountMax 也可能有帮助。这是允许客户端在断开连接之前保持无响应的时间限制。默认值为3,即3个ClientAliveInterval。

答案2

这在中进行了解释sshd_config手动的( man sshd_config):

ClientAliveInterval

设置超时间隔(以秒为单位),在此之后如果没有从客户端接收到数据,sshd 将通过加密通道发送消息以请求客户端的响应。默认为0,表示这些消息不会发送到客户端。此选项仅适用于协议版本 2。

ClientAliveCountMax

默认值为 3。如果ClientAliveInterval(见下文)设置为 15,并ClientAliveCountMax保留默认值,无响应的 SSH 客户端将在大约 45 秒后断开连接。此选项仅适用于协议版本 2。

对于客户端选项,请参阅以下说明man ssh_config

ServerAliveInterval

设置超时间隔(以秒为单位),在此之后如果没有从服务器收到数据,ssh将通过加密通道发送消息以请求服务器响应。默认为0,表示这些消息不会发送到服务器。此选项仅适用于协议版本 2。

ServerAliveCountMax

默认值为 3。例如,如果ServerAliveInterval设置为 15 并ServerAliveCountMax保留默认值,则如果服务器无响应,ssh将在大约 45 秒后断开连接。此选项仅适用于协议版本 2。

根据上面的内容,0 表示已禁用。因此,您应该将这些值设置得足够高以避免管道破裂错误。

答案3

巴泰勒米的答案很酷,但并没有真正触及问题的根源。您挂起计算机并希望 SSH 会话在启动计算机时仍处于活动状态。

ssh 没有这样的配置可以使连接保持活动状态。 SSH 使用 TCP,一开始您需要三向握手,然后在一段空闲时间后保持活动状态。当您关闭/休眠时,所有 TCP 连接都会通过 FIN 关闭。没有办法克服这一点。

对于肮脏的解决方法,您可以使用 VPS 或其他带屏幕的在线盒子来保持连接。我的建议是出于安全原因不要这样做。

答案4

将长时间运行的会话放在 screen 内 请参阅 screen -h 了解详细信息

这样您就可以使用 ssh 重新连接到计算机并重新连接到屏幕会话

相关内容