sshd_config中的ServerAliveInterval和ClientAliveInterval有哪些选项呢?


161

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

我的问题很简单,当我挂起笔记本计算机时,我的一些连接会超时,然后用响应将其挂起,Write failed: Broken pipe而有些则不会。如何正确配置本地sshd,以使它们不会因管道损坏而失败?

Answers:


202

ServerAliveInterval客户端在向服务器发送空数据包之前(等待连接保持活动状态)将等待的秒数。

ClientAliveInterval服务器在向客户端发送空数据包之前(等待连接保持活动状态)将等待的秒数。

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

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

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

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

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

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


好的,所以我将零秒解释为暗示“不要存活”,这就是为什么它不轮询客户端/服务器?
M. Tibbits 2010年

3
是0 =不发送空数据包。另一个不同之处是,在客户端配置中设置了ServerAliveInterval,而在服务器配置中设置了ClientAliveInternal。
巴泰勒米(Barthelemy)2010年

8
这似乎是防止闲置导致超时的好建议,但是我不明白它与防止客户端挂起时防止管道中断的OP问题有什么关系。处于睡眠状态时,客户端将无法发送空数据包,因此确定此设置没有意义吗?
Sparhawk

当然,ServerAlive部分是。ClientAliveInterval / ClientAliveCountMax在这里会有所帮助。
javawizard 2014年

1
回顾这个旧答案,我相信回答的是标题中的问题,而不是第二段中的问题,因此,我同意关于ServerAliveInternal的评论无助于暂停。@JonasWielicki ClientAliveInterval在挂起的情况下可能很糟糕,因为被挂起的客户端将不会应答服务器,并且在ClientAliveCountMax之后服务器最终将断开客户端的连接。
巴泰勒米(Barthelemy)

18

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表示已禁用。因此,您应该将这些值设置得足够高,以免发生管道破裂的错误。


有用的帖子。但是我对此感到非常沮丧。我在整个地方都设置了较大的间隔,仅几分钟后,我的连接仍然断开。(在Ubuntu上使用openssh,不确定是否相关)
Sridhar Sarnobat

1
@ user7000同时配置客户端(ssh)和服务器(sshd)。这可能会有所帮助:如何解决“远程连接意外关闭SSH连接”的问题
kenorb

我想我要去某个地方。可能是我没有ServerAliveInterval在配置文件中放置空格。
Sridhar Sarnobat

15

巴泰勒米的答案很酷,但并没有真正找到问题的根源。您挂起了计算机,并希望在启动计算机时SSH会话仍然有效。

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

对于肮脏的解决方法,您可以使用VPS或另一个带有屏幕的在线包装盒来保持连接。我的建议出于安全原因不建议这样做。


1
实际上,这是对该问题的唯一回答。
Calimo 2014年

1
实际上,这是一个糟糕的安全解决方案,永远不要这样做。
jahrichie

14

由于您无法保证一旦一端停止向已接收的数据包发送ACK,SSH连接(即TCP)仍将保持活动状态,因此我个人使用http://www.harding.motd.ca/autossh/重新启动所有SSH连接我几乎没有任何悬念。

由于GNU Screen将在服务器端使用,因此重新连接使我回到了以前的状态。

您可以让它在其他端口上侦听,以便它不断检查连接是否仍然有效,但是就我个人而言,我发现它在禁用了该功能并且仅依靠SSH自己的ServerAliveInterval/时就可以很好地工作ServerAliveCountMax

另一个选择是http://mosh.mit.edu/,它使用UDP并从长期缺乏连接性的情况下无缝恢复。


5

nohup如果希望无论您的SSH连接如何运行命令,也可以使用它们。

例如

$ nohup tar -xzf some_huge.tar.gz &

&,我认为,没有必要的,但它很方便,因为它使得在后台运行的进程,所以你可以做其他的东西。

我总是将nohup用于需要一段时间的任何进程,这样,无论出于什么原因(电源中断(在我的远程位置,而不是主机上),网络中断等等),如果我失去连接,就不必重新开始。


注意zsh上的nohup无法正常工作!
Sridhar Sarnobat

@ user7000有什么不当之处?
Buttle Butkus

我不记得了,我认为在客户端断开连接后,它基本上没有使流程保持运行。那是几年前的事,我停止使用nohup并改用disown。
Sridhar Sarnobat

2
我猜zsh用户应该坚持使用disown -h而不是nohup,除非此后已解决问题。
Buttle Butkus

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.