English | Japanese

OpenSSH 用 Heartbeat/Watchdog パッチ

このページの内容は英語版ページとは違います。 パッチのダウンロードは英語版 の方から行ってください。

以下は NetNews (fj.sources) に投稿した文書になります。 `##' で始まる行は追記したものです。


最近無線LANを使い始めまして、やはり盗聴が恐いので
Secure Shell で接続しています。 無線LANは電波状況など
によってたまに通信路が切れてしまうことがあるのですが、
クライアント側が死んでも、サーバ側のログインシェルがいつ
までも残り続けてしまい(*)、なにかと不便だったり、精神的にも
不安だったりします。

(*) TCP socket の keepalive を使っていて、対話処理のアイ
    ドル状態で切断された場合は、2時間程度でシェルが死にます。

        ## 2時間でもシェルが死なないで、システムを止めるまで
        ## ずっと残り続けることもあります。この方が多いかも
        ## しれません。
        ## 接続中に無線LANカードを引き抜いたりして試してみましょう :)

ssh.com SSH1 の sshd には IdleTimeout というオプションが
ありますが、これでタイムアウトの時間を極端に短くするだけで
は、操作の手を休めることができません。 また、データをクラ
イアントに送り続けるプログラムが走っていると、ログインシェル
が死ななくなってしまいます。ssh.com SSH2 にはタイムアウト
の機能がありません。

そこで、OpenSSH のサーバにタイムアウト機能を付けるパッチを
作成してみました。 無線LANのゲートウェイになるマシンで使うと
便利です。 パッチは以下のサイトから拾ってください。
(ドキュメントは英語で書いてしまって、日本語版は作っていません。
 すみません。)

  http://www.ecip.tohoku.ac.jp/~hgot/sources/openssh-watchdog.html

このパッチは ssh に Heartbeat (Keepalive) の機能を、sshd に
watchdog timeout の機能を追加します。 ssh は定期的に
SSH_MSG_IGNORE メッセージを sshd に送信するようになります。
sshd は入力チャネルを監視していて、一定時間以上何もデータが
届かなくなった時点で子プロセスを kill します。

PuTTY や MindTerm でも Keepalive (socket のとは違う) がサポート
されているので、これらの SSH クライアントも使えます。
(TTSSH がサポートしてくれれば…。)

また、先人の作った Keepalive の null パケット発信機能は、
元々は firewall 越しの接続が切れてしまうことを防止するのが
目的だったようです。 IPマスカレードやNAT、firewallを介した
telnet や SSH の接続が、操作の手を休めている(1〜2時間)と
切れてしまうことがあります。 ssh に追加される Heartbeat 機能
は、こんな場合にも有用です。

例えば

  % ssh -o 'Heartbeat 1800' ssh_server_name -l user_id

とすると、30分ごとに Heartbeat を出すようになります。

        ## Firewall越えの接続がタイムアウトになる場合、Firewall
        ## の設定変更で対応できないかどうか、まずは管理者に相談
        ## すべきです。 対策が無理な場合には Heartbeat を使います。


This page: All Rights Reserved, Copyright (C) Hideaki Goto 2001