我们的 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=~/[email protected]/; action=rate(sender/20/60/REJECT only 20 messages per minute for $$sender)
任何人都可以帮助解决这个问题吗?
但是……你已经发现了几乎所有的东西!
你有一个额外的
smtpd
服务,通常是master.cf
这样设置的:Amavis 配置为将邮件重新注入
127.0.0.1:10025
(或您使用的任何端口)。这个想法是这样的:你在非默认防火墙端口上运行特殊的私人服务,只接受处理过的邮件。这种配置的工作方式如下:
smtpd
实例之一,邮件交换器或提交,从外部接收邮件并首次记录(并调用策略服务)smtpd
配置为不将邮件返回给 Amavis 的特殊实例,因为它希望所有邮件都来自 Amavissmtpd
记录再次发送邮件(并调用策略服务),然后根据通常的规则转发它。在这种设置中无法修复双重日志记录,因为它是由这种通过 SMTP 将 Amavis 插入处理的固有劣质方式引起的。但是您仍然有办法至少减少这种双重日志记录的影响。您可以为您的附加
smtpd
实例提供不同的日志前缀,从而创建一种方法来区分这次处理邮件的人。在 中定义附加smtpd
服务的行之后master.cf
,添加以下行:(或任何你将用来将它与其他
smtpd
实例、邮件交换器和提交区分开来的东西)。此外,您可以禁用此实例的策略服务处理,因此
postfwd
不会计算邮件两次。您必须smtpd_*_restrictions
在master.cf
此服务中复制您的所有内容,其中不包括此策略服务:永远不要在
master.cf
-o 参数中添加空格!乱七八糟的,我知道。这是因为重新注入的整个设置很混乱。
您可能已经有其他一些参数了;没关系,它们仍然是必需的。另请注意,这只会改变
smtpd
日志记录行为;然后它将邮件放入公共队列中,其他守护程序将在其中提取并处理它,并且由于我们没有为它们创建特殊的日志记录配置,您将无法轻松区分它们是处理原始邮件还是这次处理(提示:邮件队列 ID 对此很有用)。所以这只是部分修复,但它仍然非常有用。要彻底解决双重记录,您必须重新设计您的邮件系统,以便没有一封邮件会通过它两次。所以每封邮件都会被计算一次,就像魔法一样。Postfix 有一种特殊的专用方式来处理邮件,称为milter(“邮件过滤器”),建议您使用它来代替 SMTP 和重新注入。您可以通过此接口连接 Amavis 或任何其他支持 milter 的应用程序(有无数种),您将在邮件系统内获得更清晰的邮件路由路径,并且减少日志和其他问题的麻烦。Postfix 将立即拒绝垃圾邮件,而不是排队、检查然后丢弃。阅读 Postfix 的完美手册,了解Postfix before-queue Milter 支持