私のUbuntu Linuxサーバーファイルの設定/etc/ssh/sshd_config
は次のとおりです。
ClientAliveInterval 60
ClientAliveCountMax 60
私は、接続を維持するためにサーバーが60秒間隔で60個の空のパケットを送信したとします。接続はアクティブのままですが、無限の時間保持され、1時間ほど経過しても接続が切断されません。
私は1時間20分間活動がない後に試してみましたが(何も入力せずにSSHターミナルを開いたままにしています)、まだ残っています。
何が問題なのでしょうか?
答え1
「1時間20分間活動がない」を意味する場合
- ユーザーは1時間20分間シェルに入力しませんでした。
- または、ユーザーが
ssh -N …
1時間20分前に使用したか - 一般的な状況:データ転送なしで1時間20分
このメカニズムの場合、非アクティブ状態は重要ではありませんClientAlive*
。
これを理解するために、ClientAlive*
強固な観点からすでに存在する接続に何が起こる可能性があるかを分析しますsshd
。
- クライアントは正常に切断できます。この場合、サーバーは接続が終了したと
ssh
判断します。sshd
- 実行可能ファイルは
ssh
何らかの理由で(強制終了など)予期せず終了する可能性があるため、切断の意図を渡すことはできません。まだクライアントオペレーティングシステムはTCP接続を正常に閉じることができます。したがって、sshd
接続がもう存在しないことを認識します。 - 何らかの理由で(たとえば、ネットワークケーブルの取り外しによって)、クライアントコンピュータ全体がシャットダウンまたは消えます。
sshd
転送するデータがないため、クライアントが沈黙しているのか、それとももはや存在しないためにクライアントが沈黙しているのか、今はわかる方法はありません。
このClientAlive*
メカニズムは最後のケースを検出します。サーバーはクライアントアクティビティメッセージを送信し、クライアントは応答します(クライアントがある場合)。時々こんな感じ自動的にSSHプロトコルで。 SSHを送信手段として使用するアプリケーションは、影響を受けたり妨げられたりしません。
ClientAliveInterval
使用する設定は、ClientAliveCountMax
サーバーが要求する頻度と接続が終了したと見なす前に応答しない試行回数を構成します。
ServerAliveInterval
との助けを借りて、クライアントは同様の方法で切断された接続を検出できますServerAliveCountMax
。
TCP接続のためのより一般的なメカニズム(SSHに限定されない)もあります:TCP keepalives。比較する私の答え。
あらゆる種類のKeepaliveパケットを使用すると、接続エンドポイントで接続が期限切れになったかどうかを検出できます。また、それらの間の接続を「更新」します。たとえば、NATを使用しているホームルータは、長い間その接続に属するパケットを見ることができない場合、接続が切断されたと認識することがあります。これが発生すると、NATエントリが忘れられ、最終的に接続が有効になると、ルータはそれを正しく処理できなくなります。比較するこの回答。
ssh
何も入力せずにSSH端末を開くと、サーバーによって生成されたクライアントアクティビティメッセージへの応答はブロックされません。顧客がいる場合、顧客は応答します。
しばらくシェルと対話していないユーザーをログアウトするには、TMOUT
シェル:または同様の変数(シェルに応じて)の助けが必要です。ただし、ユーザーは再構成できます。彼らシェル。
ClientAlive*
このメカニズムを代替として考慮するいくつかのガイドがインターネットにありますTMOUT
。今、あなたはこれが異なることを知っています。
OSがユーザー「非アクティブ」(たとえば、新しいプロセスが作成されていない、sshd
実行中、またはbash
そのポイントを通過するデータがない)を検出する方法があります。私はその事実を知っていても、SSH接続を終了するために使用しません。バラより非アクティブ。
ユーザーがSSH経由でポート転送を要求した場合はどうなりますか?転送されたポートへの接続はいつでも着信できます。ポートを使用したいアプリケーションは、転送が含まれていることを知らずに何でも構いません。ユーザーは、SSH を使用して接続が発生するまで自動的に待機したい場合があります。トラフィックがないため、SSH接続を終了するIMOは良い習慣ではありません。クライアントがクライアント活動メッセージに応答している間は、接続を維持する必要があります。
お客様の例では、お客様が回答しました。
修正する
2023では、OpenSSHChannelTimeout
でUnusedConnectionTimeout
利用可能なオプションが導入されましたsshd_config
。これらのオプションはあなたに必要なものです。バラより私の他の答えもっと学ぶ。