如何缓解Postfix+Amavis+Dovecot邮件服务器中绕过过滤的合法样式垃圾邮件泛滥问题
这种情况我之前处理过好几次,确实挺棘手的——毕竟都是过了SPF/DKIM的合法源,常规的IP封锁和内容过滤基本没用。结合你用的Postfix+Amavis+Dovecot栈,给你几个实际可行的解决思路,从服务器端到收件箱端层层拦截:
启用Postgrey灰名单拦截批量群发邮件
灰名单的核心逻辑是给首次联系的发件IP设置一个5-10分钟的冷却期,正规邮件服务器会自动重试,而批量群发的垃圾邮件大多不会花时间处理延迟请求,刚好能命中你遇到的这种"被批量订阅newsletter"的场景。- 先安装postgrey(不同系统命令略有差异,比如Debian/Ubuntu用
apt install postgrey) - 编辑Postfix的
main.cf配置文件,在smtpd_recipient_restrictions中添加灰名单检查规则:smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated ... # 保留你原有的其他规则 check_policy_service unix:private/postgrey - 重启相关服务生效:
systemctl restart postfix postgrey
- 先安装postgrey(不同系统命令略有差异,比如Debian/Ubuntu用
用Amavis自定义特征评分标记垃圾邮件
虽然邮件内容不同,但这类newsletter垃圾邮件几乎都带有List-Unsubscribe或List-ID头部,你可以在Amavis中针对这些特征添加额外垃圾分,让它们触发拦截或标记。
打开Amavis的用户自定义配置文件(比如/etc/amavis/conf.d/50-user),添加以下Perl规则:# 给带List-Unsubscribe头部的邮件加垃圾分 $sa_local_tests{LIST_UNSUBSCRIBE} = { description => 'Contains List-Unsubscribe header', score => 3.0, # 分数可根据你现有垃圾阈值调整 test => sub { return exists $_[0]->{'headers'}->{'list-unsubscribe'}; }, }; # 给带List-ID头部的邮件加垃圾分 $sa_local_tests{LIST_ID} = { description => 'Contains List-ID header', score => 2.5, test => sub { return exists $_[0]->{'headers'}->{'list-id'}; }, };保存后重启Amavis:
systemctl restart amavis用Dovecot Sieve做收件箱端精准分流
如果不想直接拦截,而是把这类邮件自动归档,Sieve脚本是非常灵活的选择。创建或编辑用户的Sieve脚本(比如~/.dovecot.sieve):require ["fileinto", "header", "regex"]; # 把带订阅类头部的邮件自动归档到Newsletter文件夹 if anyof( header :exists "List-Unsubscribe", header :exists "List-ID" ) { fileinto "Newsletter"; stop; } # 结合Amavis的垃圾得分,直接标记为垃圾邮件 if header :contains "X-Spam-Score" "5.0" { # 分数匹配你的Amavis垃圾阈值 fileinto "Junk"; stop; }重启Dovecot生效:
systemctl restart dovecot,这样收件箱就不会被这类邮件占满,你可以定期清理归档文件夹。应急:临时限制收件频率
如果当前轰炸情况特别紧急,可以先通过Postfix限制单收件人或单IP的邮件接收频率,快速降低垃圾邮件数量:
在main.cf中添加:smtpd_recipient_rate_limit = 100 # 单个收件人每小时最多接收100封邮件,按需调整 smtpd_client_message_rate_limit = 50 # 单个IP每小时最多发送50封邮件,按需调整重启Postfix后即可生效,给你留出时间配置更精细的过滤规则。
备注:内容来源于stack exchange,提问作者Nick Wiltshire




