モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Postfixの設定でClamSMTPと、受信時だけSpamAssassinを利用する

以前、PostfixからClamSMTPとSpamAssassinを利用するための設定例として

モーグルとカバとパウダーの日記 - Postfixの設定でClamSMTPとSpamAssassinを利用する

というエントリーを書いたんですが、これにはちょっと問題がありました。
SpamPDを利用するパターンの時、送信時にもSpamPDを通ってしまう、というものです。
この例だと

  • 受信メール:ClamSMTP→SpamPD
  • 送信メール:ClamSMTP→SpamPD

と送信メールについてもSpamPDのフィルタを通してしまう(そしてヘッダに余計な情報を付けてしまう)んですが、これを

  • 受信メール:ClamSMTP→SpamPD
  • 送信メール:ClamSMTP

というフィルタになって欲しいわけです。
これは以前やまぐちたかのりさんに指摘いただいてたんですが、(.forwardとかからspamc呼ぶ以外で)ずっと上手い解決が出来ずにいました。


が、やっとこ良い方法が思いついたのでメモ。


Postfixの「FILTER」の指定って、その場ですぐにフィルターに渡しちゃうのではなくって、最終的にメールを受け取ったときどこをフィルター通すか指定してある「content_filter」を上書きしてるだけなんですね。
なので、標準のcontent_filterではClamSMTPだけを通すように指定しておき、reject_unauth_destinationを抜けた先ではFILTERの指定でもってcontent_filterをSpamPDを通すように指定するようにしました。SpamPDの出力先をClamSMTPにしておくことで、どちらのフィルタも通ってきてくれます。


受け取るポート:受け取るデーモンという表記とすると、こんな感じの構成です。


/etc/postfix/main.cf

smtpd_recipient_restrictions =
  ...
  reject_unauth_destination
  check_client_access    regexp:$config_directory/filter_spampd
  ...

content_filter = scan:127.0.0.1:10026
receive_override_options = no_address_mappings

/etc/postfix/filter_spampd

/./             FILTER scan:127.0.0.1:10025

/etc/postfix/master.cf

# AV scan filter (used by content_filter)
scan      unix  -       -       n       -       16      smtp
        -o smtp_send_xforward_command=yes
# For injecting mail back into postfix from the filter
127.0.0.1:10027 inet  n -       n       -       16      smtpd
        -o content_filter=
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
        -o smtpd_helo_restrictions=
        -o smtpd_client_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks_style=host
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8

/etc/clamsmtpd.conf の該当行は以下のようになっているのを確認

OutAddress: 10027
Listen: 127.0.0.1:10026

/etc/default/spampd の該当行を以下に修正

STARTSPAMPD=1
LISTENPORT=10025
DESTPORT=10026


あと、SpamPDって、spamdが起動してなくっても使えるんですよね。
ついこないだまで気がつかずに、ずっとspampdとspamdどっちも起動するようにして使ってました…