概述

邮件服务器的反垃圾和反病毒能力直接关系到用户安全和系统信誉。Postfix 提供了多种集成反垃圾引擎的方式:内容过滤器(content_filter)、Milter(Sendmail 风格的邮件过滤协议)和代理服务。Dovecot 侧则可以通过 Sieve 脚本和服务端插件在投递阶段进行二次过滤。本文逐一分析各方案的部署方法与优劣。

集成架构总览

方案调用位置延迟影响优点缺点
content_filter (amavisd-new)Postfix cleanup 后成熟、功能全、支持多后端需重启一个额外的服务进程
Milter (clamav-milter / rspamd-milter)SMTP DATA 结束后延迟低、协议标准、无需额外 MTA不支持对已入列邮件二次检查
Proxy (rspamd-proxy)SMTP 会话过程中最低可实时拒绝,数据流直通实现复杂,调试困难
Dovecot 侧 (Sieve + antispam 插件)投递后无(不阻塞投递)不影响 SMTP 吞吐只能隔离,无法拒绝入列

ClamAV 集成

方案 A:content_filter → amavisd-new → ClamAV

经典三件套架构,amavisd-new 作为内容过滤器后台,调用 ClamAV 进行病毒扫描和 SpamAssassin 进行垃圾评分。

# master.cf — 添加 amavisd-new filter 服务
smtp-amavis  unix  -       -       y       -       2       smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20

127.0.0.1:10025 inet  n       -       y       -       -       smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks=127.0.0.0/8
  -o strict_rfc821_envelopes=yes
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8

然后在 main.cf 中启用内容过滤器:

content_filter = smtp-amavis:[127.0.0.1]:10024

方案 B:clamav-milter

配置较为简洁,适合仅需要反病毒的场景:

# main.cf
smtpd_milters = inet:127.0.0.1:7357
non_smtpd_milters = inet:127.0.0.1:7357
milter_protocol = 6
milter_default_action = tempfail

# clamav-milter 配置 (clamav-milter.conf)
MilterSocket inet:7357@127.0.0.1
ClamdSocket tcp:127.0.0.1:3310
OnInfected Reject
AddHeader Replace

Rspamd 集成

Rspamd 是目前邮件社区最活跃的反垃圾引擎之一,使用自研的模糊哈希算法,资源占用低且规则更新快。

rspamd-proxy 模式(推荐)

Rspamd 代理模式直接嵌入 SMTP 会话,可以在 DATA 阶段实时拒绝垃圾邮件而不先接收完整邮件:

# main.cf
smtpd_milters = inet:127.0.0.1:11332
non_smtpd_milters = inet:127.0.0.1:11332
milter_protocol = 6
milter_mail_macros = {auth_type} {auth_author} {auth_authen}

# 启用 rspamd 对出站邮件也进行扫描(可选)
# 出站 milter 配置点在 master.cf 对应 submission 端口中指定

Rspamd Web UI

Rspamd 自带 rspamd-controller,提供 Web 管理界面(默认端口 11334):

# rspamd.conf
worker "controller" {
  bind_socket = "127.0.0.1:11334";
  type = "controller";
  enable_password = "your-password";
}

通过 Web UI 可以查看实时扫描统计、符号命中率、学习训练效果以及调整评分阈值。

Rspamd 学习(贝叶斯)

# rspamc 命令行学习
rspamc learn_spam /path/to/spam.mbox
rspamc learn_ham /path/to/ham.mbox

# 与 Dovecot 联动:用户从 Junk 文件夹移回 Inbox 则自动学习为 ham
# 需在 dovecot.conf 启用 antispam 插件

SpamAssassin 集成

spamass-milter

spamass-milter 是 SpamAssassin 的 Milter 封装,配置简洁:

# main.cf
smtpd_milters = inet:127.0.0.1:783
milter_protocol = 6

# 启动 spamass-milter
spamass-milter -p 127.0.0.1:783 -u sa-milt -- -x /etc/mail/spamassassin/local.cf

dspam

DSPAM 是一个基于统计学习的反垃圾系统,特色为个体用户级别训练:

# main.cf — 通过 content_filter 集成
content_filter = dspam:[127.0.0.1]:6277

DSPAM 对每个收件人维护独立的语料库,准确率在高流量场景下表现优秀,但维护成本较高。

集成架构比较

内容过滤器

Milter

代理模式

性能优化

资源隔离

反垃圾引擎对 CPU 和内存的消耗不容忽视:

扫描超时设置

# postfix main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024
smtp-amavis_destination_concurrency_limit = 4
smtp-amavis_connect_timeout = 30
smtp_data_done_timeout = 300

# amavisd-new — 设置各引擎超时
$child_timeout = 120;
$MAXLEVELS = 10;
$MAXFILES = 1500;

白名单/灰名单

减少对可信发件人的扫描,节省资源:

# Rspamd 白名单 /etc/rspamd/local.d/whitelist.inc
whitelist = {
  "sender" = "newsletter@trusted.com";
  "ip" = "198.51.100.0/24";
  "from" = "*.bank.com";
}

# Postfix 跳过内容过滤器
# 在 main.cf 的 smtpd_recipient_restrictions 前加上
check_client_access hash:/etc/postfix/whitelist_filter_skip

灰名单策略

Postfix 内置的灰名单(greylisting)机制配合 Rspamd 的灰名单模块,可以在响应阶段即过滤大量批量发送的垃圾邮件,有效减轻下游扫描引擎的负载。

Dovecot 侧集成

Dovecot 可以通过 antispam 插件与后端反垃圾引擎联动:

plugin {
  antispam_backend = rspamc
  antispam_spam = Junk
  antispam_trash = Trash
  antispam_allow_append_to_spam = yes
}

用户将邮件移入/移出 Junk 文件夹时,Dovecot 自动触发 rspamc learn_spam / learn_ham,持续优化垃圾评分模型。