当我从家里通过 ssh 连接到我们办公室的一台服务器(运行 Fedora 10)时,我的会话在活动时间较短(约 5 分钟)后超时。我尝试TcpKeepAlive
在客户端使用,但无效。
我不明白的是,如果我在公司局域网的办公室,我可以让会话一整天不活动而不会超时,所以这种行为似乎取决于我的位置。
你知道为什么会发生这种情况吗?当我不在 LAN 上时,如何防止超时?如果有帮助的话,我正在使用 Mac OSX 上的终端客户端。
更新- Dave Drager 建议使用ServerAliveInterval
设置为非零,这TcpKeepAlive=no
对我有用。关于其他一些答案,ClientAlive
Mac OSX SSH 客户端不接受 ... 设置。
答案1
关于这个问题有一篇很好的文章这里。
他们建议:
ssh -o TCPKeepAlive=yes
或者:
ssh -o TCPKeepAlive=no -o ServerAliveInterval=15
但是,我在工作时确实遇到了一个问题,就是会话会断开,而在家里却没问题。我认为我的防火墙 (SonicWall) 可能与 TCPKeepAlive 不兼容,可能是因为 NAT。
幸运的是,我的 SSH 客户端 SecureCRT 有一个“NO-OP”协议选项,我认为它基本上会向服务器发送一个不执行任何操作的命令。通过手动启用此功能,我可以保持连接。不确定 MacOSX 终端客户端有什么类似的功能。有一个写上去关于如何在命令行上实现“NO-OP”。
最后,您可能希望使用 Wireshark 或其他嗅探器来观察您的实际 TCP 连接,以了解其情况。这将是了解它为何偶尔仍会断开连接的最后方法。
答案2
这可能是因为当您从家里连接时,您会经过防火墙,该防火墙会在一小段时间后关闭 TCP 会话。但 TcpKeepAlive 应该可以避免这种情况。您是在客户端还是在服务器端启用了 TcpKeepAlive?
答案3
我在使用 Comcast 连接时总是遇到这种情况。问题在于您的 SSH 客户端的保持活动间隔对于网络路径中配置的超时时间来说太长。如果您使用的是 Linux,则可以将和ServerAliveInterval
值修改ServerAliveCounter
为低于其默认值。此值以秒为单位设置。系统范围的配置文件(通常)位于 中/etc/ssh/ssh_config
。设置这两个 ANDTcpKeepAlive
应该有助于保持连接畅通。
答案4
您还可以将其他人建议的设置添加为文件中的默认设置~/.ssh/config
,这样就不必在ssh
每次启动连接时都传递它们:
nano ~/.ssh/config
并添加:
TCPKeepAlive=no
ServerAliveInterval=15