Edited at

SSHのタイムアウト防止策

More than 1 year has passed since last update.


環境


SSHサーバ


  • CentOS 7.4

  • OpenSSH 7.4p1


SSHクライアント


  • MacOS High Sierra 10.13

  • OpenSSH 7.6p1


問題:SSHでしばしば接続が切断される(タイムアウト)

SSH接続してしばらく放置していると、介在するルータやファイアウォール等により一定期間通信のない接続が以下のようなメッセージと共に切断されてしまう。

設定によっては数分で切断されるため、非常に煩わしい。。。

... Connection reset by peer Connection to example.com closed.

(正確には通信断されてからしばらくするとクライアント側で上記メッセージが表示されている模様)


タイムアウトを回避する方法


  1. ルータ等の設定を変更する

  2. サーバ側またはクライアント側で定期的な接続応答確認を行うよう設定する(OpenSSHの場合)

  3. クライアント側から無害なパケットを定期的に送信する


タイムアウト回避方法詳細


1. ルータ等の設定を変更する

割愛

これが可能かつ望ましい方法となり得る場合はこちらをどうぞ



2. サーバ側またはクライアント側で定期的な接続応答確認を行うよう設定する

OpenSSHの場合、サーバ側で以下を設定するか、


/etc/ssh/sshd_config

ClientAliveInterval [秒数]

ClientAliveCountMax [回数]

クライアント側で以下をいずれかの設定ファイル1にて設定することで応答確認を行うようにすると切断されなくなる。


/etc/ssh/ssh_config または ~/.ssh/config

ServerAliveInterval [秒数]

ServerAliveCountMax [回数]

上記の設定後はsshサービスの再起動をお忘れなく。

CentOS7の場合

$ systemctl restart sshd

MacOS 10.13の場合

システム環境設定 > 共有 > リモートログイン 一度OFF → 再度ON



3. クライアント側から無害なパケットを定期的に送信する

PuTTYなど一部のクライアントソフトウェアでは、定期的にパケット送信して切断されないようにする機能(Heartbeat/KeepAlive機能)が提供されているようです。





  1. OpenSSHのクライアント用設定においては、デフォルトのシステム全体でのクライアント用設定ファイルは/etc/ssh/ssh_configだが、各ユーザがホームディレクトリ内で独自に設定ファイル(~/.ssh/config)を持つ場合はそちらが優先される