如何从Postfix的mail.log提取发件域名并生成自动拒接规则?
自动拦截垃圾邮件发件域名的Postfix配置方案
我之前碰到过一模一样的问题:Postfix已经配了policy-spf和DKIM,虽然能正常拒绝垃圾邮件连接,但手动筛选太麻烦,想通过smtpd_sender_restrictions自动拦截这些垃圾发件域名。
先看一条典型的拒绝日志参考:
Dec 30 07:34:09 mx postfix/smtpd[23855]: NOQUEUE: reject: RCPT from unknown[120.33.244.87]: 450 4.7.1 Client host rejected: cannot find your hostname, [120.33.244.87]; from=hcsales6@printingpress.xicp.net to=nishant@mydomain.com proto=SMTP helo=<printingpress.xicp.net>
之前用Perl命令提取的是IP,不符合需求,后来结合@Polar Bear的方案,整理出了完整的自动拦截流程:
1. 修改Postfix主配置
编辑/etc/postfix/main.cf,添加或更新发件人限制规则,让Postfix读取自定义黑名单:
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/blacklist
2. 编写自动生成黑名单的脚本
创建blacklist.sh脚本,用来从日志里提取被拒绝的发件域名,去重后写入黑名单:
#!/bin/bash # 从mail.log中匹配被拒绝的发件域名,输出「域名 REJECT」格式 perl -ne 'print "$1 REJECT\n" if /NOQUEUE:\s+reject:.*?from=<\w+@(.*?)>/' /var/log/mail.log | sort | uniq >> /etc/postfix/blacklist # 生成Postfix可识别的哈希映射表 postmap /etc/postfix/blacklist # 重启Postfix使配置生效 service postfix restart
3. 给脚本添加执行权限
chmod 755 blacklist.sh
4. 设置定时任务自动执行
添加cron定时任务,让脚本每天夜间自动运行(比如凌晨2点):
# 打开cron编辑界面 crontab -e # 添加以下行,替换/path/to为脚本实际路径 0 2 * * * /path/to/blacklist.sh
额外优化:拦截SASL登录失败IP
我还额外加了个每3小时执行的cron任务,专门拦截频繁尝试SASL登录失败的IP,进一步强化服务器的垃圾邮件防御能力。
内容的提问来源于stack exchange,提问作者Sachin G.
相关产品推荐
相关产品推荐

