これが私の 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 番目の位置に配置すると、両方の受信者のメールが検疫に送信されます。