sshd_configの `ServerAliveInterval`と` ClientAliveInterval`のオプションは正確に何ですか?


161

私が見つかりました。この質問を、私は、私は非常に二つの変数の設定を理解していないごめんなさいServerAliveIntervalClientAliveInterval受け入れられた応答で述べました。ローカルサーバーがタイムアウトした場合、この値をゼロに設定する必要がありますか?タイムアウトすることはありませんか?代わりに300秒に設定する必要がありますか?

私の質問は、単純に、応答でラップトップをサスペンドしてからサスペンドを解除すると接続がタイムアウトするWrite failed: Broken pipeものとそうでないものがあります。壊れたパイプで失敗しないようにローカルsshdを正しく構成するにはどうすればよいですか?

回答:


202

ServerAliveIntervalクライアントがサーバーにnullパケットを送信する前に待機する秒数(接続を維持するため)。

ClientAliveIntervalサーバーがクライアントにnullパケットを送信する前に待機する秒数(接続を維持するため)。

値を0(デフォルト)に設定すると、これらの機能が無効になるため、アイドル状態が長すぎると接続が切断される可能性があります。

ServerAliveIntervalは、接続を維持するための最も一般的な戦略のようです。パイプの破損の問題を防ぐために、.ssh / configファイルで使用するssh構成を以下に示します。

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

上記の設定は次のように機能します。

  1. クライアントは60秒間(ServerAliveInterval時間)アイドル状態になり、「no-op nullパケット」をサーバーに送信して応答を待ちます。応答がない場合、上記のプロセスを10(ServerAliveCountMax)回(600秒)まで試行し続けます。それでもサーバーが応答しない場合、クライアントはssh接続を切断します。

サーバー側のClientAliveCountMaxも役立つ場合があります。これは、クライアントが切断される前に無応答のままでいられる時間の制限です。3つのClientAliveIntervalのように、デフォルト値は3です。


OK、だから私はゼロ秒を解釈して「生き続けない」ことを意味するだろう。それがなぜクライアント/サーバーをポーリングしないのか?
M. Tibbits

3
yup 0 = nullパケットを送信しません。別の違いは、ServerAliveIntervalがクライアント構成で設定され、ClientAliveInternalがサーバー構成で設定されることです。
バーセレミー

8
これは、タイムアウトが原因のアイドル状態を防ぐための良いアドバイスのように思えますが、クライアントが中断したときにパイプの破損を防ぐというOPの質問にどのように関係するのかわかりません。スリープ状態のとき、クライアントはnullパケットを送信できません。したがって、この設定は確かに意味がありませんか?
スパラフーク

ServerAliveの部分は確かです。ClientAliveInterval / ClientAliveCountMaxは、ここで役立つものです。
javawizard 14

1
この古い答えを振り返ってみると、タイトルの質問ではなく2番目の段落の質問に回答したと思うので、ServerAliveInternalに関するコメントはサスペンドに役立たないことに同意します。@JonasWielicki ClientAliveIntervalは、中断されたクライアントがサーバーに応答せず、最終的にClientAliveCountMaxの後にサーバーがクライアントを切断するため、中断の場合に悪い可能性があります。
バルテルミー島

18

これはsshd_configマニュアルman sshd_config)で説明されています

ClientAliveInterval

クライアントからデータを受信しなかった場合、sshdが暗号化されたチャネルを介してメッセージを送信し、クライアントからの応答を要求するまでのタイムアウト間隔を秒単位で設定します。デフォルトは0で、これらのメッセージがクライアントに送信されないことを示します。このオプションは、プロトコルバージョン2にのみ適用されます。

ClientAliveCountMax

デフォルト値は3です。ClientAliveInterval(下記を参照)が15に設定さClientAliveCountMaxれ、デフォルトのままになっている場合、応答しないSSHクライアントは約45秒後に切断されます。このオプションは、プロトコルバージョン2にのみ適用されます。

クライアントオプションについては、次の説明を参照してくださいman ssh_config

ServerAliveInterval

サーバーからデータを受信して​​いない場合ssh、暗号化されたチャネルを介してメッセージを送信し、サーバーからの応答を要求するまでのタイムアウト間隔を秒単位で設定します。デフォルトは0で、これらのメッセージがサーバーに送信されないことを示します。このオプションは、プロトコルバージョン2にのみ適用されます。

ServerAliveCountMax

デフォルト値は3です。たとえば、ServerAliveInterval15に設定さServerAliveCountMaxれ、デフォルトのままにすると、サーバーが応答しなくなると、ssh約45秒後に切断されます。このオプションは、プロトコルバージョン2にのみ適用されます。

上記に基づき、0は無効であることを意味します。したがって、これらの値は、パイプ破損エラーを回避するのに十分高い値に設定する必要があります。


役立つ投稿。しかし、私はこれにとてもイライラしています。私はあちこちで大きな間隔を設定していますが、ほんの数分後に接続が切断されます。(Ubuntuの上でのOpenSSHを使用して、わからないことは、関連性の場合)
シュリダールSarnobat

1
@ user7000クライアント(ssh)とサーバー(sshd)の両方を構成します。これは役立つかもしれません:「SSH接続がリモートエンドによって予期せず閉じられました」の問題を修正する方法
ケノーブ

私はどこかに来ていると思います。ServerAliveInterval設定ファイルにスペースを入れていなかったのかもしれません。
スリダールサルノバト

16

Barthelemyからの回答はクールですが、実際には問題の根本には到達しません。マシンをサスペンドし、コンピューターを起動したときにSSHセッションがまだ生きているようにします。

sshには、そのような接続を維持するような構成はありません。SSHはTCPを使用します。最初に、3ウェイハンドシェイクが必要で、しばらくアイドル状態が続いても生き続けます。シャットダウン/休止状態にすると、すべてのTCP接続がFINで閉じられます。それを克服する方法はありません。

汚い回避策として、VPSまたはスクリーン付きの別のオンラインボックスを使用して接続を維持できます。私のアドバイスでは、セキュリティ上の理由からそうしていません。


1
これは実際、質問に対する唯一の回答です。
カリモ14年

1
これは実際、ひどいセキュリティソリューションです。
-jahrichie

14

一端が受信パケットへのACKの送信を停止すると、SSH接続(TCP)が生き続けることを保証できないため、個人的にhttp://www.harding.motd.ca/autossh/を使用してすべてのSSH接続を再起動します停止を解除するとすぐに。

GNU Screenはサーバー側で使用されるため、再接続すると以前の状態に戻ります。

追加のポートでリッスンして、接続がまだ生きているかどうかを継続的にチェックすることができますが、個人的には、無効にしてSSH自身のServerAliveInterval/に依存するだけで十分に機能することがわかりServerAliveCountMaxます

別のオプションはhttp://mosh.mit.edu/ですこれはUDPを使用し、長期間の接続の欠如からシームレスに回復します。


5

nohupSSH接続に関係なくコマンドを実行する場合は、コマンドを実行することもできます。

例えば

$ nohup tar -xzf some_huge.tar.gz &

これ&は必要ではないと思いますが、プロセスがバックグラウンドで実行されるため、他のことができるので便利です。

しばらく時間がかかるプロセスには常にnohupを使用するため、何らかの理由で接続が失われた場合に最初からやり直す必要はありません。


zshのnohupは正しく動作しないことに注意してください!
スリダールサルノバト

@ user7000それについて何が不適切ですか?
バトル

覚えていないが、基本的にはクライアントが切断された後にプロセスを実行し続けなかったと思う。それは数年前で、nohupの使用をやめて、代わりにdisownを使用しました。
スリダールサルノバト

2
問題がその後修正されない限り、zshユーザーはのdisown -h代わりに固執する必要があると思いますnohup
バトルバットス

0

長時間実行されるセッションを画面内に配置詳細については、画面-hを参照

そうすれば、sshを使用してマシンに再接続し、スクリーンセッションに再接続できます。


スクリーンを提案する人々の何パーセントが実際に自分でそれを使用しているのだろうか。
シュリダールSarnobat

tmuxの方が良いと思います。コードの変更日をgithub.com/tmux/tmux vs git.savannah.gnu.org/cgit/screen.git/log
Suhaib
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.