![Posftwd 与 Posftix 和 amavis 一起使用时会重复计算电子邮件](https://linux22.com/image/767445/Posftwd%20%E4%B8%8E%20Posftix%20%E5%92%8C%20amavis%20%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%E6%97%B6%E4%BC%9A%E9%87%8D%E5%A4%8D%E8%AE%A1%E7%AE%97%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6.png)
我们的 Postfix 邮件服务器使用 Amavis 和 spam assassin 进行垃圾邮件和病毒扫描。我们已按以下方式设置它: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=~/[email protected]/; action=rate(sender/20/60/REJECT only 20 messages per minute for $$sender)
有人能帮助阐明这个问题吗?
答案1
但是……您几乎已经发现了一切!
您有一项附加smtpd
服务,其设置通常master.cf
如下:
smtp:10025 inet n - n - - smtpd
...
Amavis 配置为将邮件重新注入127.0.0.1:10025
(或您使用的任何端口)。这个想法是这样的:您在非默认防火墙端口上运行特殊的私人服务,仅接受已处理的邮件。
这种配置的工作方式如下:
- Postfix 实例之一
smtpd
(邮件交换器或提交器)从外部接收邮件,首次记录(并调用策略服务) - 然后根据配置,将其推送到 Amavis
- Amavis 在处理后,将邮件重新注入 Postfix,但它将其交给
smtpd
配置为不是将邮件返回给 Amavis,因为它认为所有邮件都来自 Amavis - 这个额外的
smtpd
再次记录该邮件(并调用策略服务)然后按照通常的规则转发。
在这种设置中,无法修复双重日志记录,因为这是由这种将 Amavis 插入 SMTP 处理的固有劣质方法造成的。但您仍有办法至少减少这种双重日志记录的影响。您可以为您的附加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 有一种专门的邮件处理方法,称为米尔特(“邮件过滤器”),建议您使用它来代替 SMTP 和重新注入。您可以通过此界面连接 Amavis 或任何其他支持邮件过滤器的应用程序(有很多),您将在邮件系统内获得更清晰的邮件路由路径,并减少日志和其他问题的麻烦。Postfix 将立即拒绝垃圾邮件,而不是排队、检查然后丢弃。阅读 Postfix 的完美手册Postfix 队列前 Milter 支持