Ssh
tcp-keepalive 如何在 ssh 中工作?
我正在嘗試編寫一個使用 ssh 連接來執行“心跳”的 shell 腳本。我想在某個超時後(連接斷開後)終止該連接的客戶端和伺服器端。
到目前為止我發現了什麼:
- ssh和sshd的TCPKeepAlive是/否
- sshd的ClientAliveCountMax
- sshd的ClientAliveInterval
- ssh的ServerAliveCountMax
- ssh的ServerAliveInterval
要更改“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 數據包中包含加密數據,防火牆無法判斷它是保持活動狀態還是合法數據包,因此這些數據包工作得更好。