使用終端(XShell、secureCRT 或 MobaXterm 等)登錄 Linux 服務器之后如果有一段時間沒有進行交互,ssh 會話就會斷開
如果正在執行一些非后臺命令,ssh 會話斷開就可能會使得這些命令可能會被中斷,導致任務無法完成
那如何保持 ssh 會話不中斷呢?我們來看一下
為什么 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_time600[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_keepalive_probes9[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_keepalive_intvl75
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 120ServerAliveCountMax 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 端的配置
vim /etc/ssh/sshd_configTCPKeepAlive yesClientAliveInterval 120ClientAliveCountMax 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