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

잘 작동합니다. 당사의 검역 서버는 사용자를 위해 신뢰할 수 있는 발신자 목록을 생성할 수 있습니다. 이 화이트리스트는 사용 가능하며 내 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를 수신하는 두 번째 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의 두 번째 인스턴스가 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에서 화이트리스트를 로드하도록 정책 서버를 프로그래밍해야 합니다. 다음은 아이디어를 얻기 위한 예일 뿐입니다.

하지만 여기에는 여전히 몇 가지 주의 사항이 있습니다. 다음과 같이 메일을 보낸다고 가정해 보겠습니다.

에서:[이메일 보호됨]

에게:[이메일 보호됨]

에게:[이메일 보호됨]

정책 서버에 대한 마지막 테스트에서 FILTER를 정상으로 반환하는 한 이것은 alphamikevictor 및 thomas에 대한 일반 서버로 이동합니다. 그러나 alphamikevictor를 두 번째 위치에 배치하면 두 수신자 모두에게 메일을 격리하도록 보냅니다.

관련 정보