Postfix : 条件付きヘッダーチェック

Postfix : 条件付きヘッダーチェック

これが私の SMTP 状況です。

メールフローはオンラインリレープロバイダーによってタグ付けされます (!!SPAM!!、!!BULK!! など)

メール フローは内部の postfix によって受信されます。件名にタグが付いている場合は、トランスポートは内部 Exchange に中継するように構成されています。これは Header_checks を使用して行います。タグ付きのメール フローは、検疫サーバー (個々のユーザー用の WebUI など) に送信されます。

/^[sS]ubject:.*!!SPAM!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!BULK!!*/ FILTER smtp:192.168.11.250
/^[sS]ubject:.*!!SUSPECT!!*/ FILTER smtp:192.168.11.250

正常に動作します。当社の検疫サーバーは、ユーザーに対して信頼できる送信者のリストを生成できます。このホワイトリストは入手可能であり、postfix にダウンロードできます。

質問は、ヘッダーチェックの前にホワイトリストを適用するにはどうすればよいかということです。

 If Subject contains *!!SPAM!!*
  then
   If from contains [email protected] AND if to contains [email protected]
    Then redirect to internal exchange server
    else redirect to quarantine server
  endif
 endif

やり方が分かりません。何かヒントはありますか?

答え1

@masegaloeh からのコメントを受けて、解決策を見つけました。アイデアは、ポリシー サーバーで 10025 をリッスンする 2 番目の postfix SMTP サーバーを用意し、通常のサーバー (ホワイトリストに登録されている場合) または隔離サーバーにメールを送信することです。

このアイデアは、main.cf の header_checks ソリューションとして始まりました。

header_checks = regexp:/etc/postfix/header_checks

header_checks の場合:

/^(S|s)ubject: .*!!(SPAM|BULK|SUSPECT)!!.*/ FILTER  smtp:127.0.0.1:10025

次に、master.cf (@masegaloeh のコメントで編集) で次の操作を実行します。

10025      inet  n       -       n       -       -       smtpd
        -o receive_override_options=no_header_body_checks
        -o smtpd_recipient_restrictions=${my_switcher_restrictions}
policy  unix    -       n       n       -       0       spawn   user=nobody argv=/etc/postfix/policy-server-switcher

これにより、postfix の 2 番目のインスタンスが header_checks の使用をオーバーライドします。

そしてmain.cfでは

my_switcher_restrictions = check_policy_service unix:private/policy

そして、policy-server-switcherの内容

!/bin/bash

sender=""
recipient=""

while read line
    do
    key=$(echo $line | cut -f1 -d=)
    value=$(echo $line|cut -f2 -d=)
    if [ "$key" == "sender" ] 
        then
        sender=${value}
        logger -p mail.info -t PolicyServer "Sender is: ${value}"
        fi
    if [ "$key" == "recipient" ] 
        then
        recipient=${value}
        logger -p mail.info -t PolicyServer "Recipient is: ${value}"
        fi
    if [  "x${recipient}" != "x" ] && [  "x${sender}" != "x" ]
        then
        if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
            then
            echo "action=FILTER smtp:192.168.1.150"
            echo
            exit 0
            fi
        if [ "$sender" == "[email protected]" ] && [ "$recipient" == "[email protected]" ]
            then
            echo "action=FILTER smtp:192.168.1.150"
            echo
            exit 0
            fi
        echo "action=FILTER smtp:192.168.1.151"
        echo
        exit 0
        fi
    done

もちろん、データベースまたは LDAP からホワイトリストをロードするようにポリシー サーバーをプログラムする必要がありますが、ここではアイデアを理解できる例を示します。

しかし、これにはまだいくつかの注意点があります。これをメールで送信するとします

から:[メールアドレス]

に:[メールアドレス]

に:[メールアドレス]

これは、ポリシー サーバーに対する最後のテストで FILTER が通常に返される限り、alphamikevictor と thomas の通常のサーバーに送られますが、alphamikevictor を 2 番目の位置に配置すると、両方の受信者のメールが検疫に送信されます。

関連情報