web-dev-qa-db-ja.com

sshでtcp-keepaliveはどのように機能しますか?

「ハートビート」を実行するためにssh接続を使用するシェルスクリプトをコーディングしようとしています。特定のタイムアウト後(接続が切断された後)に、その接続のクライアント側とサーバー側を終了したいと思います。

これまでに見つけたもの:

  • TCPKeepAliveyes/no sshおよびsshdの場合
  • ClientAliveCountMaxfor sshd
  • ClientAliveIntervalsshdの場合
  • ServerAliveCountMaxfor ssh
  • ServerAliveIntervalsshの場合

「ClientAliveCountMax」を変更するには、各ターゲットマシンのsshd_configを変更する必要があります(このオプションはデフォルトで無効になっています)。

だから私の質問は-私の目的にも「TCPKeepAlive」を使用できますか(ソース/ターゲットマシンで他に何も変更せずに)?

対象のオペレーティングシステムはSLES11 SP2ですが、ここでは関係ないと思います。

92
Nils

これには、おそらくServerAlive設定を使用する必要があります。サーバーでの設定は必要なく、必要に応じてコマンドラインで設定できます。

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

これにより、5秒ごとにsshキープアライブメッセージが送信されます。次のキープアライブを送信する時間になっても、最後のキープアライブへの応答が受信されなかった場合、接続は終了します。

ServerAliveIntervalTCPKeepAliveの重要な違いは、操作するレイヤーです。

  • TCPKeepAliveはTCPレイヤー上で動作します。空のTCP ACKパケットを送信します。これらのパケットを無視するようにファイアウォールを設定できます。アイドル接続をドロップするファイアウォールを通過すると、接続が維持されない可能性があります。
  • ServerAliveIntervalはsshレイヤーで動作します。実際にはsshを介してデータを送信するため、TCPパケットにはデータが暗号化されており、ファイアウォールはキープアライブか正当なパケットかを判別できないため、これらのパケットはより適切に機能します。
114
Patrick

TCPKeepAliveオプションは実際には、ClientAliveのようなオプションまたはServerAliveのようなオプションから接続を存続させる非常に異なる方法です。

BSD SSHマニュアルページ に基づいています。

クライアントアライブメッセージは暗号化されたチャネルを介して送信されるため、なりすましはできません。 TCPKeepAliveによって有効にされるTCPキープアライブオプションはスプーフィング可能です。クライアントアライブメカニズムは、クライアントまたはサーバーが接続がいつ非アクティブになったかを知ることに依存している場合に役立ちます。

TCPKeepAliveは、システムがTCPキープアライブメッセージを反対側に送信する必要があるかどうかを確認します。デフォルトのオプションは常に有効です。

ClientAliveIntervalを使用している場合は、TCPKeepAliveを無効にできます。このオプションは、暗号化されたチャネルを介してメッセージを送信し、クライアントからの応答を要求します(デフォルトは0なので、メッセージはクライアントに送信されません)。ClientAliveCountMaxは、sshdが切断するまでのクライアントアライブメッセージの数を設定しますセッションを終了することにより、クライアント。

7
kenorb