如何阻止发件人为自身邮箱地址的垃圾邮件?(Postfix/Dovecot自建邮件服务器环境)
嘿,我之前也碰到过这种糟心的情况——垃圾邮件伪装成自己给自己发,防不胜防!看了你的邮件头和配置,发现几个关键问题,咱们一步步来解决:
首先你得注意:这些垃圾邮件的Return-Path是空的(也就是Envelope Sender为空),而你设置的SPF是针对自己域名的发件人,但SPF默认检查的是Envelope Sender,不是邮件头里的From,所以这类伪造From的邮件根本触发不了你的SPF规则,这就是为啥之前的policy service没起作用。
给你几个实用的配置方案:
1. 限制只有授权用户才能用你的域名发件
咱们先确保只有你自己(通过Dovecot SASL认证)或者你的服务器能以me@mydomain.com的身份发邮件,外部IP直接拒绝:
- 创建一个发件人访问控制文件
/etc/postfix/sender_access,内容如下:me@mydomain.com reject_unauth_destination - 执行
postmap /etc/postfix/sender_access生成哈希表 - 打开
/etc/postfix/main.cf,修改smtpd_sender_restrictions,把这个检查加进去:
这个规则的意思是:如果发件人是你的邮箱,但发件方没有经过授权(既不是你登录认证的,也不是你的内网服务器),直接拒绝。smtpd_sender_restrictions = reject_non_fqdn_sender, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/sender_access, permit_sasl_authenticated, permit_mynetworks, reject
2. 拦截伪造From且Envelope Sender为空的垃圾邮件
针对那些伪造你邮箱作为From,但实际没有合法发件人的邮件(Return-Path为空),咱们用Postfix的header_checks来拦截:
- 创建
/etc/postfix/header_checks文件,添加规则:/^From:.*<me@mydomain.com>$/ check_sender_access hash:/etc/postfix/sender_access_for_from - 再创建
/etc/postfix/sender_access_for_from文件:<> reject - 分别执行
postmap /etc/postfix/header_checks和postmap /etc/postfix/sender_access_for_from - 在
main.cf里添加启用这个检查:
这样一来,只要邮件头里的From是你的邮箱,但实际发件人是空的,直接就被拦下来了。header_checks = regexp:/etc/postfix/header_checks
3. 完善SPF和启用DMARC/DKIM
你的SPF记录已经有了,但建议补充DKIM签名(在Postfix里配置opendkim插件),然后给域名加一条DMARC记录:
v=DMARC1; p=quarantine; sp=quarantine; rua=mailto:dmarc@mydomain.com
DMARC会强制接收方检查SPF和DKIM,任何伪造你域名的邮件如果通不过这两项验证,要么被隔离要么直接拒绝,从根源上减少伪造邮件的可能性。
4. 调整smtpd_recipient_restrictions的顺序
确保你的check_policy_service放在合适的位置,建议顺序是:
smtpd_recipient_restrictions = reject_non_fqdn_recipient, reject_unknown_recipient_domain, permit_sasl_authenticated, permit_mynetworks, check_policy_service unix:private/policy, check_spf, permit_auth_destination, reject
先处理明显的无效收件人,再允许授权用户,然后检查policy和SPF,最后拒绝其他所有邮件。
改完这些配置后,记得执行postfix reload让配置生效,观察几天应该就能解决这种伪造自己邮箱的垃圾邮件了!
备注:内容来源于stack exchange,提问作者Qian Chen

