SSHでAWSやconohaのVPSに接続している際に、一定期間何もしないとタイムアウトで自動的に接続が切れる。
そのたびに何度も再接続するのは手間が掛かるので自動的に切断されないようにする設定です。
自動切断の原因
もともとSSHは接続を持続するように設計されているのですが、SSHでクライアントからサーバーに接続している経路上に存在するルーターやファイヤーウォールが一定時間通信のないコネクションを切断してしまうことにより、SSHの自動切断という現象が起こります。
つまり、SSHの自動切断の原因はルーターやファイヤーウォールです。しかし一定時間通信のないコネクションを切断するというのはいたって正常な行為であり、SSHの自動切断を防止するには一定期間で定期的に通信を行えば自動切断を回避できます。
対策
対策方法は2通りあります。どちらの対策を行ってもSSHの自動切断が回避可能です。
SSHサーバー側での対策
SSHには「ClientAliveInterval」と「ClientAliveCountMax 」という設定値があり、設定された秒数ごとに応答確認を行い、応答が無い場合は自動的にタイムアウトで切断するという機能があります。この機能をSSHの自動切断回避に利用します。
それぞれの機能の詳細です。
- 「ClientAliveInterval」:ここで指定した秒数ごとに応答確認を行う。
- 「ClientAliveCountMax 」:応答確認を行う回数。
何も設定しない場合のデフォルト値は以下の通りです。
- 「ClientAliveInterval」のデフォルト値:0(※0だと何もしない)
- 「ClientAliveCountMax 」のデフォルト値:3
つまり、何も設定していない場合は応答確認を行わず、その結果SSHの接続が切れてしまうので以下の設定をSSHの設定ファイルに追加します。
1 |
# vi /etc/ssh/sshd_config |
1 2 |
ClientAliveInterval 120 ClientAliveCountMax 3 |
追加したらSSHを再起動します。
1 |
# systemctl restart sshd |
これでOKです。
今後は120秒ごとに応答確認の通信を行いますのでクライアント側からSSHを切断しない限りタイムアウトにはならずに接続は維持されます。
もし何かしらの原因によりネットワークが切断されてしまった場合などでも、3回繰り返して応答が無ければ自動切断してくれるのでSSHの「ゴーストユーザー」が残る事もなく安心です。
SSHクライアント側での対策
SSH接続で利用するターミナルソフトの簡単な設定でSSHの自動切断を回避することができます。
PuTTYでの設定方法
メニューの「Connection」をクリックし、「Options controlling the conection」画面を開きます。
「Sending of null packets to keep session active」の「 Seconds between keepalive (0 to turn off)」の値をデフォルトの「0」から任意の値(120など)に変更して「Open」をクリックして接続します。
Tera Termでの設定方法
メニューの「設定」→「SSH」を開きます。
ハートビート(keep-alive)の秒数を設定して「OK」をクリックします。(デフォルト値:60)
メニューの「設定」→「設定の保存」をで設定した内容を保存します。
RLoginでの設定方法
「Server Select」から選択してサーバーを「編集」をクリック。(※新規サーバーの場合は[新規(N)]をクリック)
「プロトコル」→「SSH」の「KeepAliveパケットの送信間隔(sec)」にチェックを入れて秒数を設定して「OK」をクリックします。(デフォルト値:300)
まとめ
SSH接続の自動切断を防止する際は、SSHサーバーの設定変更が可能ならば設定ファイル(/etc/ssh/sshd_config)を編集してSSHサーバー再起動。
SSHサーバーの設定を変更できないなら利用しているターミナルソフトの設定変更で対応。
以上で解決です。