SSHセッションがフリーズしないようにするにはどうすればよいですか?


66

私が持っているServerAliveIntervalと数台のマシンの場合にも、ClientAliveInterval(私は良いアイデアではないでしょう以上のものに設定すると仮定)SSHクライアント/サーバ構成ファイルで540に設定してください。現在、数分後にフリーズする多くのSSHセッションを使用しています。

どうすれば修正できますか?私が欲しいのは、セッションをまったくフリーズしないようにすることです。たとえば、8でセッションを開いて4時間使用しない場合、再度ログインせずに12で再び使用するためです。


現在、どのくらいの時間ログインし続けることができますか(これはネットワークの切断によるものではないと仮定して)?TCPKeepAlive yes
-iyrin

よくわかりませんが、10分です。せいぜい。としてTCPKeepAlive yes-マシンに依存します。
シンタグマ

11
ただ、使用モッシュを
Vi。

1
または、使用できますautossh...
ThoriumBR

接続を4時間開いたままにしておくことはセキュリティ上の懸念であり、screen代わりに使用する必要があります。しかし、1〜2分後に同じ問題が発生しているため、私はまだあなたの質問を支持しています。
デール・アンダーソン

回答:


80

あなたが行った変更/etc/ssh/ssh_config/etc/ssh/sshd_config正しいですが、まだ何の効果もありません。

構成を機能させるには、クライアントでこれらの構成を変更します。

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval クライアントは、100秒ごとにヌルパケットをサーバーに送信して、接続を維持します。

NULLパケット は、サーバーからクライアントに送信されます。同じパケットがクライアントからサーバーに送信されます。サーバーはクライアントからの応答を必要としないため、TCP NULLパケットにはSYN、ACK、FINなどの制御フラグは含まれません。NULLパケットについては、https//tools.ietf.org/html/rfc6592で説明しています

次に、サーバーでsshdパーツを構成します。

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveIntervalサーバーは、接続を維持するためにクライアントにnullパケットを送信する前に60秒待機します

TCPKeepAlive特定のファイアウォールがアイドル接続をドロップしないようにするためにあります。

ClientAliveCountMaxサーバーは、クライアントからメッセージを受信して​​いない場合でも、クライアントにアライブメッセージを送信します。

最後に ssh server

service ssh restart または、 service sshd restart使用しているシステムによって異なります。


ServerAliveCountMaxこれを可能な限り信頼できるものにするためには、高い値も必要だと思います。そして、両方ServerAliveIntervalClientAliveIntervalが十分に低く設定されている場合、が必要になるとは思いませんTCPKeepAlive。さらに、ミドルボックスがある場合、前述のすべての設定が正確に構成されていても、ミドルボックスの状態が失われる可能性があります。MPTCPを使用すると役立つ場合があります(クライアントとサーバーの両方がサポートしている場合)。
カスペルド

クライアント側で構成するのかサーバー側で構成するのかは、最初は明確ではありません(最終的にはクライアント側)。次に、ServerAliveIntervalの説明で、「クライアントはサーバーに送信します...」と言いますが、次の段落では「サーバーからクライアントにNULLパケットが送信されます」。これらは少しわかりにくいです。
クレイグマックイーン

1
サーバーに追加すると、次のようになります:/ etc / ssh / ssh_config:行57:悪い構成オプション:clientaliveinterval / etc / ssh / ssh_config:行59:悪い構成オプション:clientalivecountmax
Anders

2
ので@Andersあなたはエラーを取得ClientAliveIntervalし、ClientAliveCountMaxSSHサーバーのオプションがあるので、のためのもの、sshd_configとないssh_config
バレンティンBajrami

1
@chandreshする必要はありません。ssh_config新しいセッションを変更すると、そのファイルが読み取られます。/etc/environmentファイルは、の形式を持つ別のものですVAR="value" ので、スペースなしはVAR = "value"無効になります。ソーシング/etc/ssh/ssh_configそのようにして読んすなわちします:Port 22またはHost * コマンドとしてこれらを扱うなる
バレンティンBajrami

13

個人的な提案:screenリモートホストでの使用。端末内でアクティブである限り、接続を維持し続けます。

/etc/screenrcスクリーンセッションをすばやく識別するために通常追加するものは次のとおりです。

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

編集:ヒント。

hardstatus文字列は、この一つとして、下のステータス行が表示されます: 3つのタブを開いた画面セッションの例

スクロールバックバッファーも、通常の1000-1500ではなく8192行に拡張されます(ディストリビューションに応じて)。


ありがとう、2つの質問:1. screenrcファイルのオプションについて説明してください。ログイン直後にシステムを起動画面/ tmuxに設定するにはどうすればよいですか?
シンタグマ

8
明確にするために、screenssh接続を維持しません。接続するユーザー端末にssh依存しない仮想端末でプロセスを実行するため、プロセスは接続に依存しません。ssh解決されるまで接続は失われます。
-iyrin

1
接続を維持する」ということは、基本的に「接続がアイドル状態になるのを防ぐことを意味し、同じ結果になります。4時間入力がない場合、SSH アイドル状態になり、最終的に接続を閉じます。すべての子プロセスも失われます。

2
私が愛している限りscreen、私は新しいユーザーから始めることを勧めますtmux
-dotancohen

2

OpenSSHの場合:

有効にする必要があります

TCPKeepAlive yes

クライアントのssh_config(/etc/ssh/ssh_configまたは~/.ssh/config)とOpenSSHを実行している宛先SSHサーバー(/ etc / ssh / sshd_configなど)の両方。

接続がアイドルになるたびに、OpenSSHは宛先ホストにダミーパケットを送信します...


これにより、接続がダウンすることがありますThe default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. linux.die.net/man/5/sshd_config
iyrin

正直なところ、"[…] network goes down […] client host crashes […] route is down […]"SSH構成ではキャッチできない重大なエラーです。ここでの主な問題は、ネットワーク障害ではなく、アイドル状態のSSHセッションです。したがって、要約すると:- TCPKeepAlive yesサーバーとクライアントの両方で有効になります。-設定ClientAliveInterval 設定-サーバー上のIdleTimeoutサーバー上で-セットClientAliveCountMax トリックを行う必要があります...
マーティンAllert

2

問題が休止状態のラップトップまたは完全ではないネットワーク接続である場合、moshどちらが実行されssh、自動再接続を許可するかを使用することをお勧めします。

ウェブサイトから:

モッシュ(モバイルシェル)

ローミングを可能にし、断続的な接続をサポートし、ユーザーのキーストロークのインテリジェントなローカルエコーとライン編集を提供するリモートターミナルアプリケーション。

MoshはSSHの代替品です。特にWi-Fi、セルラー、および長距離リンクを介した、より堅牢で応答性に優れています。

Moshは、GNU / Linux、BSD、macOS、Solaris、Android、Chrome、およびiOSで利用できるフリーソフトウェアです。

tmux(または古いscreen)と組み合わせて、これによりssh、ラップトップからサーバーに接続し、wifi接続を変更してモバイルデータのドロップアウトが残っている場合でも数日間接続したままにすることができます。


ここにmosh.orgGithubの
mosh

1

ホストマシン上のsshdの設定を確認/etc/sshd_configするためにIdleTimeout設定

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.