Postfix :條件標頭檢查

Postfix :條件標頭檢查

這是我的 SMTP 情況。

郵件流由線上中繼提供者標記(!!SPAM!!、!!BULK!! 等)

郵件流由內部後綴接收。傳輸配置為中繼到我們的內部 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

效果很好。我們的隔離伺服器可以為使用者產生可信任寄件者清單。該白名單可用,我可以將其下載到我的後綴。

我的問題是:如何在標頭檢查之前應用我的白名單?

 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 發表評論後,我找到了解決方案。這個想法是讓第二個 postfix SMTP 伺服器透過原則伺服器偵聽 10025,以便將郵件傳送到普通伺服器(如果已列入白名單)或隔離伺服器。

這個想法是從 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 的第二個實例覆蓋 header_checks 的使用。

並在 main.cf 中

my_switcher_restrictions = check_policy_service unix:private/policy

以及策略伺服器切換器的內容

!/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 載入白名單,這裡只是一個範例來了解這個想法。

但這仍然有一些警告,假設我用這個發送郵件

從:[電子郵件受保護]

到:[電子郵件受保護]

到:[電子郵件受保護]

這將轉到alphamikevictor 和thomas 的普通伺服器,只要對策略伺服器的最後一次測試將FILTER 返回到正常狀態,但如果將alphamikevictor 放在第二個位置,那麼它將向兩個收件者發送郵件進行隔離。

相關內容