月別アーカイブ: 2010年2月

OpenSSH で SOCKS サーバ(NetBSD)

前回は Thunderbird が Gmail に接続するためにファイアウォールを超えるための要件について書いた。

ファイアウォールを越えるためには SOCKS サーバをたてなければならない(もちろん SOCKS サーバ自身は外部へ 993 のポートが空いている必要がある)。が、調べてみると、ssh(1) が -D オプションで SOCKS サーバになるらしいということがわかったので、(追加のアプリケーションのインストールが不要な)NetBSD 5.0.1 付属の ssh で SOCKS サーバをたててみることにした。

$ ssh -f -N -D :1080 localhost

-D オプションの引数の 1080 は SOCKS サーバを動かすポート番号で、任意のポートが指定できるが、ここでは /etc/services で ‘socks 1080/tcp’ となっていたのに合わせてみた。ポート番号の前の ‘:’ は、待ち受けポートを ‘*:1080’ にするのに必要。単に ‘-D 1080’ としたら待ち受けポートが ‘127.0.0.1:1080’ になってしまい、外部のクライアントから接続できない。

また、事前にパスフレーズなしのキーペアを作り、公開鍵を authorized_keys に登録するなど、ssh の実行の際に入力が不要となるよう準備をしておいた。

で、Thunderbird から接続してみると、一見うまく接続できているようだが、データの転送量?が多くなると、下記のエラーが ssh を実行している端末に表示されて、先に進まなくなってしまう。

channel X: rcvd too much data XXXX, win XXX

ネットで検索してみると、ssh のバージョンによってはこのあたりにバグがあるらしいということがわかった。どのバージョンが大丈夫だとかの詳細は不明だったので、とりあえず pkgsrc から OpenSSH-5.2 をインストールして試してみると、sshd は NetBSD 5.0.1 のもの (OpenSSH_5.0) で問題なく、ssh のほうだけ pkgsrc の方 (OpenSSH_5.2.p1) を使えばよいことがわかった。

動作が確認できたので、次は、サーバを起動したときに ssh が実行されるようにする。

何の疑いもなく /etc/rc.local の中に記述したら、なんと sshd が実行されるよりも先に ssh が実行されてしまった(そしてもちろん失敗した)。

今の NetBSD では /etc/rc.local は /etc/rc.d/local から呼び出されるようになっているのだが、rcorder(8) で確認してみると、ssh などの daemon 群が /etc/rc.d/local の後になっている。

ううむ、rc.local は最後に実行されるようになってないといろいろと具合が悪いような気もするのだが……。

/etc/rc.d/local を書き換えて実行順が最後になるようにすることも考えたが、NetBSD の UPDATE 時に忘れてハマることを考えて、以下の rc.d スクリプトを書き起こすことにした。

/etc/rc.d/ssh_socks

#!/bin/sh
#
# $Id$
#
# PROVIDE: ssh_socks
# REQUIRE: sshd
$_rc_subr_loaded . /etc/rc.subr
name="ssh_socks"
rcvar=$name
command="/usr/pkg/bin/ssh"
pidfile="/var/run/${name}.pid"
identityfile="/var/chroot/sshd/.ssh/id_rsa"
start_postcmd="ssh_socks_postcmd"
command_args="-f -N -i ${identityfile} -D :1080 localhost"
required_files="${identityfile}"
ssh_socks_user="sshd"
ssh_socks_postcmd()
{
ps axw | grep "${command}" | awk '!/grep/{print $1}' > ${pidfile}
}
load_rc_config $name
run_rc_command "$1"

いまのところは順調に動いている。

ファイアウォールの内側の Thunderbird

Thunderbird で Gmail に IMAP で接続する人は多いだろう。この場合、IMAP over SSL(ポート番号 993)で通信が行われる。
ここで Thunderbird がファイアウオールの内側にいて、993 が外部に対して空いていない場合、プロキシを介して imap サーバに接続する必要がある。
Thunderbird 3.0.1 (おそらくそれ以前のバージョンでも)のオプションで、「インターネット接続」というのがあるが、ここに、「HTTP プロキシ」、「SSL プロキシ」、「SOCKSホスト」の3つの設定項目がある。ここで「IMAP over SSL だから SSL プロキシを設定すればいいんじゃないの?」と早がってんすると(私のように)ハマることになる。
SSL プロキシを設定しても Thunderbird の IMAP over SSL の接続には使用されない。無視されるだけである。この設定は https のために使用される設定であって、IMAP over SSL のためではない。IMAP over SSL がファイアウォールを越えるためには SOCKS サーバを用意しなければならない。
世の中のどこかに IMAP over SSL に対応した SSL プロキシなるものがあるのではないかと探し回り、時間を無駄にしてしまった。実際は、そんな汎用 SSL プロキシがあったとしても、Thunderbird で使えるようになるわけではなかったのだ。正直、Thunderbird のあの設定画面のレイアウトは不親切にも程があると思う。
ネットでずいぶん検索してわかったことは、世界中に私と同様の無駄足を踏まされた人がたくさんいるということだった。Squid ではできない、という回答はネットから得られたが、そもそも SSL プロキシは使ってくれない、という回答は得られなかったので、後続の人のためにここに書いておく(日本語だけど)。
次は OpenSSH を使ってSOCKS サーバをたてる話を書く予定。