WSの小屋

SSH 持久化连接

在使用 SSH 连接远程服务器时,经常会遇到连接一段时间后自动断开的问题。这是因为 SSH 客户端和服务端都有一个超时机制,当连接空闲超过一定时间后,会自动断开连接。

本文将介绍如何通过配置实现 SSH 连接的持久化,确保连接稳定不中断。

为什么要持久化

  • 日常开发:频繁连接远程服务器时,不需要反复输入密码
  • 长时间任务:在远程执行耗时任务(如编译、数据迁移)时不会中途断开
  • 端口转发:使用 SSH 隧道进行端口转发时,持久化连接能保证转发稳定
  • 自动化脚本:依赖 SSH 的自动化部署脚本不会因为连接中断而失败

配置方式

方式一:客户端配置(推荐)

在客户端配置 ServerAliveInterval,让客户端定期向服务端发送保活心跳。

# 编辑 SSH 客户端配置文件
vim ~/.ssh/config

添加以下内容:

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 5

参数说明:

  • ServerAliveInterval:客户端每隔 60 秒发送一次保活消息
  • ServerAliveCountMax:连续 5 次未收到响应后才断开连接(即 5 分钟无响应才断开)

如果只想对特定主机生效:

Host my-server
    HostName 192.168.1.100
    User root
    ServerAliveInterval 60

方式二:服务端配置

在服务端配置 ClientAliveInterval,让服务端检测客户端是否存活。

# 编辑 SSH 服务端配置文件
vim /etc/ssh/sshd_config

修改或添加:

ClientAliveInterval 60
ClientAliveCountMax 5

配置完成后重启 SSH 服务:

sudo systemctl restart sshd

两种方式对比

配置项 配置位置 优点 缺点
ServerAliveInterval 客户端 无需服务端权限,每个用户可自行配置 每个客户端都需要分别配置
ClientAliveInterval 服务端 一次配置对所有客户端生效 需要服务端 root 权限

进阶技巧

SSH 连接复用

利用 SSH 的 ControlMaster 功能,复用同一个连接,避免重复认证:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/controlmasters/%r@%h:%p
    ControlPersist 10m

这样在建立过一次连接后,10 分钟内再次连接会复用已有连接,无需重新输入密码。

排查连接断开的问题

如果配置后仍然断开,可以检查以下方面:

  1. 防火墙/NAT:网络中间的防火墙可能强制断开空闲连接
  2. 网络稳定性:使用 ping -i 10 server_ip 测试网络稳定性
  3. SSH 日志:使用 ssh -vvv user@host 查看详细连接日志

总结

通过配置 ServerAliveIntervalClientAliveInterval,可以轻松实现 SSH 连接的持久化。推荐优先使用客户端配置方式,灵活性更高。对于更高级的需求,可以结合 ControlMaster 实现连接复用,进一步提升 SSH 使用体验。

Comments | 0条评论