学习并尝试理解
上周,我一直在学习 Postfix 可以做些什么来帮助减少垃圾邮件。如果我理解正确的话,不同的*_restrictions
配置参数控制什么时候检查完成后,列出限制清单,如permit_mynetworks
和check_client_access
控制什么已检查。对吗?
如果我理解正确的话,检查是按以下顺序进行的:
- smtpd_客户端限制
- smtpd_helo_restrictions
- smtpd_sender_restrictions
- smtpd_relay_restrictions
- smtpd_recipient_restrictions
对吗?如果我理解正确的话,smtpd_delay_reject
这不会影响检查的顺序,只会影响什么时候拒绝的是发送。 正确的?
我的服务器设置
smtpd_relay_restrictions
我的 Plesk 11 服务器上似乎没有设置配置参数。我的 Postfix 版本是 2.8.4 。
我还注意到,有些检查在不同的配置参数下列出多次。它们需要列出多次吗?
这是我当前的配置:
smtpd_sender_restrictions =
check_sender_access hash:/var/spool/postfix/plesk/blacklists
permit_sasl_authenticated
check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
smtpd_client_restrictions =
permit_mynetworks
smtpd_recipient_restrictions =
permit_mynetworks
check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
permit_sasl_authenticated
reject_unauth_destination
如果我理解正确的话,那就相当于这样:
smtpd_sender_restrictions =
smtpd_client_restrictions =
smtpd_recipient_restrictions =
permit_mynetworks
check_sender_access hash:/var/spool/postfix/plesk/blacklists
permit_sasl_authenticated
check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
permit_mynetworks
check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
permit_sasl_authenticated
reject_unauth_destination
黑名单文件是空的。no_auth 文件包含以下内容:
/^/ PREPEND X-No-Auth: unauthenticated sender
并且 no_relay 文件有以下内容:
/^/ PREPEND X-No-Relay: not in my network
如果我理解正确的话,最后两个会将标题添加到所有尚未允许的电子邮件中。
担忧
反复检查
当多次列出时,Postfix 是否会再次执行检查?或者 Postfix 是否知道它已经进行了该检查?如果多次执行检查,这似乎是一种浪费。如果没有多次执行,no_auh/no_relay 标头是否在所有情况下都正确添加?缺少 smtpd_relay_restrictions
摘录自Postfix SMTP 中继和访问控制注意:Postfix 2.10 之前的版本没有 smtpd_relay_restrictions。它们将邮件转发和垃圾邮件阻止策略合并在 smtpd_recipient_restrictions 下。这可能会导致意外结果。例如,宽松的垃圾邮件阻止策略可能会意外地导致宽松的邮件转发策略。
另一段摘录:
有些人建议将所有访问限制都放在 smtpd_recipient_restrictions 列表中。不幸的是,这可能会导致访问过于宽松。
所以我不想列出 下的所有限制
smtpd_recipient_restrictions
,但有多个限制,并且在不同的限制下进行相同的检查会造成混淆。只使用smtpd_recipient_restrictions
和smtpd_relay_restrictions
并忽略客户端、helo、发送者是否安全?黑名单
这个黑名单是不是在列表中比较靠前的位置?如果发件人是我的网络的一部分并且可以进行身份验证,我真的应该根据发件人的电子邮件进行阻止吗?现在表格是空的,但我不确定哪个 Plesk 组件可能会将电子邮件地址添加到该表格中。这也违反了要求 100% 投递到 postmaster@ 和 abuse@ 地址的 RFC。
这就是我想要实现的目标
- 保持相当简单
- 确保我不会创建开放中继或其他安全漏洞
- 确保我不会屏蔽有效的电子邮件
- 将虚拟别名表中存在的 postmaster@ 和 abuse@ 地址列入白名单
- 将来自中国/韩国的垃圾邮件发送者的 IP 地址列入黑名单
- 使用正则表达式拒绝使用 catch-all 的域上除特定收件人地址之外的所有收件人地址。我在一个域上使用 catch-all,因此我可以使用 VERP-y 退回地址,即使 Plesk 不支持 VERP。
我的想法如下
在 /etc/postfix/main.cf 中
#smtpd_client_restrictions =
#smtpd_helo_restrictions =
#smtpd_sender_restrictions =
smtpd_relay_restrictions =
permit_mynetworks
check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
permit_sasl_authenticated
check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
reject_unauth_destination
smtpd_recipient_restrictions =
check_recipient_access pcre:/etc/postfix/custom/recipient_checks.pcre
check_client_access cidr:/etc/postfix/custom/sinokorea.cidr
check_sender_access hash:/var/spool/postfix/plesk/blacklists
在 /etc/postfix/custom/recipient_checks.pcre 中
# Always accept mail to postmaster@ and abuse@
/^postmaster@/ OK
/^abuse@/ OK
# Reject all mail sent to mailapp.ourdomain.com
# except for certain specific recipients
# and bounce messages which may use VERP
if /@mailapp\.ourdomain\.com$/
!/^(?:validuser|anothervalid|bounces(?:\+.+)?)@/ REJECT
endif
我遇到过@
在正则表达式中使用转义的示例。这不是特殊字符,对吗?
我提议的配置能实现我想要的吗?
(请注意自己和其他阅读此文的 Plesk 用户 - 可能需要执行 cron 作业来定期恢复对 main.cf 文件的更改,因为某些 Plesk 操作似乎会覆盖此文件。)
答案1
好的,这个问题很长。我会尝试回答上述问题的一部分。也许会根据这些问题总结一下。
免责声明:我没有使用过 plesk,但我使用过 postfix。这个问题已经存在一年多了,所以也许 plesk 已经更新了他们的 postfix 配置。但我认为这个问题对于设计和实施 postfix 限制的人来说很有用
Q1:这两个配置等效吗?
smtpd_sender_restrictions =
check_sender_access hash:/var/spool/postfix/plesk/blacklists
permit_sasl_authenticated
check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
smtpd_client_restrictions =
permit_mynetworks
smtpd_recipient_restrictions =
permit_mynetworks
check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
permit_sasl_authenticated
reject_unauth_destination
和
smtpd_sender_restrictions =
smtpd_client_restrictions =
smtpd_recipient_restrictions =
permit_mynetworks
check_sender_access hash:/var/spool/postfix/plesk/blacklists
permit_sasl_authenticated
check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
permit_mynetworks
check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
permit_sasl_authenticated
reject_unauth_destination
如果电子邮件来自 mynetworks,则不会被/var/spool/postfix/plesk/no_relay.re
和检查/var/spool/postfix/plesk/no_relay.re
。这意味着电子邮件将已接受且未改变就 postfix 操作(REJECT、ACCEPT)而言,它不会有所不同,但对于 plesk 来说,这两个标头可能重要的。
问题 2:Postfix 是否会在多次列出时再次执行检查?或者 Postfix 是否知道它已经执行了该检查?如果多次执行检查,这似乎是一种浪费。如果没有多次执行,no_auh/no_relay 标头是否在所有情况下都正确添加?
是的,重复两次检查可能看起来很浪费。但是这些重复的检查将被放置在不同的位置/限制中。在每次检查中,Postfix 都会根据一些逻辑或算法来处理电子邮件。如果检查很繁重,您可能会担心重复检查,例如检查策略服务或 DNSBL。对于轻量级检查,例如允许我的网络,你可以忽略它。
Q3:仅使用 smtpd_recipient_restrictions 和 smtpd_relay_restrictions 并忽略客户端、helo、发送方是否安全?
好吧,两个 smtpd_recipient_restrictions 和 smtpd_relay_restrictions 应该足以实现一些高级限制。但这适用于 postfix >= 2.10。对于使用 postfix < 2.10 的用户,您可以在多个指令中放置检查,这样 postfix 就不会变得太宽容。
Q4:我提议的配置能实现我想要的吗?
是的,简化了您当前的 postfix 限制,做得很好。但请注意,postfix 是 plesk 的一部分。plesk 的工程师可能会出于模块化或简单维护等原因安排这些限制。
概括:
- 不建议将所有限制都放在 smtpd_*_restriction 中。
- 因此,您可以对 postfix >= 2.10 使用 smtpd_relay_restriction 或对 postfix < 2.10 使用其他限制检查
答案2
无论你做什么,离开家时请务必携带以下物品:
smtpd_client_restrictions = reject_rbl_client zen.spamhaus.org, reject_rbl_client bl.spamcop.net
这些已经吸引了我大部分的注意力。