Mailer debug

はじめに

このペイジに書いてある方法は、以前、私がインターネット関係の 仕事で、クライアントソフトウェアを効果的にデバッグする方法を 探していた時に、見つけたペイジが元ネタです。

<URL:http://leo.ec.t.kanazawa-u.ac.jp/~imai/mailclient/>
にあったのですが、今は無くなってしまいました。
移動先をご存知の方は是非 教えて下さい。

Win環境なメイラの smtp や pop chat の調査結果が載っていて、非常に素晴 らしいペイジだったのですが、とても簡単かつ絶大な効果を発揮する手法 なので、私はすごく気に入りました。 せめてその手法だけでも、私自身のメモとしても残したく、ここに 記す次第です。

Unix系OS によるメイラのデバッグ方法

基本的に通信というものはクライアントとサーバのお喋りなので、とんちんかん な会話をしていないか検証する事が重要である。

デバッグ用サーバに細工をし、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 で受けるようにすれば、ブラウザのデバッグにも使えます。


Last modified: Tue Jun 15 21:51:35 JST 1999