要实现SSH会话长时间稳定连接,核心解决方案在于客户端与服务端的双重保活配置,配合稳定的网络环境与专业的终端工具,单纯依赖网络环境往往无法解决因超时断开的问题,必须通过主动发送“心跳包”来欺骗防火墙和路由器,使其认为连接始终活跃,针对移动端用户,APK运行 保持 网络不断是基础前提,而针对服务端和PC端,修改SSH配置文件则是根本手段,以下方案综合了客户端设置、服务端优化及工具推荐,确保连接持久稳定。

核心原理:理解SSH断开的根源
SSH连接断开,绝大多数情况下并非服务器故障,而是中间网络设备“误杀”了连接。
- 防火墙超时机制:企业路由器、云服务器防火墙或NAT设备为了节省资源,通常会清理长时间无数据传输的TCP连接,一旦超过设定时间(如5分钟或10分钟)没有数据包传输,防火墙会自动切断连接。
- 网络抖动与切换:移动网络在WiFi与数据流量切换,或信号波动时,会导致IP变更,TCP连接自然中断。
- 服务器安全策略:部分SSH服务器设置了较短的
ClientAliveInterval,若客户端无响应,服务器会主动断开。
客户端配置方案:主动发送心跳包
这是最直接、最有效的解决方案,通过客户端定期向服务器发送空数据包,维持连接状态。
Linux/Mac 终端配置
修改本地SSH配置文件,对所有连接生效。
- 编辑配置文件:
vim ~/.ssh/config - 添加以下核心参数:
Host:应用于所有主机。ServerAliveInterval 60:核心参数,客户端每隔60秒向服务器发送一次心跳包,保持连接活跃。ServerAliveCountMax 3:容错参数,若发送3次心跳包服务器均未响应,则断开连接,这意味着即使网络短暂波动,也有180秒的缓冲时间。
- 保存退出后,新建立的连接将自动应用此规则。
Windows PuTTY 工具配置
PuTTY是常用的SSH客户端,图形化设置更为直观。

- 打开PuTTY,进入
Connection选项卡。 - 找到
Sending of null packets to keep session active选项。 - 设置
Seconds between keepalives (0 to turn off)为60。 - 切记:返回
Session选项卡,点击Save保存配置,否则下次启动需重新设置。
移动端解决方案:Termius 与 JuiceSSH
对于需要在安卓设备上运维的用户,选择合适的APK至关重要。
- Termius:进入
Host列表,点击Edit,在SSH设置中找到Keep Alive选项并开启。 - JuiceSSH:进入连接设置,勾选
保持连接功能。 - 系统级设置:在安卓系统设置中,找到对应应用,关闭“电池优化”或设置为“无限制”,防止系统在后台杀掉进程,这是实现APK运行 保持 网络不断的关键步骤,若系统休眠导致APP暂停,任何客户端配置都将失效。
服务端配置方案:从根源杜绝断连
如果你拥有服务器控制权,直接在服务端配置全局保活策略,一劳永逸。
- 编辑配置文件:登录服务器,执行
sudo vim /etc/ssh/sshd_config。 - 添加保活参数:
ClientAliveInterval 120:服务器每120秒主动向客户端发送心跳探测。ClientAliveCountMax 3:若3次探测无响应,则断开连接。TCPKeepAlive yes:确保TCP层面的保活机制开启。
- 重启服务:执行
sudo systemctl restart sshd使配置生效。- 注意:服务端配置优先级高于客户端,两者同时配置可形成双重保险。
进阶方案:使用 Screen 或 Tmux 会话管理
即便网络断开,上述方案也无法100%保证连接不丢,使用终端复用工具是专业运维的标配,它能实现“断网不丢任务”。
- Screen 工具:
- 安装:
yum install screen或apt install screen。 - 创建会话:
screen -S mywork。 - 核心操作:按下
Ctrl+A+D,将会话放入后台(Detach),此时即使关闭终端或断网,服务器上的任务仍在运行。 - 恢复会话:重新连接SSH后,执行
screen -r mywork,瞬间回到断开前的工作界面。
- 安装:
- Tmux 工具:
- 功能比Screen更强大,支持分屏。
- 创建会话:
tmux new -s session_name。 - 脱离会话:
Ctrl+B然后按D。 - 恢复会话:
tmux attach -t session_name。
网络环境优化与排查
硬件与网络层面的稳定性同样不可忽视。

- DNS解析优化:有时断开是因为DNS解析延迟或失败,在客户端
/etc/hosts文件中直接绑定服务器IP,跳过DNS解析步骤。 - 更换端口:某些运营商会对22端口进行流量限制或干扰,修改SSH端口至高位端口(如22222或443),可减少运营商层面的干扰。
- Mosh 替代方案:对于网络极不稳定的移动环境,建议放弃SSH,改用Mosh,Mosh基于UDP协议,自带漫游功能,能在IP切换、网络抖动下保持会话不中断,是移动端运维的神器。
常见误区与注意事项
在实施过程中,需避免以下错误操作。
- 心跳间隔不宜过短:不要将
ServerAliveInterval设置为1秒或更短,过于频繁的心跳包会被防火墙识别为洪水攻击,反而导致IP被封禁,建议设置在30秒至120秒之间。 - 忽略权限问题:修改
/etc/ssh/sshd_config需要Root权限,修改后必须重启服务。 - 混淆客户端与服务端参数:客户端参数为
ServerAlive(关注服务器是否活着),服务端参数为ClientAlive(关注客户端是否活着),切勿混淆。
相关问答
为什么设置了SSH心跳包,连接还是会断开?
解答: 设置心跳包后依然断开,通常有三种原因,第一,心跳间隔设置过长,超过了中间路由器的超时时间,建议将时间缩短至30-60秒,第二,客户端被系统休眠策略限制,特别是在安卓或iOS设备上,必须确保APP在后台有运行权限,第三,服务器设置了ClientAliveCountMax且客户端响应超时,需检查服务器日志确认是否为服务端主动断开。
SSH连接断开后,正在运行的脚本会怎么样?
解答: 如果未使用Screen或Tmux等工具,SSH连接断开时,系统会向该会话下的所有子进程发送SIGHUP信号,导致正在运行的脚本或编译任务直接终止,数据可能丢失,这也是为什么强烈建议在执行长时间任务(如数据备份、代码编译)前,务必先创建Screen或Tmux会话,以确保任务与SSH会话解耦,持续运行。
如果您在SSH连接保持方面有独到的技巧或遇到过奇葩的断开情况,欢迎在评论区分享您的经验。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/115675.html