Archive for 8月, 2013

Qmail Tips: 存在しない宛先に届いたスパムメールを一括削除

運用ドメイン名の不特定多数のランダムなメールアドレスにスパムメールが送信されてくることがあります。

MTAがPostfixであれば、不適切な宛先に送信されてきたメールに対しては、即座にエラーを返すので、キューにそのスパムメールが蓄積されることはありません。一方で、MTAとしてQmailを使っている場合には、宛先ドメイン名が正しければ、そのメールが受信され、ローカル配送用キューに格納後に受信者への配送処理が行われます。

そのローカル配送の過程で初めて、その受信者メールボックスが存在するか否かが分かり、存在しなければ、送信者にエラーを返すことになり、そのエラーメールは、リモート配送用キューに格納されます。

大量の存在しない宛先へのメールを受信すると、Qmailが生成するエラーメールによって、リモートキューが一気に膨れ上がります。また、スパムは送信元メールアドレスが詐称されるのが、常ですから、キューのメールは捌けずに長時間滞留し続けることがあります。

そうなると正規ユーザーが当該サーバーから、メール送信をしようとしても、リモートキューのメールが多すぎて、メールが遅延する事象が起こります。

キューには、次のようなエラーメールが溜まることになります。

From: postmaster@mail.example.com
To: info@spammer.example.com
Subject: failure notice

Hi. This is the qmail-send program at mail.example.com.
I'm afraid I wasn't able to deliver your message to the following addresses.
This is a permanent error; I've given up. Sorry it didn't work out.

<hogehoge@mail.example.com>:
Sorry, no mailbox here by that name. (#5.1.1)

これは宛先「hogehoge@mail.example.com」にメールが送られてきたものの、この宛先が存在しないため、送信者である「info@spammer.example.com」に返送しようと生成されたエラーメールのサンプルです。

この「hogehoge」の部分が、ランダムとなっているエラーメールが、リモートキューに大量に溜まるので、それを一括削除することによって、メールの配送遅延を解消させます。エラーメールの一括削除は、次の手順で行います。

キューに溜まっているメール数の確認(Before)

qmHandle が入っていない場合の確認方法。

# find /var/qmail/queue/local -type f | wc -l
10
# find /var/qmail/queue/remote -type f | wc -l
2035

qmHandle が入っている場合は、次の方法で確認できます。
※qmHandle は、qmailに標準添付されないので、別途インストールが必要です。

# qmHandle -s
Messages in local queue: 10
Messages in remote queue: 2035

宛先不明のエラーメールのリストを生成する

# find /var/qmail/queue/mess -type f -exec egrep -l '^Sorry, no mailbox here by that name.' {} \; > /tmp/spam.queue

または

# find /var/qmail/queue/mess -type f -exec egrep -l '^<.*@mail.example.com>:' {} \; > /tmp/spam.queue

エラーメール(スパムメール)の一括削除

エラーメールの抽出が完了したら、Qmailのプロセスを停止してから、そのメールを削除します。次の例では、10通ずつ削除を行っています。

# cat /tmp/spam.queue | xargs -n10 rm

queue-fix によるキューの修復

削除後は、キューの整合性を修復するために queue-fix を実行します。
※queue-fix は、qmailに標準添付されないので、別途インストールが必要です。

# queue-fix -i /var/qmail/queue

キューに溜まっているメール数の確認(After)

キューの修復後に Qmailを起動し、溜まっているメール数を確認します。

# find /var/qmail/queue/local -type f | wc -l
10
# find /var/qmail/queue/remote -type f | wc -l
39

qmHandleがある場合。

# qmHandle  -s
Messages in local queue: 10
Messages in remote queue: 39

リモートキューから、約2,000通のエラーメールが削除されました。

なお、不特定多数の宛先に送信されてくるスパムメールが、一向に止む気配がないなど場合によっては、存在しない宛先に届いたメールを受信直後に削除する方法を取ることもあります。

Qmailの設定によりますが、.qmail-default などの然るべきファイルに /dev/null と書いておくことで、受信メールは削除され、エラーメールを返すことはなくなります。リモートキューにエラーメールが溜まる事象を抑えることができます。

ソフトウェア配布サイト

No Comments