Postfix

Posftwd 與 Posftix 和 amavis 一起使用時會重複計算電子郵件

  • June 11, 2021

我們的 Postfix 郵件伺服器使用帶有垃圾郵件刺客的 Amavis 進行垃圾郵件和病毒掃描。我們以某種方式對其進行了設置,postfix 將郵件轉發到 amavis 和 amavis,然後將電子郵件重新排隊返回 postfix 以將其發送到目的地。我已經用一個簡單的規則設置了 postfwd 以在發件人門檻值之後拒絕電子郵件,但 Postfwd 重複計算了電子郵件。當我通過 Outlook 作為郵件客戶端發送一封電子郵件時,Postfwd 將其計為兩封。我是 SMTP 協議的新手,正在努力找出問題所在。如果有人可以請幫忙。我粘貼了一些我認為在下面有用的配置片段。

下面是 postconf -n 的輸出

append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
content_filter = amavis:[127.0.0.1]:10024
disable_vrfy_command = yes
dovecot_destination_recipient_limit = 1
enable_original_recipient = no
header_checks = regexp:/etc/postfix/header_checks
inet_interfaces = all
mailbox_size_limit = 0
maximal_backoff_time = 8000s
maximal_queue_lifetime = 7d
minimal_backoff_time = 1000s
mydestination = $myhostname
myhostname = pXXX
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128,XXX
mynetworks_style = host
myorigin = /etc/hostname
readme_directory = no
recipient_delimiter = +
relay_domains = hash:/etc/postfix/relay_recipients
smtp_enforce_tls = no
smtp_helo_timeout = 60s
smtp_tls_note_starttls_offer = yes
smtp_tls_security_level = may
smtp_use_tls = yes
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_client_connection_count_limit = 30
smtpd_client_recipient_rate_limit = 300
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, check_client_access hash:/etc/postfix/whitelist, reject_rbl_client sbl.spamhaus.org
smtpd_data_restrictions = reject_unauth_pipelining
smtpd_delay_reject = yes
smtpd_enforce_tls = no
smtpd_hard_error_limit = 12
smtpd_helo_required = yes
smtpd_helo_restrictions = check_client_access hash:/etc/postfix/whitelist, permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname
smtpd_recipient_limit = 30
smtpd_recipient_restrictions = reject_unauth_pipelining, check_policy_service inet:127.0.0.1:10040, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023
smtpd_relay_restrictions = permit_mynetworks, check_client_access hash:/etc/postfix/whitelist, check_sender_access hash:/etc/postfix/whitelist, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain =
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access, permit_sasl_authenticated, permit_mynetworks, reject_unknown_sender_domain, reject_unauth_pipelining, warn_if_reject reject_sender_login_mismatch, warn_if_reject reject_non_fqdn_sender, warn_if_reject reject_unlisted_sender, warn_if_reject reject_non_fqdn_sender
smtpd_soft_error_limit = 3
smtpd_tls_cert_file = XXX
smtpd_tls_key_file = XXX
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_timeout = 3600s
smtpd_use_tls = yes
tls_random_source = dev:/dev/urandom
transport_maps = hash:/etc/postfix/transport
unknown_local_recipient_reject_code = 450
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf
virtual_gid_maps = static:125
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf
virtual_transport = dovecot
virtual_uid_maps = static:150

後發規則:

id=20perminute; sender=~/Xxxx@xxx.com/; action=rate(sender/20/60/REJECT only 20 messages per minute for $$sender)

任何人都可以幫助解決這個問題嗎?

但是……你已經發現了幾乎所有的東西!

你有一個額外的smtpd服務,通常是master.cf這樣設置的:

smtp:10025      inet  n       -       n       -       -       smtpd
...

Amavis 配置為將郵件重新註入127.0.0.1:10025(或您使用的任何埠)。這個想法是這樣的:你在非預設防火牆埠上執行特殊的私人服務,只接受處理過的郵件。

這種配置的工作方式如下:

  1. Postfixsmtpd實例之一,郵件交換器或送出,從外部接收郵件並首次記錄(並呼叫策略服務)
  2. 然後,根據一個配置,將其推入 Amavis
  3. Amavis 在處理後將郵件重新註入 Postfix,但它會將其提供給smtpd配置為將郵件返回給 Amavis 的特殊實例,因為它希望所有郵件都來自 Amavis
  4. 此附加smtpd 記錄再次發送郵件(並呼叫策略服務),然後根據通常的規則轉發它。

在這種設置中無法修復雙重日誌記錄,因為它是由這種通過 SMTP 將 Amavis 插入處理的固有劣質方式引起的。但是您仍然有辦法至少減少這種雙重日誌記錄的影響。您可以為您的其他smtpd實例提供不同的日誌前綴,從而創建一種方法來區分這次處理郵件的人。在 中定義附加smtpd服務的行之後master.cf,添加以下行:

 -o syslog_name=postfix/reinject

(或任何你將用來將它與其他smtpd實例、郵件交換器和送出區分開來的東西)。

此外,您可以禁用此實例的策略服務處理,因此postfwd不會計算郵件兩次。您必須smtpd_*_restrictionsmaster.cf此服務中複製您的所有內容,其中不包括此策略服務:

...
 -o smtpd_recipient_restrictions=...,reject_unauth_destination
...

永遠不要在master.cf-o 參數中添加空格!

亂七八糟的,我知道。這是因為重新註入的整個設置很混亂。

您可能已經有其他一些參數了;沒關係,它們仍然是必需的。另請注意,這只會改變smtpd日誌記錄行為;然後它會將郵件放入公共隊列中,其他守護程序會在其中提取並處理郵件,並且由於我們沒有為它們創建特殊的日誌記錄配置,您將無法輕鬆區分它們是處理原始郵件還是這次處理(提示:郵件隊列 ID 對此很有用)。所以這只是部分修復,但它仍然非常有用。


要徹底解決雙重記錄,您必須重新設計您的郵件系統,以便沒有一封郵件會通過它兩次。所以每封郵件都會被計算一次,就像魔法一樣。Postfix 有一種特殊的專用方式來處理郵件,稱為milter(“郵件過濾器”),建議您使用它來代替 SMTP 和重新註入。您可以通過此介面連接​​ Amavis 或任何其他支持 milter 的應用程序(有無數種),您將在郵件系統內獲得更清晰的郵件路由路徑,並且減少日誌和其他問題的麻煩。Postfix 將立即拒絕垃圾郵件,而不是排隊、檢查然後丟棄。閱讀 Postfix 的完美手冊,了解Postfix before-queue Milter 支持

引用自:https://serverfault.com/questions/1066381