如何保持 SSH 對談不中斷?

2023-09-11 21:01:04

哈嘍大家好,我是鹹魚

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

使用終端(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 探針的時間間隔

我們可以通過下面的命令來檢視上面三個引數的值:

[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_keepalive_time
600

[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9

[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75

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

下面是設定

Host *
ServerAliveInterval 120
ServerAliveCountMax 30
  • 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
TCPKeepAlive yes
ClientAliveInterval 120 
ClientAliveCountMax 30
  • 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