如何防止SSH会话冻结?


65

我拥有ServerAliveInterval并且在ClientAliveIntervalSSH客户端/服务器配置文件中也有几台机器也设置为540的情况(我想将其设置为540以上不是一个好主意)。我使用许多SSH会话,这些会话目前在几分钟后会冻结。

我该如何解决?我想要的是完全不冻结会话,例如,如果我在8点打开一个会话并且在4个小时内不使用它,则仍然可以在12点再次使用它而不必再次登录。


您当前可以保持登录状态多长时间(假设这不是由于网络断开引起的)?TCPKeepAlive yes
iyrin

我不确定,不过10分钟。最多。至于TCPKeepAlive yes-取决于机器。
2015年

11
只是用mosh吗?
六。

1
或者您可以使用autossh...
ThoriumBR 2015年

我想说一个连接保持开放4小时是出于安全考虑,您应该screen改用它。但是我仍然支持您的问题,因为一两分钟后我仍然遇到相同的问题。
戴尔·安德森

Answers:


79

您在做出的更改/etc/ssh/ssh_config/etc/ssh/sshd_config是正确的,但仍然不会有任何效果。

要使配置生效,请在客户端上进行以下配置更改:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval 客户端将每100秒向服务器发送一个空数据包,以保持连接有效

NULL数据包 由服务器发送到客户端。客户端将相同的数据包发送到服务器。TCP NULL数据包不包含任何控制标志,例如SYN,ACK,FIN等,因为服务器不需要客户端的答复。NULL数据包的描述如下:https : //tools.ietf.org/html/rfc6592

然后在服务器上配置sshd部分。

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval服务器将等待60秒,然后再向客户端发送空数据包以保持连接有效

TCPKeepAlive是否可以确保某些防火墙不会断开空闲连接。

即使ClientAliveCountMax Server尚未收到来自客户端的任何消息,它仍将向客户端发送活动消息。

最后重启 ssh server

service ssh restartservice sshd restart取决于您所使用的系统。


我认为ServerAliveCountMax也需要很高的配置才能使其尽可能可靠。如果两个ServerAliveIntervalClientAliveInterval设置得足够低,我不认为会有任何需要TCPKeepAlive。此外,如果有任何中间盒,即使先前配置的所有设置均正确无误,它们仍然会丢失状态。使用MPTCP可能会有所帮助(如果客户端和服务器均支持它)。
卡巴斯德(Kasperd)

一开始不清楚是在客户端还是在服务器端进行配置(最终我还是说客户端)。然后在ServerAliveInterval描述中,您说“客户端将发送...到服务器”,但是在下一段“ 服务器将NULL数据包发送到客户端”。我觉得这些有些混乱。
Craig McQueen

1
添加到服务器后,我得到:/ etc / ssh / ssh_config:第57行:错误的配置选项:clientaliveinterval / etc / ssh / ssh_config:第59行:错误的配置选项:clientalivecountmax
Anders

2
@Anders因为ClientAliveIntervalClientAliveCountMax是ssh服务器选项,因此会出现错误,sshd_config而不是出于该目的ssh_config
Valentin Bajrami

1
@chandresh,您不必。修改ssh_config新会话后,将读取该文件。该/etc/environment文件是另一种东西,其格式为VAR="value" 无空格,因此VAR = "value"将无效。这样采购/etc/ssh/ssh_config将成为:Port 22Host * 将其视为命令
Valentin Bajrami,

13

个人建议:screen在远程主机上使用;只要它在终端中保持活动状态,它就会设法使您的连接保持活动状态。

我通常添加以下内容以/etc/screenrc快速识别屏幕会话:

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

编辑:提示。

hardstatus字符串将显示底部状态行,例如: 具有三个打开的​​选项卡的屏幕会话示例

回滚缓冲区也扩展到8192行,而不是通常的1000-1500行(取决于分布)。


谢谢,有两个问题:1.您能否解释screenrc文件中的选项?登录后如何在启动屏幕/ tmux上配置系统?
2015年

8
只是为了澄清,screen不能使ssh连接保持活动状态。它在虚拟终端中运行进程,而该虚拟终端与您通过ssh其连接的用户终端无关,因此该进程不依赖于您的连接。ssh在解决之前,您仍然会失去连接。
iyrin

1
所谓“ 保持连接有效 ”,我的意思是“ 防止连接空闲 ”,其结果相同。如果4个小时内没有任何输入,则SSH 处于空闲状态并最终关闭连接,所有子进程也将消失。

2
尽我所能screen,我建议新用户开始使用tmux
dotancohen 2015年

2

使用OpenSSH:

您需要启用

TCPKeepAlive yes

既在客户端ssh_config中(例如/etc/ssh/ssh_config或中~/.ssh/config),也在运行OpenSSH的目标SSH服务器中(例如/ etc / ssh / sshd_config)。

因此,每当您的连接空闲时,OpenSSH都会向目标主机发送一些虚拟数据包。


这也会导致连接中断The default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. linux.die.net/man/5/sshd_config
iyrin 2015年

老实说,但是这"[…] network goes down […] client host crashes […] route is down […]"是严重的错误,SSH配置无法捕获。此处的主要问题是空闲的SSH会话,而不是网络故障。因此,总结一下:- TCPKeepAlive yes在服务器和客户端中均启用。- ClientAliveInterval 在服务器上设置- 在服务器上设置IdleTimeout-设置ClientAliveCountMax 应该可以解决的问题...
Martin Allert

2

如果问题是笔记本电脑处于休眠状态或网络连接状况不佳,我建议使用mosh运行时间长ssh且允许自动重新连接的方式。

网站

莫什(手机壳)

允许漫游,支持间歇性连接并提供智能本地回显和用户击键的行编辑的远程终端应用程序。

Mosh替代了SSH。它更加健壮和响应迅速,尤其是在Wi-Fi,蜂窝和长途链路上。

Mosh是免费软件,可用于GNU / Linux,BSD,macOS,Solaris,Android,Chrome和iOS。

tmux(或更旧的screen)结合使用ssh时,即使更改wifi连接并幸免于移动数据丢失,这也使我可以从笔记本电脑通过服务器连接到服务器并保持连接数天。



1

检查主机上的sshd配置/etc/sshd_config以了解IdleTimeout设置

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
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.