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