qmail + qmail-scanner + spamassassin + clamav

qmailを利用したメールゲートウェイをテスト構築した時のメモ。
その内、ちゃんとした記事を書きますが、今回ハマったqmail-scannerの設定を書いときます。
spamassassinとclamavの導入、設定は他の構築サイトを参照してください。
[事象]
qmail-scannerのインストール時に、–notify recips と指定しているのに、受信先にメール通知が届かない。
[対応策]
今回の場合、外部SMTPサーバに上記設定をしました。
ドメインのMXレコードは外部SMTPサーバに向いていますが、外部SMTPでメールは受け取らずに、smtproutesで内部のSMTPサーバにリレーさせています。
外部SMTPではドメイン宛のメールは受け取らない(リレーするだけ) = /var/control/localsの中身もlocalhostのままでした。
qmail-scannerは、デフォルトで自身のドメイン宛のユーザーを処理するので–notify recips としても、元のメールの宛先@localhost宛てのメールとなり、内部SMTPサーバのユーザーに届かない。と言った事でした。
これを解決するには./configure時に、–local-domains 処理するドメイン名を指定する。
ちなみに、qmail-scannerの標準では「2byte文字(全角)」が含まれるメールを、通知メールとして処理すると文字化けしてしまうので、email_senderとemail_recipsにnkfを挟んでJISに変換する必要がある。
vi /var/qmail/bin/qmail-scanner-queue.pl
変更前
sub email_sender {
#Don’t e-mail bounced mail messages/etc!
return if (&is_unreplyable_email(‘sender’));
my($addr_type)=@_;
my ($HDR,$hdr,$tmpsndrs,$tmpsubj,$polstring)=”;
my ($tmpmsgid)= &uniq_id() . “-” . $V_FROM;
$polstring=’policy’ if (&notify_addr(‘nmlvadm’));
open(SM,”|$qmailinject -h -f ””)||~~
sub email_recips {
my($recip)=@_;
return if ($recip eq “”);
#Don’t notify precips if this is NOT a “Policy block”
if (&notify_addr(‘precips’)) {
return if ($quarantine_event !~ /^(policy|perlscan)/i);
} else {
#From now on precips is the same as recips
$NOTIFY_ADDRS=~s/precips/recips/;
}
return if (!&notify_addr(‘recips’));
my($HDR,$hdr,$tmprecips,$tmpsubj)=”;
my($tmpmsgid)= &uniq_id() . “-” . $V_FROM;
open(SM,”|/usr/bin/nkf -j|$qmailinject -h -f ””)||~~
変更後
sub email_sender {
#Don’t e-mail bounced mail messages/etc!
return if (&is_unreplyable_email(‘sender’));
my($addr_type)=@_;
my ($HDR,$hdr,$tmpsndrs,$tmpsubj,$polstring)=”;
my ($tmpmsgid)= &uniq_id() . “-” . $V_FROM;
$polstring=’policy’ if (&notify_addr(‘nmlvadm’));
open(SM,”|/usr/bin/nkf -j|$qmailinject -h -f ””)||~~   ←「|/usr/bin/nkf -j」を追加
sub email_recips {
my($recip)=@_;
return if ($recip eq “”);
#Don’t notify precips if this is NOT a “Policy block”
if (&notify_addr(‘precips’)) {
return if ($quarantine_event !~ /^(policy|perlscan)/i);
} else {
#From now on precips is the same as recips
$NOTIFY_ADDRS=~s/precips/recips/;
}
return if (!&notify_addr(‘recips’));
my($HDR,$hdr,$tmprecips,$tmpsubj)=”;
my($tmpmsgid)= &uniq_id() . “-” . $V_FROM;
open(SM,”|/usr/bin/nkf -j|$qmailinject -h -f ””)||~~   ←「|/usr/bin/nkf -j」を追加
2008/11/21 追記
qmail-scannerのconfigureのオプションを忘れたので、メモ”c⌒っo,,゚Д゚ )φ”
./configure –install –scanners clamdscan,verbose_spamassassin –local-do
mains 処理するドメイン –notify recips

マンガ喫茶

昨日、約1年ぶりに元上司と飲みに行った。
お互いテンションが上がって来た結果・・・終電に間に合わなくなってしまい、マンガ喫茶で一夜を明かす事に・・・。
渋谷で飲んでいたので、マンガ喫茶を探すには困らなかったんだけど、次の日はいつもより早く出社して作業が予定されている。
寝たい・・・。
でもアルコールが入っているので寝たら起きれない事は自分が一番知っている。
深夜0時30分にマンガ喫茶に入店して、6時30分まで洋画とマンガで眠さを凌いだけど、次の日はちょっとでも気を抜くと意識が飛んでしまう。
もう25才になったんだから、飲んで帰れなくならないように気をつけよう。

ASA5520のIDENT

社内のネットワーク環境を変えて、CISCO ASA5520でIPマスカレードを行なわせるようにして、インフラの最上位に設置したら、社外に設置しているメールサーバのとの間で遅延が発生するようになった。
原因はメールサーバで動いているtcpserver。
SMTPリクエストを処理する前に、リクエスト元にIDENTパケットを発信して応答を確認している。
CISCO ASA5520ではデフォルトでIDENTパケットを破棄するようになっている。
その為、メールサーバは送ったIDENTパケットが戻ってこない為、すぐにSMTPリクエストを処理できない。
応答がない場合でも最終的にSMTPリクエストの処理は行うが、毎回十数秒待たされると利用する側のストレスが溜まってしまう・・・。
解決方法がないかと探していたら、service resetinboundをグローバル側のインタフェースに設定する事で解決できた。
設定後の動きとしては、IDENTパケットに対して破棄ではなくリセット信号を返信するようになる。
リセット信号を受信したメールサーバはIDENT処理を終了し、すぐSMTP処理に移行する。
別の対処法として、メールサーバの起動スクリプトで、tcpserver -HRとオプションを付ける事で、そもそもIDENTパケットを飛ばさないようになる。