我一直在努力解决几个系统在 X 分钟不活动后超时的问题,并且不知道如何修复它。
我的办公室里有一台 CentOS 机器。连接到 SSH 后 2 小时内无法触碰它,但当我运行某些程序时它仍然处于活动状态。
但是,连接到家里的同一个盒子时,它有时会在几秒钟后超时,有时会在几分钟后超时。
我认为这是我的互联网连接,但是如果我正在积极使用该盒子,它将保持连接状态。
但是,如果我停止在 Google 上输入某些内容,它会显示一条断开连接的消息,我必须重新连接。
我可以检查什么来了解发生了什么事?
答案1
您首先应该考虑的是设置 ServerAliveInterval。这应该在您的工作站上进行设置。
在 Linux 或 OSX 客户端上,您可以在工作站的 ~/.ssh/config 下为您的用户创建一个配置文件。添加以下指令。在我的例子中,我希望它影响所有主机,所以我把它放在 Host * 下。
Host *
ServerAliveInterval 60
这将每 60 秒发送一次 noop 指令以保持连接打开。您可能需要调整该值以满足您的需求。
在服务器端确保 TCPKeepAlive 设置为是。
grep TCPKeepAlive /etc/ssh/sshd_config
TCPKeepAlive yes
如果您使用的是 Windows,则需要参考客户端的文档。
答案2
Linux 不会使空闲的 SSH 连接超时。您可以无限期地保持 SSH 连接打开,只要端点没有重新启动或获得新的 IP 地址,在长时间空闲后访问该连接时,该连接仍将有效。
但是,如果有任何有状态的中间件(NAT、防火墙等),则这些中间件可能会使空闲连接超时。其结果是,即使两端的连接都处于活动状态,两个端点也无法再进行通信,因为中间件拒绝转发任何数据包,直到 SSH 客户端打开新连接。
如果您知道中间件的超时时间,您可以通过ClientAliveInterval
在/etc/ssh/sshd_config
服务器或客户端ServerAliveInterval
上配置来解决该问题~/.ssh/config
。为了最佳地检测断开的连接,建议同时启用这两个设置。当任一端点重新启动或获得新的 IP 地址时,这也会检测到断开的连接。
由于您指出超时时间有时似乎只有几秒钟,这可能不足以解决您的问题。非常低的明显超时时间可能是由 CGN 过载或配置错误引起的。您需要检查通信路径各个点的流量,以确定 CGN 是否是导致故障的原因。
如果结果发现故障是由于您的 ISP 做了一些愚蠢的事情(例如通过不共享连接状态的多个 CGN 来平衡连接负载)而导致的,那么您无法通过简单地调整 SSH 配置来自行解决问题。
如果您碰巧被一个拥有不可靠 CGN 的 ISP 所困扰,而他们拒绝修复,那么我所知道的唯一剩下的选择就是将客户端和服务器都升级到支持 MPTCP 的内核版本,或者使用旨在容忍 NAT 上端口映射的自发变化的隧道解决方案。