English | Japanese
このページの内容は英語版ページとは違います。 パッチのダウンロードは英語版 の方から行ってください。
以下は 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 を使います。