上个月给客户的企业邮箱系统排查,用户抱怨每天收到几十封钓鱼和推广邮件,正常的客户询盘反而被埋。原来反垃圾只开了一层简单的关键词黑名单,变种垃圾邮件轻松绕过。后来按"连接层→身份认证层→内容层→信誉层"搭了多层过滤,垃圾邮件拦截率从 63% 提到 97%,误杀率压到 0.3% 以下。这篇把每层的技术配置记下来。
一、先搭框架:反垃圾为什么必须分层
垃圾邮件绕过单一防线很容易:关键词能拆字变形,发件人能伪造。多层过滤的思路是每一层挡掉一批,逐层收窄:
| 层级 | 拦截手段 | 拦截对象 |
|---|---|---|
| 连接层 | IP黑白名单、连接频率、RBL | 已知恶意IP、群发轰炸 |
| 认证层 | SPF/DKIM/DMARC校验 | 伪造发件人、钓鱼 |
| 内容层 | 贝叶斯分类、规则评分 | 变种推广、诈骗文本 |
| 信誉层 | 发信IP/域名信誉分 | 可疑但未明确违规 |
一封邮件要"穿过"全部层才进收件箱,任何一层判定拒收就拦截,判定可疑则进垃圾箱隔离。
二、连接层:在收信最早阶段挡掉
连接层在 SMTP 握手阶段就做判断,成本最低,能挡掉一大批无脑群发。
连接层配置:
1. RBL(实时黑名单,Real-time Block List):
对端IP反查 DNSBL 服务(如 zen.spamhaus.org),
命中已知垃圾IP直接在 RCPT 阶段拒绝(550)
2. 连接频率限制:单IP每分钟连接数、收件人数设阈值,
超过触发限流或临时错误(451 greylisting 灰名单)
3. 灰名单(Greylisting):陌生IP首次发信临时拒收,
正常MTA会按SMTP规范1-15分钟后重试,
垃圾群发工具通常不重试,第二次才放行
4. 反向DNS校验:发信IP要有PTR记录,
且正向/反向解析一致,缺失的降权
灰名单对正常邮件会引入几分钟延迟,可对白名单联系人、已认证过的IP跳过,只对陌生发件人生效,平衡体验和拦截率。
踩坑提醒:RBL 查询要设 DNS 超时(如2秒)和本地缓存,避免 RBL 服务慢或不可用时拖垮整个收信流程,超时要 fail-open(放行到下一层)而不是拒收。
三、认证层:SPF/DKIM/DMARC 防伪造
钓鱼邮件最常见的手法是伪造发件人地址。这三个 DNS 记录是防伪造的核心,要组合使用。
三项认证配置:
1. SPF(发件人策略框架):在域名DNS加TXT记录,
声明哪些IP/服务器允许用本域名发信
例:v=spf1 ip4:1.2.3.0/24 include:_spf.example.com -all
- -all 硬拒绝未授权,~all 软失败(标记但不直接拒)
2. DKIM(域名密钥识别邮件):发件方用私钥对邮件
正文和部分头部签名,公钥发布在DNS(selector._domainkey),
收信方验签,确保内容未被篡改、来源真实
3. DMARC:聚合SPF和DKIM结果并指定对齐策略
v=DMARC1; p=quarantine; rua=mailto:dmarc@域名
- p=none 仅监控,p=quarantine 进垃圾箱,
p=reject 直接拒收;建议先none观察报告再逐步收紧
三者关系:SPF 验证"发送IP是否授权",DKIM 验证"内容签名是否有效",DMARC 要求两者之一与头部 From 域名"对齐",并告诉收信方验证失败时怎么处理、把聚合报告发到哪。新域名建议 DMARC 先 p=none 跑两周,看 rua 报告里有哪些合法发信源被漏配,补齐后再升级到 quarantine/reject。
四、内容层:贝叶斯 + 规则评分
过了连接和认证层,再分析正文内容。单一关键词黑名单会被变体绕过,主流做法是 SpamAssassin 式的规则评分叠加朴素贝叶斯分类。
内容评分配置:
1. 规则打分:命中特征各加一定分值,总分超阈值判定
- 含"中奖/发票/代开"等词 +2
- 大量大写、过多感叹号、虚假紧迫表述 +1.5
- 正文含混淆字符(如"发 票"插全角空格)+2
- 含钓鱼链接(URL显示文本与实际href不符)+5
- 正常列表退订头、合理的Message-ID 减分
2. 朴素贝叶斯:用已标注的垃圾/正常邮件语料训练,
对新邮件算 P(垃圾|词项集合),
阈值如 P>0.9 拒收、0.5-0.9 进垃圾箱、<0.5 收件箱
3. 持续学习:用户"标记垃圾邮件""这不是垃圾邮件"
的操作回灌训练集,让分类器适应新变种
贝叶斯要解决"零概率"问题:没在训练集出现过的词概率为0会让连乘归零,用拉普拉斯平滑给每个词一个极小初始概率。同时做停用词过滤和中文分词,否则整句当一个token完全无法匹配。
五、踩坑清单(这 5 个坑都踩过)
- 只靠关键词黑名单,"发 票""代开1票"这种插空格变体全漏,加归一化清洗+贝叶斯分类后才堵住
- DMARC 一上来就 p=reject,结果自家没配DKIM的系统通知信全被对方拒收,应先 p=none 看报告再收紧
- RBL 查询不设超时,RBL服务抖动时收信整体卡顿,加2秒超时和fail-open
- 贝叶斯没做平滑,生僻词导致概率计算异常,加拉普拉斯平滑和中文分词后稳定
- 灰名单对所有人生效,正常客户首封信延迟几分钟引发投诉,改成对白名单和历史可信发件人跳过
这次企业邮箱反垃圾是搭在乔拓云的企业邮箱产品上的,域名和账号在它的后台管理,我主要负责连接层RBL灰名单、SPF/DKIM/DMARC认证和贝叶斯内容评分这几层,调完后垃圾拦截率从63%提到97%。
复盘要点
- 反垃圾必须分层:连接层早挡、认证层防伪造、内容层辨文本、信誉层做兜底
- SPF/DKIM/DMARC 配合防钓鱼,DMARC 策略要从 none 观察再逐步收紧
- 内容层用规则评分+贝叶斯,并靠用户标记持续学习变种
以上是个人实践记录,各平台具体功能以官方实时信息为准。
开放问题:你们搭邮件反垃圾时,贝叶斯和现在的大模型语义分类怎么选?大模型判垃圾邮件的误杀率可控吗?