Mailの最近のブログ記事

かつてS25R方式を導入していたバーチャル山中家のqmailによるメールサーバだが、S25Rでの運用のいたちごっこ部分に嫌気が差して、一旦まったく普通のqmailに戻していた。
で、迷惑メールを送信してきたIPアドレスをwhoisで調べては、そのIPアドレス範囲ごとtcpserverで拒否るという暴挙に出てみた。
これはこれで効果があって、エラーに対して再送しないが次から次へと投げてくるアドレスに対しては有効だった。

しかし、世の中の迷惑メール送信者(人なのかウィルスなのかわかんないけど)は、次から次へと管理の甘いホストを見つけては、そこを使って送信してくるわけで・・・

なので、Qgreyを導入してみた。
これは、何でもかんでも再送させるのではなく、S25Rに引っかかったホストにだけ再送を促す。
抜けてきた迷惑メールについては、tcpserverで拒否るなりなんなりすればよいわけ。
しばらく様子を見てみることにした。

迷惑メール対策の結果、ほとんどの迷惑メールを受信拒否できるようになったのですが、迷惑なメールのうち、一見まっとうなサーバに見える等の理由で拒否されないものをブラックリストで拒否します。
なお、ブラックリストは、/etc/tcp.smtpに記載して、tcpserverにて拒否しています。
ただし、経験上二度とそのアドレスから送ってくることは無い様子です。
(tcpserverがdenyしたログにお目にかかりませんので)

2005/05/13

denyもログにあがるようになってきました。しばらくするとまた送ってくるのですね。
諦めが悪いなぁ。
しかも

no-reverse-record-configured.unknown.al.charter.com

という逆引きを設定しているものも発生。確かに逆引きできますな。これは拒否リストに追加。

ブラックリスト一覧

64.237.78.163:deny  
67.66.79.105:deny  
80.53.40.154:deny  
80.135.237.204:deny  
81.69.24.183:deny  
83.27.118.135:deny  
200.53.244.58:deny  
200.255.4.100:deny  
204.10.225.22:deny  
209.216.109.246:deny  
210.62.190.106:deny  
211.128.103.53:deny (ms1.mailvision.jp:再送きた。結構しつこい)  
213.60.9.11:deny

迷惑メール対策の結果、ほとんどの迷惑メールを受信拒否できるようになったのですが、迷惑でないメールのうち、逆引きできないなどの理由で拒否されてしまうものをホワイトリストで救います。

ホワイトリスト一覧

# Jun. 06, 2004: iad-fw-global.amazon.com  
^207\.171\.(167\.25|172\.6)$  
# Oct. 28, 2004: 207-171-180-101.amazon.com  
\.amazon\.com$  

# 2005/05/04 add *.ezweb.ne.jp  
\.ezweb\.ne\.jp$  
# 2005/05/06 add *.vodafone.ne.jp  
\.vodafone\.ne\.jp$  
# 2005/05/06 add *.docomo.ne.jp  
\.docomo\.ne\.jp$  
# 2005/05/06 add *.tkk.ne.jp  
\.tkk\.ne\.jp$  
# 2005/05/06 add sky.tkk.ne.jp  
^211\.5\.178\.229$  
# 2005/05/07 add a15-c1.data-hotel.net (htmllint-ML)  
^a15-c1\.data-hotel\.net$  
# 2005/05/06 add php  
^218\.223\.22\.16$

迷惑メール対策にて出力される/var/log/auth.logの情報を、集計してWebで参照できるようにしてみました。

<!--  

    迷惑メール対策したqmailのauth.logをサマリ化して表示する  

        qmail-spam-control.php  

    Version:  
        0.0        Start  
        0.1        ホワイトリスト救済が0件の際にゼロを表示するように修正  
        0.2        再試行者の表示は3回以上に。文言も修正  
        0.3        毎月1~9日は、格納が1つずれるので、それに対応  
        0.4        配列を宣言するように修正  

-->  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html lang="ja">  
<head>  
<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">  
<LINK REV="MADE" HREF="mailto:webmaster@yamanakake.com">  
<LINK rel="INDEX" href="./index.html">  
<title>qmail-spam-control</title>  
</head>  
<body>  
<?php  
    for($n=-1;$n<=7;$n++)  
        {  
        if ($n==-1)  
            {  
            echo '<H1>'.date('Y/n/d',time()).'の状況(未確定)</H1>'."\n";  
            $fp = fopen('/var/log/auth.log','r');  
            }  
        else  
            {  
            echo '<H1>'.date('Y/n/d',time()-($n+1)*24*60*60).'の状況(確定)</H1>'."\n";  
            $fp = fopen('/var/log/auth.log.'.$n,'r');  
            }  

        $counter = array();  
        $whitelist = array();  
        $retry = array();  

        while(!feof($fp))  
            {  
            $buffer = explode(' ',fgets($fp));  
            if ($buffer[1] == '')  
                {  
                $bias = 1;  
                }  
            else  
                {  
                $bias = 0;  
                }  
            if ($buffer[6+$bias] == 'qmail-smtpd:')  
                {  
                if ($buffer[7+$bias] == 'badremotehost:')  
                    {  
                    $counter[$buffer[10+$bias]] += 1;  
                    $fromserver = $buffer[8+$bias];  
                    $buffer = explode(' ',fgets($fp));  
                    $retry[$fromserver." ".htmlentities($buffer[8+$bias])." ".htmlentities($buffer[10+$bias])] += 1;  
                    }  
                if ($buffer[7+$bias] == 'goodremotehost:')  
                    {  
                    $whitelist[$buffer[8+$bias]] += 1;  
                    }  
                }  
            }  

        echo '<H2>拒否したリモートホストのパターンと拒否数</H2>'."\n";  
        echo '<TABLE BORDER="1" SUMMARY="拒否したリモートホストのパターンと拒否数">'."\n";  
        echo '<TR><TH ABBR="Pattern">パターン</TH><TH ABBR="DenyCount">拒否数</TH></TR>'."\n";  
        foreach($counter as $patname => $count)  
            {  
            echo '<TR><TD>'.$patname.'</TD><TD ALIGN="RIGHT">'.$count.'</TD></TR>'."\n";  
            }  
        echo '</TABLE>'."\n";  

        echo '<H2>ホワイトリストでの救済数</H2>'."\n";  
        echo '<TABLE BORDER="1" SUMMARY="ホワイトリストでの救済数">'."\n";  
        echo '<TR><TH ABBR="Pattern">送信元</TH><TH ABBR="OKCount">救済数</TH></TR>'."\n";  
        foreach($whitelist as $patname => $count)  
            {  
            echo '<TR><TD>'.$patname.'</TD><TD ALIGN="RIGHT">'.$count.'</TD></TR>'."\n";  
            }  
        echo '</TABLE>';  

        echo '<H2>3回以上の再試行</H2>'."\n";  
        echo '<TABLE BORDER="1" SUMMARY="3回以上の再試行">'."\n";  
        echo '<TR><TH ABBR="Server">送信元</TH><TH ABBR="Mailfrom">差出人</TH><TH ABBR="Reciptto">あて先</TH><TH ABBR="DenyCount">再試行数</TH></TR>'."\n";  
        $flag = 0;  
        foreach($retry as $patname => $count)  
            {  
            if ($count >= 3)  
                {  
                $flag += 1;  
                $buffer = explode(' ',$patname);  
                echo '<TR><TD>'.$buffer[0].'</TD><TD>'.$buffer[1].'</TD><TD>'.$buffer[2].'</TD><TD ALIGN="RIGHT">'.$count.'</TD></TR>'."\n";  
                }  
            }  
        if ($flag == 0)  
            {  
            echo '<TR><TD COLSPAN="4">なし</TD></TR>'."\n";  
            }  
        echo '</TABLE>'."\n";  
        echo '<BR>'."\n";  
        }  
?>  
</body>  
</html>

現在の拒否リストは以下の通りです。
http://www.yamanakas.net/badremotehost

あくまでも、バーチャル山中家にとって迷惑だったメールを送信したサイトを、大雑把に登録したものです。
大雑把というのは、「こんなメールを送ることを許したドメインは駄目だ!」とばかりに、えいっ!と拒否するということです。
例えば、spammailsender.yamanakake.com(仮称)というホストから迷惑メールが来たら、.yamanakake.com$を拒否してしまっています(危険)。
なので、このまま使用すると非常に危険ですので、ご注意ください。

では、持ってきたファイルを展開してコンパイルしていきましょう。

[root@jiro]/home/nobuo/qmail# tar zxvf qmail-1.03.tar.gz  
[root@jiro]/home/nobuo/qmail# cp qmail-date-localtime.patch qmail-1.03  
[root@jiro]/home/nobuo/qmail# cp qmail-badremotehost.patch qmail-1.03  
[root@jiro]/home/nobuo/qmail# cd qmail-1.03  
[root@jiro]/home/nobuo/qmail/qmail-1.03# patch < qmail-date-localtime.patch  
Hmm...  Looks like a unified diff to me...  
The text leading up to this was:  
--------------------------  
|This patch causes the various qmail programs to generate date stamps in  
|the local timezone. I find GMT too annoying to convert from/to. I make  
|no warranties that it will work in your timezone, however it works for me.  
|  
|Works with qmail 1.01 to 1.03.  
|  
|To apply this patch, cd into the qmail source directory and type...  
|       patch -s -p1 < patch-to-patch-file  
|  
|--- qmail-1.03.orig/date822fmt.c       Tue Apr 15 15:05:23 1997  
|+++ qmail-1.03/date822fmt.c    Fri Apr 18 00:39:41 1997  
--------------------------  
Patching file date822fmt.c using Plan A...  
Hunk #1 succeeded at 1.  
Hunk #2 succeeded at 13.  
done  
[root@jiro]/home/nobuo/qmail/qmail-1.03# patch < qmail-badremotehost.patch  
Hmm...  Looks like a unified diff to me...  
The text leading up to this was:  
--------------------------  
|This patch might be found useful if you would try ASAMI Hideo's idea  
|described at http://www.gabacho-net.jp/en/anti-spam/ on qmail.  
|  
|To try sample rules on the above site, you can put the following lines  
|into /var/qmail/control/badremotehost:  
|  
|^[^\.]*[0-9][^0-9\.]+[0-9]  
|^[^\.]*[0-9]{5}  
|^([^\.]+\.)?[0-9][^\.]*\.[^\.]+\..+\.[a-z]  
|^[^\.]*[0-9]\.[^\.]*[0-9]-[0-9]  
|^[^\.]*[0-9]\.[^\.]*[0-9]\.[^\.]+\..+\.  
|^(dhcp|dialup|ppp|adsl)[^\.]*[0-9]  
|# IP address due to no FQDN  
|[0-9]$  
|  
|And also white list into /var/qmail/control/goodremotehost as follows:  
|  
|# Jun. 06, 2004: iad-fw-global.amazon.com  
|^207\.171\.(167\.25|172\.6)$  
|# Oct. 28, 2004: 207-171-180-101.amazon.com  
|\.amazon\.com$  
|  
|  
|Any suggestions for improvements or corrections are welcome at naokih at  
|iron-horse dot org.  
|  
|--- Makefile.orig      Mon Jun 15 03:53:16 1998  
|+++ Makefile   Wed Nov 24 02:34:30 2004  
--------------------------  
Patching file Makefile using Plan A...  
Hunk #1 succeeded at 1534.  
Hmm...  The next patch looks like a unified diff to me...  
The text leading up to this was:  
--------------------------  
|--- qmail-smtpd.c.orig Mon Jun 15 03:53:16 1998  
|+++ qmail-smtpd.c      Wed Nov 24 02:34:30 2004  
--------------------------  
Patching file qmail-smtpd.c using Plan A...  
Hunk #1 succeeded at 50.  
Hunk #2 succeeded at 217.  
Hunk #3 succeeded at 314.  
done

無事パッチが適用できたら、コンパイルしてみましょう。

[root@jiro]/home/nobuo/qmail/qmail-1.03# make setup check  
(省略)

前回までの手順で、正しくメールの送受信が出来るようになったらそれでOKなのですが、バーチャル山中家では増えつづける迷惑メールについて、対策を行いました。
この対策には、賛否両論があるわけですが、とにかく効果があるのは間違いありません。
ある意味特効薬的な部分もあり、副作用もありますので、用法用量を・・じゃない、自己責任でお願いしますね。

はじめに

まずは、スパム対策技術をよく読んで下さい。
これからあなたが行う対策がどういうもので、どういう効果と副作用があるかを理解してください。
また、あらかじめ正当なメールサーバなのに逆引きが出来ないことが判明しているものも、上記のページでホワイトリストとして公開されていますので、是非参考にしてください。

迷惑メール対策版qmailの作成

qmail本体の入手

[root@jiro]/home/nobuo/qmail# fetch ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz

迷惑メール対策用パッチの入手

[root@jiro]/home/nobuo/qmail# fetch http://www.iron-horse.org/~naokih/qmail-badremotehost.patch

ローカルタイム対応パッチの入手(任意)

[root@jiro]/home/nobuo/qmail# fetch http://www.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch

最後に、Webインターフェースでメールユーザの管理ができるqmailadminをインストールします。

[root@jiro]/usr/ports# portinstall mail/qmailadmin

portsからインストールすると、/usr/local/www/cgi-bin.defaultにインストールされますので、各自都合のいい場所に移動しましょう。
山中家では、LANからしかアクセスできないサイトを作って、そこに入れています。
メールアカウントを作成したり削除したりできるものですから、外部からはアクセスできない場所に置くことをおすすめします。

qmailの起動スクリプトは、/usr/local/etc/rc.d/qmail.shですが、これは/var/qmail/rcへのリンクです。
今回は、tcpserver経由での起動で、vpopmailを使用するので、以下のような内容にしてみました。

#!/bin/sh  

# Using splogger to send the log through syslog.  
# Using qmail-local to deliver messages to Maildir format by default  

case "$1" in  
start)  
       echo "Start qmail..."  
       exec env - PATH="/var/qmail/bin:$PATH" \  
       qmail-start ./Maildir/ splogger qmail &  

       /usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u 82 -g 81 0 smtp \  
       /var/qmail/bin/qmail-smtpd 2>&1 \  
       | /var/qmail/bin/splogger smtpd 4 &  

       /usr/local/bin/tcpserver -v -x /etc/tcp.pop3.cdb -R -H 0 pop3 \  
       /var/qmail/bin/qmail-popup mail.yamanakake.com \  
       /usr/local/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1 \  
       | /var/qmail/bin/splogger pop3d 4 &  

       exit 0  
       ;;  
stop)  
       echo "Stop qmail..."  
       PID=`/bin/ps -afwww | grep qmail | awk '{print $1}'`  
       if [ ! -z "$PID" ] ; then  
               /bin/kill ${PID} 1> /dev/null 2>&1  
       fi  
       ;;  
*)  
       echo "Usage: `basename $0` {start|stop}" >&2  
       exit 64  
       ;;  
esac

/usr/local/etc/rc.d/qmail.sh startしてみて、プロセスが起動しているか確認してみましょう。

バーチャルドメイン環境だけでなく、FreeBSDのユーザーに依存せずにメールユーザーを管理できるという意味でも、vpopmailは有効だと思います。
そこで、こちらもportsからインストールしましょう。

[root@jiro]/usr/ports# portinstall mail/vpopmail

ここまでくれば、メールサーバとして起動できる環境になってきました。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちMailカテゴリに属しているものが含まれています。

前のカテゴリはDNSです。

次のカテゴリはMemoです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。