Top過去ログ目次掲示板

作成日:2008年05月22日 作成:おやじ
掲示板で過去に質問された内容です。

No.7551 /usr/local/bin/spam-filterの動作について


No.7551 投稿時間:2008年05月22日(Thu) 14:24 投稿者名:ひだか URL:
タイトル:/usr/local/bin/spam-filterの動作について

spamdの負荷低減で四苦八苦しています。
「内→外のメールはspamチェックしない」といった対処がamavisdの方でできればベストなんですが(まあそれも問題があるといえばあるんですが)、暫定的に「ある時間帯はspamdを落とす」といったことでしのごうと思っています。

ただし、単にspamdを落とすと、メールの配信がおかしくなってしまいます。

こんな感じです。

> Return-Path: <hidaka@pot.co.jp>
> X-Original-To: hoge@example.com
> Delivered-To: hoge@example.com
> Received: from localhost (mail.example.com [127.0.0.1])
> by mail.example.com (Postfix) with ESMTP id CF8365A4103;
> Thu, 22 May 2008 13:38:10 +0900 (JST)
> X-Quarantine-ID: <f1UwUROojQcQ>
> X-Amavis-Alert: BAD HEADER, MIME error: error: unexpected end of header
> Received: from mail.example.com ([127.0.0.1])
> by localhost (mail.example.com [127.0.0.1]) (amavisd-new, port 10024)
> with ESMTP id f1UwUROojQcQ; Thu, 22 May 2008 13:38:09 +0900 (JST)
> Received: by mail.example.com (Postfix, from userid 10002)
> id AC9485A4109; Thu, 22 May 2008 13:38:09 +0900 (JST)
> Message-Id: <20080522043809.AC9485A4109@mail.example.com>
> Date: Thu, 22 May 2008 13:38:09 +0900 (JST)
> From: hoge@example.com
> To: undisclosed-recipients:;

こんな風にしてみましたが、else以降でうまくプロセスIDがとれないようです。
spamdが落ちていたらそのままMTAにわたす、というようにするにはどうしたら良いでしょうか?
(今回のように特殊なケースでなくとも、spamdが不用意に落ちる、という可能性はゼロではないので、
このような対処をしておくことは無駄にはならないと思います。)

----
if test -e "/var/run/spamd.pid";
then

cat | $SPAMASSASSIN -x > in.$$
grep -e "^X-Spam-Status:.Yes" in.$$ \
&& $SENDMAIL "spamcop@hogehoge.com" < in.$$ \
|| $SENDMAIL "$@" < in.$$

else

$SENDMAIL "$@" < in.$$

fi
----


No.7553 投稿時間:2008年05月22日(Thu) 17:53 投稿者名:おやじ URL:
タイトル:Amavisd-newのPolicy bankを使えばいいのでは?

> spamdの負荷低減で四苦八苦しています。
> 「内→外のメールはspamチェックしない」といった対処がamavisdの方でできればベストなんですが(まあそれも問題があるといえばあるんですが)、暫定的に「ある時間帯はspamdを落とす」といったことでしのごうと思っています。

内部ー>外部をスキャンしたくないのなら、あまり変なことを考えずにAmavisd-newのPolicy bankを使えばいいのでは?
@mynetworksで内部アドレスを指定すると、MYNETSという特別なPolicy bankに割り当てられるので以下のように@mynetworksを環境に合わせて設定し、その条件ならスパムチェックをバイパスするようにすればいいのでは?
実際にやったことはないのですが、下記でうまくいくと思います。
ただ、@mynetworksで指定したクライアント発という条件なので、実際は内部<−>内部もバイパスされます。

@mynetworks = qw( 127.0.0.0/8 192.168.1.0/24 );
$policy_bank{'MYNETS'} = {
bypass_spam_checks_maps => [1],
};


No.7555 投稿時間:2008年05月23日(Fri) 09:35 投稿者名:ひだか URL:
タイトル:Re: Amavisd-newのPolicy bankを使えばいいのでは?


> 内部ー>外部をスキャンしたくないのなら、あまり変なことを考えずにAmavisd-newのPolicy bankを
> 使えばいいのでは?

なるほど!ありがとうございます。
ただ、負荷問題に直面しているのは「/etc/postfix/master.cfで全部spamassassinに喰わせる」という挙動をしているシステムなので、このやり方ではあまり回避できなさそうです(clamdはamavisd経由なんで、そっちがリソース喰う分は負荷減るかな……)。
わかりづらい書き方でスミマセンでした。

他の、フツーにspamdもclamdもamavisd経由な環境では役に立ちそうなので、Policy bankの設定、さっそくやってみます。


No.7556 投稿時間:2008年05月25日(Sun) 10:49 投稿者名:おやじ URL:
タイトル:アドレスを2つ使う方法は?

>
> > 内部ー>外部をスキャンしたくないのなら、あまり変なことを考えずにAmavisd-newのPolicy bankを
> > 使えばいいのでは?
>
> なるほど!ありがとうございます。
> ただ、負荷問題に直面しているのは「/etc/postfix/master.cfで全部spamassassinに喰わせる」という挙動をしているシステムなので、このやり方ではあまり回避できなさそうです(clamdはamavisd経由なんで、そっちがリソース喰う分は負荷減るかな……)。
> わかりづらい書き方でスミマセンでした。

わかりづらいというより、そういう条件が無かっただけなのでフリーでオードドックスは提案をしました。
上記のような条件があるなら、下記にもある「外部ユーザからのメールのみをフィルタリングする」方法が簡単なのでは?

http://www.postfix-jp.info/trans-2.3/jhtml/FILTER_README.html

ただ、この方法には内部用と外部用の2つのアドレスが必要であり、仮に設定できるとしても運用が止まらないように既存のアドレスをどちらで使用するかを考えないとまずいと思います。
おやじなら、外部用を新規に設け外部からの通信をそちらに誘導(ルータの変更?DNSの変更?等)します。
spamfilterは上記にも書いてありますがシェルで動かすとスープットが落ちるので、今の問題(負荷が重い)解決方法としては適切ではないと思います。
ちなみにですが、前回提示いただいたスクリプトでは停止したときには標準入力から受けたメールデータがsndmailにわたっていないので動きません。

> ----
> if test -e "/var/run/spamd.pid";
> then
>
> cat | $SPAMASSASSIN -x > in.$$
> grep -e "^X-Spam-Status:.Yes" in.$$ \
> && $SENDMAIL "spamcop@hogehoge.com" < in.$$ \
> || $SENDMAIL "$@" < in.$$
>
> else
>

cat > in.$$

> $SENDMAIL "$@" < in.$$
>
> fi
> ----



掲示板▲頁先頭