著者: | 佐藤裕介 (nuts@cclub.cc.tut.ac.jp) |
---|---|
バージョン: | 2006/07/04 23:50:00 +0900 (JST) |
spam メールを受信しないようにする方法には、大きく分けて、 SpamAssassin 等メールの内容を見て弾く方法と、送信者のメールアドレスや送信元の IP ア ドレスをもとにして弾く方法とがあります(と思います)。
今回行うのは後者で、 spammer が使っている DNS [1] を基準にして メール受信を拒否します。次のような長所があります。
なお、この設定を行うには version 2.1 以降の Postfix が必要です [2] 。
[1] | From: に指定してあるアドレスのドメイン部をキーにして、 NS レコー ドを引いた結果。例えば nuts@cclub.cc.tut.ac.jp だったら ns0.imc.tut.ac.jp を判定に使う。 |
[2] | Postfix 2.0 系列で設定を行うと、メールの受信が行われる度に次のよ うなメールが postmaster 宛てに送られます。 Transcript of session follows. Out: 220 receive.example.com ESMTP Postfix In: EHLO send.example.com Out: 250-receive.example.com Out: 250-PIPELINING Out: 250-SIZE 640000000 Out: 250-VRFY Out: 250-ETRN Out: 250 8BITMIME In: MAIL From:<sender@send.example.com> SIZE=996 Out: 250 Ok In: RCPT To:<recipient@receive.example.com> Out: 451 Server configuration error In: DATA Out: 554 Error: no valid recipients In: RSET Out: 250 Ok In: QUIT Out: 221 Bye |
このドキュメントは、 FreeBSD 4.10-STABLE 上で、 ports からインストール した Postfix を対象に行った作業をもとにしたものです。 OS やインストール 方法が異なる場合は、設定ファイルの場所とかが多少違うかもしれません。適 宜読み替えてください。
また、 SMTP におけるメール送受信の手続きについては理解しているものとし ます。具体的には、telnet で SMTP を喋ったことがあれば OK です。
設定手順は次の通りです。
Postfix のバージョンが 2.1 以降であることを確かめます。
$ ls /var/db/pkg | grep postfix postfix-2.2.5_1,1/
次のような内容のファイルを postfix の設定ファイル (main.cf) と同 じ場所に用意します。ここでは reject_ns とします。
ns1.is-name.net REJECT spammer NS ns1.kim-name.net REJECT spammer NS ns1.dehfs.com REJECT spammer NS ns2.dehfs.com REJECT spammer NS ns1.dsfad.com REJECT spammer NS ns2.dsfad.com REJECT spammer NS ns1.zets-1.com REJECT spammer NS ns2.zets-1.com REJECT spammer NS ds1.hkdom.net REJECT spammer NS ds2.hkdom.net REJECT spammer NS ns1.mr-bater.com REJECT spammer NS ns2.mr-bater.com REJECT spammer NS
これは、spammer が使っている DNS の名前と、そこからメールが送信され てきたときの動作を、 access(5) の形式で書いたものです。例えば最初の 行は、 From: に指定されているアドレスのドメインについて、その NS レ コードを引いて、結果が ns1.is-name.net だったら、そのメールを REJECT する(その際のメッセージは "spammer NS")、という意味です。
Postfix は実際には 3. のようなテキストファイルではなく、それをデータ ベース化したファイルを参照して動作します。そのファイルを作成します。
$ sudo postmap reject_ns
これで、 reject_ns と同じディレクトリに reject_ns.db というファイル ができたはずです。
ちゃんとデータベースに登録されたか調べます。 REJECT spammer NS (NS 名の後に書いてある内容)と表示されれば OK です。
$ postmap -q ns1.is-name.net hash:reject_ns REJECT spammer NS
設定ファイル main.cf の smtpd_sender_restrictions [3] に check_sender_ns_access を指定します。データベース化したファイル の名前は reject_ns.db ですが、指定するファイル名には .db を つけないでください(自動補完されるようです)。
smtpd_sender_restrictions = ... check_sender_ns_access hash:/usr/local/etc/postfix/reject_ns ...
[3] | 千熊屋ウラ日記 (http://chig.vis.ne.jp/d/200509.html#d29_2) では smtpd_sender_restrictions ではなく smtpd_recipient_restrictions に指定をしています。 http://www.kobitosan.net/postfix/trans-2.2/jhtml/postconf.5.html によると、文法的には smtpd_recipient_restrictions に設定して も問題ないようです。また、動作上でも RCPT TO の時点で弾くか MAIL FROM の時点で弾くかの違いだけですので、問題はないはずで す( RCPT TO より MAIL FROM の方が先に行われるはず)。但 し、設定を人間が読み書きすることを考えると、こっちに設定した方が いいのではないかと思います。 |
Postfix に設定ファイルを読みこませます。これで設定は完了のはずです。
$ sudo /usr/local/sbin/postfix reload
しばらく放っておいて、ちゃんと spam を弾いているかどうか調べます。 /var/log/maillog を見て、次のようなログがあれば OK です。
Oct 28 00:03:00 hostname postfix/smtpd[49085]: NOQUEUE: reject: RC PT from unknown[123.45.67.89]: 554 <sender@send.example.com>: Send er address rejected: spammer NS; from=<sender@send.example.com> t o=<recipient@receive.example.com> proto=SMTP helo=<sender@send.exa mple.com>
なお、 DNS サーバのリストについては、定期的なメンテナンスが必要です。こ の方法で弾けそうなメールが送られてきた場合な、次のような手順でリストの 更新を行います。
例えば、 info@uorh.com から spam が届いた際の手順は次のようになりま す。
info@uorh.com からの spam が届きました。少なくとも、このドメイン からのメールは全て spam のようです。
dig uorh.com ns して NS の名前を調べます。この場合 dig(1) の 結果は次のようになります。
$ dig uorh.com ns ... ; <<>> DiG 8.3 <<>> uorh.com ns ... ;; ANSWER SECTION: uorh.com. 2D IN NS ns1.dufqv.net. uorh.com. 2D IN NS ns1.dufpv.net. ...
使われている NS は ns1.dufqv.net と ns1.dufpv.net です。
他のドメインからも spam が届きました。この 2 つの NS を使っているド メインからのメールは全て spam だと判断したとします。
NS の名前を reject_ns に追加します。
ns1.is-name.net REJECT spammer NS ... ns1.dufqv.net REJECT spammer NS ns1.dufpv.net REJECT spammer NS
4. のファイルをもとに、データベース化した方のファイルを更新します。
$ sudo postmap /usr/local/etc/postfix/reject_ns
ちゃんとデータベースが更新されたかどうか調べます。
$ postmap -q ns1.dufqv.net hash:/usr/local/etc/postfix/reject_ns REJECT spammer NS
数日したら、 maillog にメールを reject したログが残っているかどうか 調べます。あれば OK です。
$ sudo grep "@uorh.com" /var/log/maillog Oct 28 23:59:20 hostname postfix/smtpd[42845]: NOQUEUE: reject: RC PT from unknown[123.45.67.89]: 554 <info@uorh.com>: Sender address rejected: spammer NS; from=<info@uorh.com> to=<recipient@receive.e xample.com> proto=SMTP helo=<info@uorh.com>
ところで、上に書いたログを見ると、いろいろと spam よけに使えそうなパラ メータが含まれています。
このうち、 helo に指定されたメールアドレスを使っても、同様に spam よけ を行うことができるはずです(未確認)。
smtpd_sender_restrictions = ... check_sender_ns_access hash:/usr/local/etc/postfix/reject_ns ...
という指定の代わりに、
smtpd_helo_restrictions = ... check_helo_ns_access hash:/usr/local/etc/postfix/reject_ns ...
とすればいいと思います。
他にも、送信者の情報をもとにメールを弾く方法としては次のようなものがあ ります。
この 2 つの前提に基づく手法です。 postfix-jp ML への投稿 Greylisting が分かりやすいと思います。
エンドユーザのホストはよく spam 送信の踏み台に使われます。そこで、エ ンドユーザのホストからのメールは全て拒否してしまえ、という単純な方法 です。
メール受信の可否は、 FQDN の逆引きができるか、 FQDN が 6 つの正規表 現にマッチするかどうか、で判断します。
また、さらに詳しい情報については、 MTA のアクセス制御 が詳しいです。