SSH客户端在一段时间之后卡死

问题描述

使用 SSH 连接远程服务器,长时间没有输入任何命令后,客户端输入命令经常出现无响应、假死的现象。

原因分析

  • 连接链路上的网络设备为了节省网络资源,主动断开了 TCP 连接。具体来说,网络设备维护了一张 连接状态表, 为了避免 连接状态表 存放大量无效的连接,设置了超时机制。如果在规定时间内连接没有传输任何数据包,就认为该连接无效,从而断开对应的连接。
  • 客户端不知道连接已经断开,继续保持 连接中 的状态

解决方案

有两种解决方案:

  • 修改客户端的 SSH 配置(推荐)
  • 修改服务端的 SSH 配置(需要服务器权限)

修改客户端的 SSH 配置

修改客户端的 SSH 配置无需服务器权限,操作简单,修改完后立即生效,推荐使用。操作如下:

~/.ssh/config 文件中新增如下的内容:

Host * # `*` 表示对所有的服务器使用下方的配置
	ServerAliveInterval 60 # 每隔 60s 向服务器发送一次心跳包
	ServerAliveCountMax 3 # 服务器连续 3 次未响应心跳包则主动断开连接

修改服务器的 SSH 配置

编辑 /etc/ssh/sshd_config 文件,在文件中新增如下的内容:

ClientAliveInterval 60     # 每 60 秒向客户端发送一次心跳包
ClientAliveCountMax 3      # 客户端连续 3 次未响应心跳包则主动断开连接
使用 Hugo 构建
主题 StackJimmy 设计