このペイジに書いてある方法は、以前、私がインターネット関係の 仕事で、クライアントソフトウェアを効果的にデバッグする方法を 探していた時に、見つけたペイジが元ネタです。
<URL:http://leo.ec.t.kanazawa-u.ac.jp/~imai/mailclient/>
にあったのですが、今は無くなってしまいました。
移動先をご存知の方は是非
教えて下さい。
Win環境なメイラの smtp や pop chat の調査結果が載っていて、非常に素晴 らしいペイジだったのですが、とても簡単かつ絶大な効果を発揮する手法 なので、私はすごく気に入りました。 せめてその手法だけでも、私自身のメモとしても残したく、ここに 記す次第です。
基本的に通信というものはクライアントとサーバのお喋りなので、とんちんかん な会話をしていないか検証する事が重要である。
デバッグ用サーバに細工をし、inetd 経由で smtp(25) と pop3(110)を盗聴 すれば、サーバとクライアントのやりとりしている様子が一目瞭然で解り、 デバッグは容易となる。
まず、以下のスクリプトを用意する。
[/root/bin/fakesendmail.sh]
#!/bin/sh
LOG=/tmp/smtplog
rm -f $LOG
tee -a $LOG |sendmail -bs |tee -a $LOG
[/root/bin/fakepop3.sh]
#!/bin/sh
LOG=/tmp/pop3log
rm -f $LOG
tee -a $LOG |in.pop3d |tee -a $LOG
このスクリプトでは、/tmp にログが作成されるが、pop3 のログには 生パスワードが入ってしまうので、注意しましょう。 作成したら、実行属性にしておく。
chmod +x /root/bin/fakesendmail.sh
chmod +x /root/bin/fakepop3.sh
そして、以下の内容をそれぞれ追加する。
[/etc/services]
dummysmtp 30/tcp
dummypop3 31/tcp
[/etc/inetd.conf]
dummysmtp stream tcp nowait root /usr/sbin/tcpd/root/bin/fakesendmail.sh
dummypop3 stream tcp nowait root /usr/sbin/tcpd/root/bin/fakepop3.sh
本来、smtp は port 25、pop3 は port 110 だが、パイプによるこの処理は サーバに相当負荷がかかるのと、一通分しか記録しないので、通常系とは違う ポートの 30 と 31 にサービスを割り当てている。 空いているポートならどこでも良く、解り易いように 10021、10110にそれぞれ 割り当ててもよい。
普段使用しているサーバに仕掛けると、あっと言う間に他のメイルによって ログが消えてしまい、デバッグにならなくなるので、注意して欲しい。
デバッグを行うメイラーは、smtp を port 30(10021)、pop3 を port 31(10110) と、設定したダミーデーモンにアクセスするように設定すれば良い。
設定が終了したら、inetd を再起動する。
killall -HUP inetd
ロギングした結果は以下の様になる。
《SMTP(RFC 821)を Logging した例》
R は sendmail が喋っている言葉
S は メイラー(Winbiff)が喋っている言葉
R 220 info.xxx.xxx.xxx.co.jp ESMTP Sendmail 8.8.8/3.5Wpl7-HMM-info; Thu, 18 Dec 1997 13:39:14 +0900 S HELO noizumi.xxx.xxx.xxx.co.jp R 250 info.xxx.xxx.xxx.co.jp Hello root@localhost, pleased to meet you S RSET R 250 Reset state S MAIL FROM: <noizumi@xxx.xxx.xxx.co.jp> R 250 <noizumi@xxx.xxx.xxx.co.jp>... Sender ok S RCPT TO: <noizumi> R 250 <noizumi>... Recipient ok S DATA R 354 Enter mail, end with "." on a line by itself S To: noizumi S X-fingerprint: 9A D0 54 84 57 69 43 4C 0C 48 BE 4C 87 C1 8A AC S Subject: =?ISO-2022-JP?B?GyRCJCokRiQ5JEgbKEI=?= S From: Yuji Noizumi <noizumi@xxx.xxx.xxx.co.jp> S X-Mailer: Winbiff [Version 2.03] S Date: Thu, 18 Dec 97 13:40:48 +0900 S Mime-Version: 1.0 S Content-Type: text/plain; charset=iso-2022-jp S S ぽーと30を使ったイカサマメイル S S -- S ========================================= S ××××(株) XXX××××XX××グループ S 野泉雄嗣 Yuji Noizumi S E-MAIL: noizumi@xxx.xxx.xxx.co.jp S ========================================= S S . R 250 NAA03296 Message accepted for delivery S QUIT R 221 info.xxx.xxx.xxx.co.jp closing connection《POP3(RFC 1939,1957) を Logging した例》
R は pop3d が喋っている言葉
S は メイラー(Winbiff)が喋っている言葉
R +OK info.xxx.xxx.xxx.co.jp POP3 Server (Version 1.004) ready. S USER noizumi R +OK please send PASS command S PASS XXXXXXX R +OK 1 messages ready for noizumi in /usr/spool/mail/noizumi S STAT R +OK 1 916 S UIDL R -ERR Invalid command; valid commands: DELE, HOST, LAST, LIST, MBOX, NOOP,RETR, RSET, STAT, TOP or QUIT S LIST 1 R +OK 1 916 S RETR 1 R +OK message 1 (916 octets): R X-POP3-Rcpt: noizumi@info.xxx.xxx.xxx.co.jp R >From bin Thu Dec 18 13:39:15 1997 R Received: from noizumi.xxx.xxx.xxx.co.jp (root@localhost) by info.xxx.xxx.xxx.co.jp (8.8.8/3.5Wpl7-HMM-info) with SMTP id NAA03296 for <noizumi>; Thu, 18 Dec 1997 13:39:14 +0900 R Message-Id: <199712180439.NAA03296@info.xxx.xxx.xxx.co.jp> R To: noizumi R X-fingerprint: 9A D0 54 84 57 69 43 4C 0C 48 BE 4C 87 C1 8A AC R Subject: =?ISO-2022-JP?B?GyRCJCokRiQ5JEgbKEI=?= R From: Yuji Noizumi <noizumi@xxx.xxx.xxx.co.jp> R X-Mailer: Winbiff [Version 2.03] R Date: Thu, 18 Dec 97 13:40:48 +0900 R Mime-Version: 1.0 R Content-Type: text/plain; charset=iso-2022-jp R R ぽーと30を使ったイカサマメイル R R -- R ========================================= R ××××(株) XXX××××XX××グループ R 野泉雄嗣 Yuji Noizumi R E-MAIL: noizumi@xxx.xxx.xxx.co.jp R ========================================= R R . S QUIT R +OK info.xxx.xxx.xxx.co.jp POP3 Server (Version 1.004) shutdown.
POP3 は、'+' で OK、'-' でエラーという、極めてシンプルな返事を返す。 この記号に続いている人間に判読可能なメッセージは、所詮 pop3d がサービス で表示しているに過ぎないものなので、メッセージ依存したメイラは、 違う pop3d と会話できなくて酷い目に遭うだろう。
WinBiff は UIDL コマンドを送っているが、pop3d はそれを理解できず拒否 している。メイラの中には、リザルトコードおかまい無しに喋りまくる ものもあるそうだが、WinBiffはちゃんと拒絶したサーバのリザルトに応じた 処理をしているのが解る。
この方法は inetd を経由させれるモノに使えるので、例えば、 httpd(80)も inetd で受けるようにすれば、ブラウザのデバッグにも使えます。