为什么我的SSH超时因networking位置而异?

当我从家里进入我们的一台办公室服务器(运行Fedora 10)时,会话经过相当短的时间(5分钟左右)就超时了。 我已经尝试在客户端使用TcpKeepAlive ,没有任何效果。

我不明白的是,如果我在公司局域网的办公室里,我可以整天闲置一段时间,而不会超时,所以这种行为似乎取决于我的位置。

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

更新 – 戴夫德雷格的build议使用ServerAliveInterval设置为非零与TcpKeepAlive=no为我工作。 关于其他一些答案,Mac OSX SSH客户端不接受ClientAlive …设置。

    这里有关于这个问题的一个很好的写法。

    他们build议:

     ssh -o TCPKeepAlive=yes 

    要么:

     ssh -o TCPKeepAlive=no -o ServerAliveInterval=15 

    但是,我的工作地点有一个问题,我断开会话,在家里他们很好。 我相信我的防火墙(SonicWall)可能会因TCPKeepAlive而感到不安,也许是因为NAT。

    幸运的是我的SSH客户端SecureCRT有一个“NO-OP”协议选项,我相信这个协议基本上是发送一个对服务器没有任何作用的命令。 通过手动启用这个我能够保持连接。 不知道MacOSXterminal客户端有什么类似的。 有关如何在命令行上执行“NO-OP”的说明。

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

    这可能是因为当你从家里连接的时候,你会经过一段很短的时间后closuresTCP会话的防火墙。 但TcpKeepAlive应该避免这一点。 您是否在客户端或服务器端启用了TcpKeepAlive?

    我一直在我的C​​omcast连接上得到这个。 问题是,您的SSH客户端的保持活动时间间隔对于networkingpath中configuration的超时时间太长。 如果您使用的是Linux,则可以将ServerAliveIntervalServerAliveCounter值修改为低于其默认值。 该值以秒为单位设置。 (通常)在/etc/ssh/ssh_configfind系统范围的configuration文件。 设置这两个和TcpKeepAlive应该有助于保持连接。

    像半径说的那样,一些全状态的防火墙在经过一定的(通常是可configuration的)时间之后会“忘记”连接,并且不允许进一步的连接通信。 他们期望连接从一个TCP SYN开始(我指的是你的SSH通信)。

    还有另一种可能性。 您的家庭和办公室之间的networkingpath可能会有损失(包types)。 当您尝试在SSH客户端上键入时,如果您的链接停顿了一段时间,客户端可能会放弃并失败。

    客户端上的Keepaliveconfiguration将在这里处理第一种情况,但在第二种情况下无法帮助。 防火墙通常在您的办公室周边,因此可能是可configuration的。 这也将有助于第一点。

    要检查你是否有间歇性的链接丢失,你可以在客户端机器的后台保持“ping”活动状态。

    你也可以将他人build议的设置作为默认添加到你的~/.ssh/config文件中,所以你不必在每次启动连接时都把它们传递给ssh

    nano ~/.ssh/config并添加:

     TCPKeepAlive=no ServerAliveInterval=15