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

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

「ハートビート」を実行するためにSSH接続を使用するシェルスクリプトを作成しようとしています。特定のタイムアウト後(接続が失われた後)、クライアントとサーバー側の接続を終了したいと思います。

これまで私が見つけたもの:

  • TCP接続の維持はい/いいえSSHそしてSSHD
  • 生きているクライアントの最大数~のためSSHD
  • クライアントアクティビティ間隔~のためSSHD
  • サーバーの最大アクティビティ数~のためSSH
  • サーバー活動間隔~のためSSH

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

だから私の質問は - "TCPKeepAlive"を使用して私の目的を達成することができますか?

対象OSはSLES11 SP2ですが、それとは関係ないと思います。

答え1

これにはServerAlive設定を使用できます。サーバーで構成する必要はなく、必要に応じてコマンドラインで設定できます。

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

これにより、5秒ごとにSSH Keepaliveメッセージが送信されます。別のKeepaliveメッセージを送信する必要がありますが、最後のKeepaliveへの応答が受信されない場合、接続は終了します。

ServerAliveIntervalとの主な違いは、機能TCPKeepAliveする階層です。

  • TCPKeepAliveTCP層で実行されます。空の TCP ACK パケットを送信します。これらのパケットを無視するようにファイアウォールを構成できるため、アイドル接続を破棄するファイアウォールを通過すると、これらのパケットが接続をアクティブに保つことができない可能性があります。
  • ServerAliveIntervalSSH層で実行されます。実際にはSSHを介してデータを送信するため、TCPパケットには暗号化されたデータが含まれており、ファイアウォールはそれがKeepaliveパケットであるか正当なパケットであるかを知ることができないため、これはうまく機能します。

答え2

このTCPKeepAliveオプションは、実際に ClientAlive や ServerAlive などのオプションとの接続を維持する非常に異なる方法です。

両方押してくださいBSD SSH マニュアルページ、私達は次を読むことができます:

クライアントアクティビティメッセージは、偽装できないように暗号化されたチャネルを介して送信されます。アクティブなTCP接続を維持するオプションTCPKeepAliveはなりすまし可能です。クライアント側のアクティブメカニズムは、クライアントまたはサーバーが接続が無効になるタイミングを知る必要がある場合に便利です。

TCPKeepAliveシステムが相手にTCPキープアライブメッセージを送信するかどうかを決定します。デフォルトオプションは常に有効です。

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

関連情報