起因
在更换了 Xshell 来连接到远程服务器之后发现 SSH 连接总是会在无动作的几分钟后断开
事出反常必有妖,我今天打算来找一下原因。
简单尝试
我先试着将 Xshell 设置中 保持活动状态 中的选项卡都勾上,但是没有用,还是掉线
想着,这个 SSH 链接中间是经过了路由器上的代理,解决问题要从最简单的排除法开始,于是我尝试关闭代理,这次不再掉线了,那么问题就锁定在代理上了,但是,为什么代理会让我的连接掉线?
我和代理软件中间还隔着一个 Nginx ,这个掉线是 Nginx 的问题还是 代理软件的问题?我尝试绕过 Nginx 直连代理,也不再掉线,那么问题就锁定在 Nginx 上,应该是 Nginx 的某个设置导致会将一段时间不活动的连接关闭,可是,在 Xshell 的设置中我会每60秒发送一次保持活动状态的消息,这应该不会导致链接断开才对呀?没有办法,我无法进一步实验来确定原因,于是我拿出了 Wireshark 尝试分析网络活动。
抓包分析
图中 1 2 3 4 是 Xshell 发送的保活信息,每隔60秒一次,5 应该是服务器发送的关闭 SSH 通知,6 是TCP关闭 FIN 包,我就在想,第4次的保活包紧跟的就是 关闭SSH通知(在5处),会不会可能是我这边的保活周期和服务器的检测周期刚好相等导致的呢?如果刚好相等,确实会因为一点点的时间误差导致连接断开。
结语
我将 Xshell 的保活间隔改成59秒,经过测试一天一夜也不会掉线,稳如老狗。