为什么我的ssh超时会随网络位置而变化?


15

当我在家中被放入我们的一台办公服务器(运行Fedora 10)时,我的会话在相当短的活动时间(约5分钟)后就超时了。我尝试TcpKeepAlive在客户端使用,没有任何效果。

我不明白的是,如果我在公司LAN上的办公室中,我可以整天保持不活动状态而不会超时,因此行为似乎取决于我的位置。

有什么想法为什么会发生这种情况,以及当我不在局域网上时如何防止超时?如果有帮助,我正在Mac OSX上使用终端客户端。

更新 -戴夫·德拉格(Dave Drager)提出的将ServerAliveInterval集合设为非零的建议TcpKeepAlive=no对我有用。关于其他一些答案,ClientAliveMac OSX SSH客户端不接受...设置。

Answers:


6

有关于这个问题的好书面记录在这里

他们建议:

ssh -o TCPKeepAlive=yes

要么:

ssh -o TCPKeepAlive=no -o ServerAliveInterval=15

但是,我的工作站点确实存在问题,我可以与会议断开连接,在家里也可以。我相信我的防火墙(SonicWall)可能不支持TCPKeepAlive,也许是因为NAT。

我的SSH客户端SecureCRT幸运地具有“ NO-OP”协议的选项,我相信该协议基本上向服务器发送了不执行任何操作的命令。通过手动启用此功能,我可以保持连接状态。不知道MacOSX终端客户端有什么与此相似。有一个书面记录就如何落实在命令行“NO-OP”。

最后,您可能希望使用Wireshark或其他嗅探器观察您的实际TCP连接,以了解发生了什么情况。这将是了解为什么它仍然偶尔断开连接的最终方法。


谢谢,戴夫-ServerAliveInterval选项非常有效。
gareth_bowles 2009年

@Dave我听说有些服务器管理员不赞成这种做法,因为它可能是(a)安全风险,或者(b)不必要的服务器负载。这些问题中的任何一个是否有效,IYHO?
乔纳森·戴

这是客户端端点上的一项设置,因此,即使您处于敌对环境中,这也可能会增加有人欺骗您的能力,但极不可能影响连接的安全性。我也看不到这会造成额外的负担。
Dave Drager

@Dave:我输入了此命令,但是得到了以下用法:ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:] port] [-escape_char] [-F configfile] [-我pkcs11] [-i Identity_file] [-L [bind_address:] port:host:hostport] [-l登录名] [-m mac_spec] [-O ctl_cmd] [-o选项] [-p端口] [-R [ bind_address:] port:host:hostport] [-S ctl_path] [-W host:port] [-w local_tun [:remote_tun]] [user @] hostname [command]
user1050619 2014年

此修复程序也适用于PuTTY。我必须设置的唯一选项是在Connection-> Keepalive之间的秒数:15. SSH会话已经运行了8多个小时(Comcast),并且通常会在30分钟之内断开连接。
Dan Dascalescu 2015年

2

这可能是因为在家中连接时,您会经过一小段时间后关闭TCP会话的防火墙。但是TcpKeepAlive应该避免这种情况。您是否在客户端或服务器端启用了TcpKeepAlive?


我在客户端(在我的〜/ .ssh / config中)执行了TcpKeepAlive-我认为这可以解决本地防火墙问题,但是仍然超时。
gareth_bowles 2009年

默认情况下,它在服务器端处于“打开”状态,但是请检查sshd_config以查看是否尚未禁用它。
半径

某些防火墙即使闲置了一定时间后也会断开TCP连接。
TomOnTime

某些防火墙即使闲置了一定时间后也会断开TCP连接。检测此问题的方法是查看您是否一直断开连接。
TomOnTime

这是我用来修复的设置:TCPKeepAlive否,ClientAliveInterval 300,ClientAliveCountMax 3
Matt Simmons 2009年

2

我一直在我的C​​omcast连接上获得此消息。问题在于,对于网络路径中配置的超时,SSH客户端的保持活动间隔太长。如果您使用的是Linux,则可以将ServerAliveIntervalServerAliveCounter值修改为低于默认值。该值以秒为单位设置。系统范围的配置文件(通常)位于中/etc/ssh/ssh_config。设置这两个AND TcpKeepAlive将有助于保持连接状态。


1

就像radius所说的那样,某些状态为全状态的防火墙会在一定时间(通常是可配置的)后“忘记”连接,并且将不允许对该连接进行进一步的通信。他们希望连接以TCP SYN开始(我在这里参考您的SSH通信)。

还有另一种可能性。您的家庭和办公室之间的网络路径可能会丢失(属于数据包类型)。当您尝试在SSH客户端上键入内容时,如果您的链接停滞了一段时间,则该客户端可能会放弃并失败。

客户端上的Keepalive配置将在此处处理第一种情况,但在第二种情况下无济于事。防火墙通常位于您的办公室外围,因此可以配置。这也将在第一点上有所帮助。

要检查是否存在间歇性的链路丢失,可以在客户端计算机的后台保持“ ping”状态。


0

您还可以将其他人建议的设置添加为~/.ssh/config文件中的默认设置,因此不必ssh每次启动连接时都将其传递给:

nano ~/.ssh/config 并添加:

TCPKeepAlive=no
ServerAliveInterval=15
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.