Ssh

tcp-keepalive 如何在 ssh 中工作?

  • December 11, 2016

我正在嘗試編寫一個使用 ssh 連接來執行“心跳”的 shell 腳本。我想在某個超時後(連接斷開後)終止該連接的客戶端和伺服器端。

到目前為止我發現了什麼:

  • sshsshd的TCPKeepAlive是/否
  • sshdClientAliveCountMax
  • sshdClientAliveInterval
  • sshServerAliveCountMax
  • sshServerAliveInterval

要更改“ClientAliveCountMax”,我必須修改每台目標機器上的 sshd_config(預設情況下禁用此選項)。

所以我的問題是——我是否也可以將“TCPKeepAlive”用於我的目的(無需更改源/目標機器上的任何其他內容)?

目標作業系統是 SLES11 SP2 - 但我認為這與此無關。

您可能希望為此使用 ServerAlive 設置。它們不需要在伺服器上進行任何配置,如果您願意,可以在命令行上進行設置。

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

這將每 5 秒發送一個 ssh keepalive 消息,如果到了發送另一個 keepalive 的時間,但沒有收到對最後一個的響應,則連接終止。

ServerAliveInterval和之間的關鍵區別在於TCPKeepAlive它們操作所在的層。

  • TCPKeepAlive執行在 TCP 層。它發送一個空的 TCP ACK 數據包。防火牆可以配置為忽略這些數據包,因此如果您通過丟棄空閒連接的防火牆,這些可能無法保持連接處於活動狀態。
  • ServerAliveInterval在 ssh 層上執行。它實際上會通過 ssh 發送數據,因此 TCP 數據包中包含加密數據,防火牆無法判斷它是保持活動狀態還是合法數據包,因此這些數據包工作得更好。

引用自:https://unix.stackexchange.com/questions/34004