Posftwd 與 Posftix 和 amavis 一起使用時會重複計算電子郵件
我們的 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
(或您使用的任何埠)。這個想法是這樣的:你在非預設防火牆埠上執行特殊的私人服務,只接受處理過的郵件。這種配置的工作方式如下:
- Postfix
smtpd
實例之一,郵件交換器或送出,從外部接收郵件並首次記錄(並呼叫策略服務)- 然後,根據一個配置,將其推入 Amavis
- Amavis 在處理後將郵件重新註入 Postfix,但它會將其提供給
smtpd
配置為不將郵件返回給 Amavis 的特殊實例,因為它希望所有郵件都來自 Amavis- 此附加
smtpd
記錄再次發送郵件(並呼叫策略服務),然後根據通常的規則轉發它。在這種設置中無法修復雙重日誌記錄,因為它是由這種通過 SMTP 將 Amavis 插入處理的固有劣質方式引起的。但是您仍然有辦法至少減少這種雙重日誌記錄的影響。您可以為您的其他
smtpd
實例提供不同的日誌前綴,從而創建一種方法來區分這次處理郵件的人。在 中定義附加smtpd
服務的行之後master.cf
,添加以下行:-o syslog_name=postfix/reinject
(或任何你將用來將它與其他
smtpd
實例、郵件交換器和送出區分開來的東西)。此外,您可以禁用此實例的策略服務處理,因此
postfwd
不會計算郵件兩次。您必須smtpd_*_restrictions
在master.cf
此服務中複製您的所有內容,其中不包括此策略服務:... -o smtpd_recipient_restrictions=...,reject_unauth_destination ...
永遠不要在
master.cf
-o 參數中添加空格!亂七八糟的,我知道。這是因為重新註入的整個設置很混亂。
您可能已經有其他一些參數了;沒關係,它們仍然是必需的。另請注意,這只會改變
smtpd
日誌記錄行為;然後它會將郵件放入公共隊列中,其他守護程序會在其中提取並處理郵件,並且由於我們沒有為它們創建特殊的日誌記錄配置,您將無法輕鬆區分它們是處理原始郵件還是這次處理(提示:郵件隊列 ID 對此很有用)。所以這只是部分修復,但它仍然非常有用。要徹底解決雙重記錄,您必須重新設計您的郵件系統,以便沒有一封郵件會通過它兩次。所以每封郵件都會被計算一次,就像魔法一樣。Postfix 有一種特殊的專用方式來處理郵件,稱為milter(“郵件過濾器”),建議您使用它來代替 SMTP 和重新註入。您可以通過此介面連接 Amavis 或任何其他支持 milter 的應用程序(有無數種),您將在郵件系統內獲得更清晰的郵件路由路徑,並且減少日誌和其他問題的麻煩。Postfix 將立即拒絕垃圾郵件,而不是排隊、檢查然後丟棄。閱讀 Postfix 的完美手冊,了解Postfix before-queue Milter 支持