配置保持 SSH 会话连接

status
Published
type
Post
slug
keep-ssh-session-alive
date
Jul 25, 2023
tags
Linux
Shell
Config
summary
SSH 会话中断与 TCP 超时有关。SSH 会话的中断可以通过配置 TCP 超时参数来延长超时时间。客户端的配置文件是~/.ssh/config,可以通过修改 ServerAliveInterval 和 ServerAliveCountMax 来保持 SSH 会话连接。服务端的配置文件是 /etc/ssh/sshd_config,可以通过修改 ClientAliveInterval 和 ClientAliveCountMax 来保持 SSH 会话连接。具体的超时时长和次数可以根据实际情况进行调整。配置完成后,需要重启 SSH 进程使配置生效。
日常与 Linux 系统打交道,SSH (Secure Shell) 是必然会用到的工具。但在使用中经常会遇到 SSH 会话中断的问题,这会导致命令运行失败/工作环境错误等问题,有时不得不重连从头再来。下面通过配置从而保持 SSH 会话

为什么 SSH 会话会中断

SSH 是基于 TCP 传输的 ,因此 SSH 会话的中断与 TCP 超时有关。
TCP 超时是指当TCP连接中的某个数据包在一定时间内未能收到确认时,系统会认为该数据包已丢失,因此会触发超时操作。这种情况通常发生在网络不稳定或拥塞的情况下,因为数据包可能会在传输过程中丢失或延迟到达目的地。当TCP超时发生时,TCP协议会尝试重新发送未确认的数据包,以确保数据的可靠传输。这是TCP协议的一项重要机制,它有助于确保数据在不可靠的网络环境中仍然能够可靠地传输。
在 Linux 中,TCP 超时相关配置即决定了 TCP 连接(网络活动)在被认为丢包或无响应前应该等待多长时间。其中主要涉及到三个关键系统参数如下:
  • tcp_keepalive_time
    • 系统发送第一个 keepalive 探测包的时间。当TCP连接处于ESTABLISHED状态且在该连接上没有任何数据交流的时间超过此值,系统就会自动发送keepalive探测包。默认值通常为7200秒。
  • tcp_keepalive_probes
    • 系统发送 keepalive 探测包的次数。当第一个探测包发送后,如果未收到响应,系统会发送此参数设置的次数的探测包。默认值通常为9次。
  • tcp_keepalive_intvl
    • 系统发送keepalive探测包的间隔时间。上一次探测包发送后,系统会等待此参数设置的时间再发送下一次探测包。默认值通常为75秒。
这几个参数的配置可通过如下命令查看
cat /proc/sys/net/ipv4/tcp_keepalive_time cat /proc/sys/net/ipv4/tcp_keepalive_probes cat /proc/sys/net/ipv4/tcp_keepalive_intvl
notion image
综合上述来说,当我们建立一个 SSH 会话后,没有在终端进行任何输入交互的话,在网络稳定的情况下最长超过 11 分钟(75 * 9 / 60)该会话就会因不活跃而被中断。
可以修改这些参数来延长超时时间,但因为这是系统全局配置,牵一发而动全身,故而不推荐,我们应该只针对 SSH 来进行配置。

配置保持 SSH 会话

  • 客户端(以 Debian 为例)
# 若 ~/.ssh 目录不存在,需先创建 mkdir ~/.ssh && chmod 700 ~/.ssh # 修改 SSH 配置文件 vim ~/.ssh/config
# ~/.ssh/config # Host * 表示配置应用于所有主机 Host * ServerAliveInterval 120 ServerAliveCountMax 15 TCPKeepAlive yes
  • ServerAliveInterval
    • 超时间隔(秒),在此间隔后,如果没有收到服务器的响应,SSH 将通过加密通道发送信息,请求服务器作出回应。默认值为 0,表示不会向服务器发送信息。
  • ServerAliveCountMax
    • 在 SSH 未收到服务器响应的情况下可发送的服务器存活信息的数量。如果在发送服务器存活信息时达到此阈值,SSH 将断开与服务器的连接,终止会话。默认值为 3。
按照上面的配置, SSH 客户端每 120 秒向服务器发送一次 keepalive 信息,最多发送 15 次,也就是说即使没有任何活动,此时 SSH 会话也能保持 30 分钟(120 * 15 / 60)。
 
  • 服务端
# 修改 SSH 服务配置 sudo vim /etc/ssh/sshd_config
notion image
关注其中这三项配置:TCPKeepAliveClientAliveIntervalClientAliveCountMax。如有则取消注释进行响应修改,如无则另行添加。
  • TCPKeepAlive
    • 指定系统是否应向客户端发送 TCP 保持信息。
  • ClientAliveInterval
    • 设置超时间隔(秒),在此间隔后,如果未收到客户端的响应,SSH 服务器将通过加密通道发送信息,请求客户端做出响应。默认值为 0,表示不会向客户端发送这些信息。
  • ClientAliveCountMax
    • 设置在 SSH 服务器没有从客户端接收到任何响应的情况下发送的客户端存活信息的数量。如果在发送客户端存活信息时达到此阈值,SSH 服务器将断开客户端连接,终止会话。默认值为 3。
这几项配置与客户端配置类似,SSH 服务器 也将保持连接 30 分钟。
修改完成,重启 SSH 进程
sudo systemctl restart ssh.service
 
具体的超时时长及次数配置均应视实际场景而调整,更多相关信息还需参阅相应的文档手册。