サーバー/クライアントのSSHタイムアウト抑止

概要

  • Tera termなどターミナルを使ってサーバーにssh接続をしている際に、しばらく操作しないと接続が切断されちゃうことありますよね。
  • sshdはTCP KeepAliveとは別に、クライアントの生存をチェックして応答がない場合に接続を切断する機能があります。(sshdのマニュアル抜粋を後述します)
  • sshd(サーバー)とTera termなどのsshクライアントでは、生存をチェックするためのハートビートの設定が可能です。AWSで提供されているCentOS 7では、sshdのデフォルトは、クライアントに生存チェックのメッセージ(client alive message)を送りません。

タイムアウト抑止設定(sshdサーバー)

  • CentOS 7のAMIを使って起動したEC2インスタンスでは、 /etc/ssh/sshd_configのデフォルトは「ClientAliveInterval 0」、「ClientAliveCountMax 3」です。
  • sshdサーバーからクライアントに生存チェックする間隔を0(なし)から秒数指定します。

$ cd /etc/ssh
$ sudo vi sshd_config
ClientAliveInterval 30
ClientAliveCountMax 3
...

$ sudo systemctl restart sshd

タイムアウト抑止設定(クライアント)

  • Tera termの場合、デフォルトでクライアントからのハートビートが60秒に設定されています。必要に応じて、秒数を変更します。
  • Tera termの設定は、設定 ⇒ SSH ⇒ ハートビート(keep-alive)
 

sshdマニュアル

  • sshdのオンラインマニュアルより、ClientAliveInterval、ClientAliveCountMaxパラメータの説明を抜粋します。記載のパラメータ説明は、下記Yusuke Shinyama氏のサイトにまとめられているマニュアルの日本語訳から引用です。

ClientAliveInterval (クライアントの生存チェック間隔)

sshd (8) は一定時間ごとに、暗号化された通信路を経由してクライアントに応答を要求するメッセージ(client alive message) を送ります。その際、何もデータが送られてこなかったらタイムアウトする時間を秒数で指定します。デフォルトの値は 0 で、これはメッセージを送らないことを意味します。

ClientAliveCountMax (クライアントの生存チェック最大カウント数)

sshd (8) が無反応のクライアントに対してclient alive message (下記参照) を送ってみる最大数を指定します。client alive message に対する応答が連続してこの回数だけなかった場合、sshd は接続を切り、セッションを終了します。client alive message は、TCPKeepAlive(下記) とはまったく違うことに注意してください。client alive message は暗号化された経路を介して送られるので、偽造されることはありません。TCPKeepAliveによって設定される TCP の keepalive オプションは偽造される可能性があります。client alive のメカニズムはクライアントあるいはサーバが、いつ接続が切れたのかを知りたいときに役立ちます。
デフォルトの値は 3 です。もしClientAliveInterval(下記) が 15 に設定され、ClientAliveCountMaxがデフォルトのままである場合、これに反応できない SSH クライアントはおよそ 45 秒後に接続が切られます。