别让病毒邮件溜进服务器!Postfix内容过滤:3步拦截垃圾邮件+病毒,还能自动打标签
你是不是每天都要手动删除大量垃圾邮件?员工偶尔收到带病毒的附件,导致电脑中毒?其实Postfix能自动“过滤邮件内容”——就像给服务器装了“安检仪”,垃圾邮件、病毒邮件、带危险附件的邮件,不等进用户邮箱就被拦下。今天用大白话拆解内容过滤的核心逻辑:从“简单关键词过滤”到“专业病毒查杀”,3种实用方案,新手也能让Postfix实现“自动安检”,既省管理员时间,又能保护用户电脑!
一、先搞懂:内容过滤到底滤什么?
Postfix的内容过滤,就是“逐字检查邮件标题和正文,按规则处理”,主要解决3类问题:
- 拦垃圾邮件:含“低价买房”“加微信领福利”等关键词的邮件,直接拒收;
- 防病毒附件:含
.exe、.bat等危险格式附件的邮件,自动隔离; - 打标签分类:把可疑邮件标上“【垃圾邮件嫌疑】”,让用户一眼识别(避免误删合法邮件)。
过滤时机很关键:邮件刚进服务器,还没投到用户邮箱时就检查——这样垃圾邮件不会占用服务器空间,病毒也没机会传到用户电脑。
二、方案一:简单过滤(关键词拦截,5分钟搞定)
如果只是想拦“一眼假”的垃圾邮件(比如含“比特币挖矿”“精准引流”的邮件),不用装复杂软件,用Postfix自带的“标题/正文检查”就能实现,本质是“找关键词,按规则处理”。
1. 配置过滤规则文件
先创建两个规则文件:一个管标题(header_checks),一个管正文(body_checks):
# 1. 创建标题过滤规则(/etc/postfix/header_checks)
cat > /etc/postfix/header_checks << EOF
# 格式:关键词(正则表达式) 处理动作(REJECT=拒收,WARN=只记录)
/free mortgage quote/i REJECT # 不区分大小写,含“免费房贷报价”的标题拒
/repair your credit/i REJECT # 含“修复信用”的标题拒
# 拦截带危险附件的邮件(比如.exe、.bat)
/name=".*\.(exe|bat|vbs)"/i REJECT 危险附件,禁止接收
EOF
# 2. 创建正文过滤规则(/etc/postfix/body_checks)
cat > /etc/postfix/body_checks << EOF
# 含“比特币挖矿”“加微信”的正文拒
/比特币挖矿/i REJECT
/加微信.*领福利/i REJECT
# 含“点击链接”的正文,标警告(不拒收,只记录)
/点击链接/i WARN 可疑链接,请注意
EOF
- 动作说明:
REJECT是直接拒收(给发件人退信),WARN是只在日志记录(不影响邮件投递),HOLD是放到“保留队列”(人工审核后再处理)。
2. 告诉Postfix启用过滤
编辑Postfix主配置文件(/etc/postfix/main.cf),指定规则文件路径:
# 启用标题和正文过滤
header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
# 限制检查范围(正文只查前50KB,避免大邮件拖慢服务器)
body_checks_size_limit = 51200
3. 生效并测试
把规则文件转换成Postfix能识别的格式,再重启服务:
# 生成数据库(Postfix不读文本文件)
postmap /etc/postfix/header_checks
postmap /etc/postfix/body_checks
# 重启Postfix
postfix reload
测试效果:发一封标题含“免费房贷报价”的邮件,会收到退信,日志(/var/log/maillog)里会显示:
postfix/cleanup[12345]: 123456789: reject: header Subject: 免费房贷报价 from unknown[192.168.1.100]; from=<spam@fake.com> to=<kdent@example.com> proto=SMTP helo=<[192.168.1.100]>: 5.7.1 free mortgage quote
——表示标题含关键词,Postfix直接拒收了这封垃圾邮件。
三、方案二:进阶过滤(自动打标签,避免误判)
简单过滤容易“误杀”合法邮件(比如客户的“合作推广方案”被拒),进阶方案是“不拒收,只打标签”——在邮件标题前加“【垃圾嫌疑】”,让用户自己判断,既不遗漏重要邮件,又能提醒用户注意。
1. 写“打标签”规则
修改header_checks文件,把REJECT改成REWRITE(改写标题):
# /etc/postfix/header_checks
# 含“推广”“营销”的标题,加【垃圾嫌疑】标签
/^(Subject:)(.*推广.*)/i REWRITE $1 【垃圾嫌疑】$2
/^(Subject:)(.*营销.*)/i REWRITE $1 【垃圾嫌疑】$2
# 含“点击链接”的标题,加【可疑链接】标签
/^(Subject:)(.*点击链接.*)/i REWRITE $1 【可疑链接】$2
- 原理:把“Subject: 新品推广”改写成“Subject: 【垃圾嫌疑】新品推广”,用户收到后能一眼识别。
2. 生效并测试
postmap /etc/postfix/header_checks
postfix reload
发一封标题为“新品推广方案”的邮件,用户收到后标题会变成“【垃圾嫌疑】新品推广方案”,既不会误删,又能提醒用户谨慎打开。
四、方案三:专业过滤(病毒查杀+智能识别,推荐!)
如果想拦病毒邮件、带宏的Word附件,或者识别“变形垃圾邮件”(比如“免_费_房_贷”),光靠关键词不够,需要搭配专业工具——比如ClamAV(免费病毒查杀)+SpamAssassin(智能垃圾邮件识别),实现“病毒查杀+智能评分”。
1. 安装专业工具
# CentOS/RHEL
yum install clamav clamav-update spamassassin
# Ubuntu/Debian
apt install clamav clamav-freshclam spamassassin
2. 配置Postfix转发给过滤工具
Postfix本身不查杀病毒,需要把邮件“转发给ClamAV/SpamAssassin处理,再决定是否投递”,流程如下:
flowchart TD
A[外部发邮件到example.com] --> B[Postfix收下邮件,先存到临时队列]
B --> C[Postfix把邮件转发给ClamAV(病毒查杀)]
C --> D{含病毒?}
D -->|是| E[Postfix拒收,给发件人退信]
D -->|否| F[Postfix把邮件转发给SpamAssassin(垃圾评分)]
F --> G{评分超过阈值(比如5分)?}
G -->|是| H[打“【垃圾邮件】”标签,投递到用户邮箱]
G -->|否| I[直接投递到用户邮箱]
3. 关键配置(让Postfix联动工具)
编辑main.cf,指定“内容过滤服务”:
# 启用内容过滤,转发给127.0.0.1:10026(ClamAV/SpamAssassin监听端口)
content_filter = smtp:[127.0.0.1]:10026
# 配置过滤后的邮件回传端口(10025)
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
# 新增回传服务(在/etc/postfix/master.cf末尾加)
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o mynetworks=127.0.0.0/8
-o smtpd_recipient_restrictions=permit_mynetworks,reject
4. 启动服务并测试
# 更新病毒库(ClamAV需要最新病毒库才能查杀)
freshclam
# 启动ClamAV和SpamAssassin
systemctl start clamav-daemon spamassassin
systemctl enable clamav-daemon spamassassin
# 重启Postfix
postfix reload
测试效果:发一封带.exe附件的邮件,ClamAV会识别为“危险附件”,Postfix直接拒收;发一封含“加微信领福利”的邮件,SpamAssassin会给它打5分以上,Postfix会在标题加“【垃圾邮件】”标签。
五、避坑:内容过滤常见问题
-
过滤规则不生效,垃圾邮件还是能进来
原因:① 没生成数据库(忘了跑postmap命令);② 规则文件路径写错(main.cf里的header_checks路径不对)。
解决:① 重新运行postmap /etc/postfix/header_checks;② 确认main.cf里的路径和实际文件一致。 -
误判合法邮件,客户说发不过来
原因:关键词太宽泛(比如“推广”“合作”都拒),把客户的合法邮件误拦了。
解决:① 把REJECT改成REWRITE(打标签而非拒收);② 在规则里加“白名单”,比如允许客户域名的邮件:# 在header_checks开头加白名单(客户域名的邮件跳过过滤) /^(From:).*@partner.com/i OK # partner.com的邮件直接过 -
专业过滤时,邮件卡在队列里,不投递
原因:ClamAV/SpamAssassin没启动,或者端口被占用(10026/10025端口被其他程序用了)。
解决:① 用systemctl status clamav-daemon检查服务状态;② 用netstat -tuln | grep 10026看端口是否被占用,换个未占用的端口。
六、总结:内容过滤方案选择口诀
最后给大家整个简单口诀,按需求选对方案:
- 小团队/简单需求:用关键词过滤,5分钟搞定;
- 怕误判合法邮件:用“打标签”方案,不拒收只提醒;
- 要防病毒/智能识别:用ClamAV+SpamAssassin,专业又省心;
- 排错:先看日志(
/var/log/maillog)找“reject”“filter”关键词,缺服务补服务,错路径改路径。
内容过滤的核心不是“拦掉所有可疑邮件”,而是“在‘拦垃圾’和‘保合法’之间找平衡”——小团队不用搞复杂系统,先从关键词过滤起步,随着需求增加再升级方案。下次再收到垃圾邮件,不用手动删,让Postfix自动帮你拦!
此文章为原创文章,作者:胖哥叨逼叨,如若转载,请与我联系并注明出处:https://www.pangshare.com/4264.htm
微信扫一扫