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


85

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

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

  • sshおよびsshdのTCPKeepAlive yes / no
  • ClientAliveCountMaxSSHD
  • ClientAliveIntervalSSHD
  • ServerAliveCountMaxのためのssh
  • ServerAliveIntervalのためのssh

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

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

ターゲットオペレーティングシステムはSLES11 SP2です。しかし、ここでは関係ないと思います。


これらのパラメータはすべて、接続に沿ったファイアウォールまたは中間デバイスが接続を終了する状況を対象としています。これらのパラメーターは、定期的なデータを送信して接続を維持し、Xの未解決の応答がある場合に接続をシャットダウンするためのものです。あなたがしていることについてもう少し詳しく教えてもらえますか?ControlMasterオプションとスレーブ接続を使用していますか?
パトリック

いくつかの物理回線で複数のsshネットワーク接続を使用して、別のノードが「ダウン」しているかどうかを判断する手段を構築したいだけです。これを行うには、ssh-sessionを開きます(多かれ少なかれ無限ループを実行します)。接続が切断された場合、そのセッションを終了させたい。TCPKeepaliveの間隔/カウントはどうなっているのでしょうか。
ニルス

回答:


104

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

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

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

決定的な違いServerAliveIntervalとはTCPKeepAlive、彼らがで動作層です。

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

1
これが正しい方向だと思います。最初のテストでは、これが機能することが示されています-接続が切断されてから5秒以内にssh / sshdサブプロセスの送受信が終了します。TCPKeepaliveは単にTCP-stack-defaultsを使用するだけだと思います-そのため、設定も難しくなります。
ニルス

これにより、ゴーストユーザーの問題も解決されます。これはPuTTY設定でも実行でき、Seconds between keepalives[設定]の[1800]に変更できます。接続。
ボブスタイン

7

このTCPKeepAliveオプションは、実際には、ClientAliveライクまたはServerAliveライクのオプションから接続を維持するための非常に異なる方法です。

あたりにあるBSD SSHのマニュアルページ、我々はそれを読むことができます:

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

TCPKeepAliveシステムは、他の側にTCPキープアライブメッセージを送信すべきかどうかを確認してください。デフォルトのオプションは常に有効になっています。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.