当我使用通过手机信号塔提供互联网服务的提供商时,我的 ssh 会话经常断开连接。它们似乎“冻结”并停止响应我输入的任何内容,但有时直到冻结几分钟后才给出实际的断开连接消息。
我在下面以“问答方式”回答我自己的问题 - 这是我去年花了很多时间试图解决的问题,我想整合和分享我迄今为止找到的所有解决方案。 (如果您有我尚未找到的其他解决方案,也请随意添加您自己的答案!)
答案1
使用手机信号塔/移动热点访问互联网时,您的 ssh 会话(或其他持久连接)可能会中断,主要原因有以下三个:
- 您的 IP 地址正在改变。这通常是不是问题的原因。理论上,任何不向您提供静态 IP 地址的提供商(移动或其他)都可能发生这种情况,但即使使用移动热点提供商,您的 IP(通常)也不会经常更改,不会定期中断您的连接。您可以通过使用“我的 IP 地址是什么?”来检查是否发生这种情况。键入 site,定期重新加载该站点,并观察您的 IP 地址是否发生变化。
- 您与提供商的连接正在中断(原因示例:信号弱)。如果这是您的问题,您还可能会发现它影响其他连接类型(流视频、网页浏览),而不仅仅是 ssh 连接。
- 您的提供商使用 NAT,并且从其 NAT 表中删除“非活动”连接的超时时间非常短。如果您的互联网连接对于其他用途(网页浏览、视频流)没有问题,但如果您停止打字超过一两分钟,您的 ssh 会话就会停止响应,这可能是问题的原因。
问题 #1 和 #2 的解决方案:
对于这些问题,最好的解决方案是使用 SSH 以外的更适合不稳定/变化的连接的方式。两个常见的选项是莫什和永恒终点站。 MOSH 不支持回滚(您只能看到最新的输出屏幕),因此您可能需要使用 screen 或 tmux 之类的东西来添加该功能。永恒终端确实支持回滚。有时可以在服务器上的常规用户帐户下安装 MOSH(但不是永恒终端),而无需 root 访问权限。
如果您的问题是连接短暂中断,您也可以坚持使用 ssh,并通过禁用 TCPKeepAlive 来使服务器的 SSH 配置更具中断容忍度,并通过设置“ClientAliveInterval 0”禁用客户端活动检查或允许通过设置“ClientAliveCountMax 20”在结束连接之前进行多次失败的检查。
前两段中的一些解决方案需要服务器上的 root 访问权限才能设置。如果您没有 root 访问权限,您可以从网络托管公司购买便宜的虚拟专用服务器 (VPS),并在 VPS 上设置上述选项之一。然后,当您想要连接到另一个系统时,您可以先连接到 VPS,然后使用它来 ssh 到另一个中断容忍度较低的系统。
问题 #3 的解决方案:
问题 #3 的解决方案是确保信息定期通过 ssh 连接发送,这样信息就不会在互联网提供商的 NAT 表中超时。
首先,它可能有助于测试您是否正在解决正确的问题。下面的脚本将导致服务器通过 ssh 连接每 30 秒发送一次输出,持续一小时。如果您的 ssh 连接在该脚本运行时保持连接一个小时而没有断开,那么您可能走在正确的轨道上。 (如果没有,请尝试将时间间隔设置为小于 30 秒,或者查看上述 ssh 断开连接的其他潜在原因。)
INTERVAL=30
START_TIME=`date +%s`
END_TIME=$(( $START_TIME + 3600 ))
while [ `date +%s` -lt $END_TIME ]
do
date
sleep $INTERVAL
done
echo "Test completed successfully - your ssh connection lasted at least one hour."
假设上面的脚本可以防止 ssh 连接断开,那么您现在已经有了解决方案,只需要一种方法让它自动发生。实现此目的的方法是让 ssh 每 30 秒进行一次“活动”检查,这会导致每 30 秒通过 ssh 连接发送消息,并防止其因不活动而从 Internet 提供商的 NAT 表中清除。您可以在计算机上配置服务器或 ssh 客户端来执行“活动”检查(两者都可以,不需要两者都需要)。
要在服务器端进行设置,请编辑 /etc/ssh/sshd_config 并设置“ClientAliveInterval 30” - 这将使服务器每 30 秒向客户端发送一条消息以检查客户端的响应。您可能还需要设置“ClientAliveMaxCount 10”,以允许在服务器关闭 ssh 连接之前最多 10 次检查失败(以防出现轻微中断)。请务必重新启动 sshd,以便对配置的更改生效。
如果您没有服务器上的根访问权限(或需要连接到多个服务器),也可以在您的计算机上进行设置。您可以让计算机每 30 秒发送一次活动检查任何您使用以下命令连接到的服务器:
Host *
ServerAliveInterval 30
ServerAliveCountMax 8
在 Linux 或 MacOS 上,这些行将位于 ~/.ssh/config 中。如果您在 Windows 上使用 OpenSSH,这些行将位于 C:\Users\yourusername\.ssh\config 中(如果该文件不存在,您可以创建它,只需确保它没有 .txt 扩展名) 。
如果您使用的是 PuTTY,则在“连接”部分下的会话设置中,您可以将“保持连接之间的秒数”设置为 30 以产生类似的行为。使用 PuTTY,您需要将其放入每个服务器/连接的设置中,似乎没有全局设置。