如何保持SSH 會話不中斷?

2023.09.14

如何保持SSH 會話不中斷?


在空閒TCP 連接上發送TCP keepalive 探針的間隔時間,即使在沒有實際數據傳輸的情況下。TCP keepalive 探針用於檢測遠程主機是否仍然存活和響應

哈嘍大家好,我是鹹魚

不知道小伙伴們有沒有遇到過下面的情況:

使用終端(XShell、secureCRT 或MobaXterm 等)登錄Linux 服務器之後如果有一段時間沒有進行交互,SSH 會話就會斷開

如果正在執行一些非後台命令,SSH 會話斷開就可能會使得這些命令可能會被中斷,導致任務無法完成

那如何保持SSH 會話不中斷呢?我們來看一下

原文鏈接:https://linuxiac.com/how-to-keep-ssh-session-alive/

為什麼SSH 會關閉連接

簡短的回答是,這一切都歸結為TCP 超時

TCP 超時時間是指TCP 連接或網絡操作在認為進程失敗之前等待響應的時間

在Linux 中,TCP 超時時間設置確定了TCP 連接或操作在丟包或者連接無響應前應該等待多長時間

TCP 超時機制確保了網絡通信的可靠性和效率

在保持SSH 會話的情況下,有三個關鍵的系統參數我們需要注意:

  • tcp_keepalive_time:在空閒TCP 連接上發送TCP keepalive 探針的間隔時間,即使在沒有實際數據傳輸的情況下。TCP keepalive 探針用於檢測遠程主機是否仍然存活和響應
  • tcp_keepalive_probes:TCP keepalive 探針,由TCP 端發送的數據包,用於檢查空閒連接中遠端的運行狀況和響應性。有助於檢測遠程主機是否變得不可訪問,或者連接是否由於網絡問題而丟失
  • tcp_keepalive_intvl:控制發送空閒TCP 連接的keepalive 探針的時間間隔

我們可以通過下面的命令來查看上面三個參數的值:

tcp_keepalive_time 為600 表示保持TCP 連接時間為600s 或10 分鐘,但是這並不意味著我們的SSH 會話就真的會保持10 分鐘

因為tcp_keepalive_probes 為9 和tcp_keepalive_intvl 為75 表示系統會每隔75s 發送9 個探測包(總計675 s),之後會話將會被視為失敗然後關閉

也就是說,在675s 後,SSH 會話將在不活動時終止,即沒有在終端中輸入內容

如何保持SSH 會話

保持SSH 會話是一個涉及client 和server 配置的過程

Linux client 配置

對於Linux client ,我們在家目錄下修改~/.ssh/config 文件(如果沒有就創建)

vim  ~/.ssh/config
  • 1.

下面是配置

Host *
ServerAliveInterval 120
ServerAliveCountMax 30
  • 1.
  • 2.
  • 3.

  • Host:配置僅對“Host” 關鍵字後面列出的主機生效。由於使用了通配符(*),因此它們適用於所有主機
  • ServerAliveInterval:設置超時間隔(以秒為單位),如果沒有從server 接收到數據,SSH 將通過加密通道發送消息,請求server 響應。默認值為0,表示不會將這些消息發送到server
  • ServerAliveCountMax:設置在SSH 沒有收到任何消息的情況下向server 發送keepalive 消息的數量。如果達到了該閾值,SSH 將斷開與server 的連接,終止會話(默認值為3)

表示client 每120s 向server 發送keepalive 消息,一共發送30 次,也就是120 * 30 = 3600 s(一個小時),在這一個小時內SSH 會話會一直保持

Windows client 配置

對於Windows 而言,我們一般使用終端來訪問server

以secureCRT 為例

選項——>會話選項

圖片圖片

然後點擊【終端】

圖片圖片

Linux server 配置

上面介紹的是client 端的配置,我們接下來介紹server 端的配置

修改/etc/ssh/sshd_config 文件

vim /etc/ssh/sshd_config
  • 1.

TCPKeepAlive yes
ClientAliveInterval 120 
ClientAliveCountMax 30
  • 1.
  • 2.
  • 3.

  • TCPKeepAlive:是否應該向client 發送TCP keepalive 信息
  • ClientAliveInterval:設置超時間隔(以秒為單位),如果沒有從client 接收到數據,SSH 將通過加密通道發送消息,請求client 響應。默認值為0,表示不會將這些消息發送到client
  • ClientAliveCountMax:設置在SSH 沒有收到任何消息的情況下向client 發送keepalive 消息的數量。如果達到了該閾值,SSH 將斷開與client 的連接,終止會話(默認值為3)

與前面講到的Linux client 配置一樣,server 將保持SSH 會話一個小時(120 * 30 = 3600s)

配置之後重啟SSH 服務

systemctl restart sshd