当我从家里通过 ssh 连接到我们的一台办公服务器(运行 Fedora 10)时,我的会话在相当短的活动时间(5 分钟左右)后超时。我试过TcpKeepAlive
在客户端使用,没有效果。
我不明白的是,如果我在公司局域网的办公室里,我可以让会话整天处于非活动状态而不会超时,所以这种行为似乎取决于我的位置。
任何想法为什么会发生这种情况以及当我不在 LAN 上时如何防止超时?如果有帮助,我将在 Mac OSX 上使用终端客户端。
更新- Dave Drager 建议使用ServerAliveInterval
非零设置TcpKeepAlive=no
对我有用。关于其他一些答案,ClientAlive
Mac OSX SSH 客户端不接受 ... 设置。
这里有一个关于这个问题的很好的文章。
他们建议:
或者:
但是,我确实在我的工作场所遇到了一个问题,我与会话断开连接,而在家里他们很好。我相信我的防火墙 (SonicWall) 可能与 TCPKeepAlive 发生冲突,可能是因为 NAT。
幸运的是,我的 SSH 客户端 SecureCRT 有一个“NO-OP”协议选项,我相信它基本上会向服务器发送一个不执行任何操作的命令。通过手动启用它,我可以保持连接。不确定 MacOSX 终端客户端有什么与此类似的。有一篇关于如何在命令行上实现“NO-OP”的文章。
最后,您可能希望使用 Wireshark 或其他嗅探器来观察您的实际 TCP 连接,以了解它发生了什么。这将是了解为什么它偶尔仍会断开连接的最后方法。
这可能是因为当您在家中连接时,您会通过防火墙,该防火墙会在一小段时间后关闭 TCP 会话。但是 TcpKeepAlive 应该避免这种情况。您是在客户端还是在服务器端启用了 TcpKeepAlive?
我在康卡斯特的连接上总是得到这个。问题是您的 SSH 客户端的保活间隔对于您的网络路径中配置的超时时间来说太长了。如果您使用的是 Linux,则可以将
ServerAliveInterval
和ServerAliveCounter
值修改为低于其默认值。此值以秒为单位设置。系统范围的配置文件(通常)位于/etc/ssh/ssh_config
. 设置这两个 ANDTcpKeepAlive
应该有助于保持连接。就像radius所说,一些状态完整的防火墙在一定(通常是可配置的)时间后会“忘记”连接,并且不允许进一步的连接通信;他们希望连接以 TCP SYN 开始(我在这里指的是您的 SSH 通信)。
还有另一种可能。您的家庭和办公室之间的网络路径可能会丢失(数据包类型)。当您尝试在 SSH 客户端上键入时,如果您的链接停止了一段时间,客户端可能会放弃并失败。
客户端上的 Keepalive 配置将在此处处理第一种情况,但在第二种情况下无济于事。防火墙通常位于您的办公室周边,因此可能是可配置的。这对第一点也有帮助。
要检查您是否有间歇性链路丢失,您可以在客户端计算机的后台保持“ping”处于活动状态。
您还可以将其他人建议的设置添加为
~/.ssh/config
文件中的默认设置,这样您就不必在ssh
每次启动连接时都将它们传递给:nano ~/.ssh/config
并添加: