Postfix邮件服务器遭垃圾发送者滥用的阻止方案及SPF配置疑问咨询
嗨,我来帮你梳理下这个问题的解决思路,一步步拆解清楚:
先澄清你关于SPF的核心误解
你担心把SPF的~all改成更严格的规则会导致公司外部无法发邮件——这其实是个错误认知,只要你正确配置SPF记录,把所有合法的邮件发送源都纳入授权范围,完全不会影响正常的邮件收发。
~all是软失败规则,意思是接收方只会标记邮件为可疑,但不会直接拒绝,这就给垃圾发送者留了可乘之机;而-all是硬失败规则,接收方会直接拒绝不符合SPF验证的邮件,能从源头大幅减少伪造发件人的垃圾邮件。
优化SPF记录的具体步骤
- 先整理所有合法的邮件发送源:
- 你的Postfix服务器的公网IP(IPv4和IPv6都要列全,如果有多个服务器的话)
- 公司员工用来发邮件的授权客户端(只要员工是通过你的Postfix服务器SMTP认证发送邮件,不管在公司内还是外,服务器IP已经在SPF里就没问题)
- 任何你授权的第三方邮件服务(比如邮件营销平台、外包邮件服务商等)
- 重新编写SPF记录,格式示例:
把上面的IP和第三方服务域名换成你自己的,最后一定要用v=spf1 ip4:xxx.xxx.xxx.xxx ip6:xxxx:xxxx::xxxx include:your-third-party-service.com -all-all替代原来的~all。
强化Postfix配置,从服务器端阻挡滥用
结合你给出的main.cf配置,我给你几个针对性优化建议:
1. 添加SPF强制检查
先安装policyd-spf插件(大部分Linux发行版的包管理器都能找到,比如Debian/Ubuntu用apt install postfix-policyd-spf-python),然后在main.cf的smtpd_recipient_restrictions里添加一行:
check_policy_service unix:private/policyd-spf
这样Postfix会直接拒绝SPF验证失败的邮件,不用等接收方后续处理。
2. 强化发件人匹配验证
在smtpd_sender_restrictions里加入reject_sender_login_mismatch,这样只有通过SMTP认证的用户,才能使用对应的发件人地址发送邮件,彻底防止外部伪造你公司内部的用户地址。修改后的配置大概是:
smtpd_sender_restrictions = permit_mynetworks permit_sasl_authenticated reject_sender_login_mismatch reject_unknown_sender_domain reject_unknown_reverse_client_hostname reject_unknown_client_hostname policy_time_limit = 3600
3. 确保mynetworks配置正确
检查你的main.cf里的mynetworks参数,它应该只包含公司内部可信的IP段,绝对不能包含外部公网IP,否则会导致开放中继,让垃圾发送者轻易滥用。示例配置:
mynetworks = 127.0.0.0/8 192.168.1.0/24 [::1]/128 [fe80::]/64
4. 临时阻挡当前滥用的IP
从你提供的日志看,垃圾发送者的IP是45.159.74.66,你可以把它加入/etc/postfix/rbl_override文件,内容如下:
45.159.74.66 REJECT
然后执行以下命令让配置生效:
postmap /etc/postfix/rbl_override postfix reload
最后验证配置
修改完SPF和Postfix配置后,你可以通过以下方式验证:
- 用外部设备(比如家里的电脑)通过SMTP认证发送邮件,确认能正常送达
- 用本地的
spfquery命令检查你的SPF记录是否配置正确 - 查看Postfix日志(
/var/log/mail.log或/var/log/maillog),确认垃圾邮件被正确拦截
备注:内容来源于stack exchange,提问作者np1




