Postfix 构建企业级邮件系统(十一):反垃圾邮件

别让垃圾邮件塞满服务器!Postfix反垃圾配置:5步挡住90%垃圾邮件,还不误判合法邮件

你是不是每天都要面对这些糟心事?服务器队列里堆满寄给“不明用户”的垃圾邮件、用户抱怨邮箱被广告塞满、甚至自己的服务器被当成垃圾邮件跳板——其实Postfix自带一套“反垃圾武器”,不用装复杂软件,配置好就能挡住大部分垃圾邮件。今天用大白话拆解Postfix反垃圾的核心逻辑:从“拦在门外”到“内容过滤”,5个关键步骤,新手也能学会如何在“挡垃圾”和“不误判合法邮件”之间找到平衡!

一、先搞懂:垃圾邮件为啥难防?

垃圾邮件发送者最擅长“钻空子”,常见套路有3种:

  1. 伪装地址:发件人地址是假的(比如伪装成admin@example.com),退信也找不到他;
  2. 字典攻击:用“常见人名+你的域名”瞎猜地址(比如zhang@example.comli@example.com),就算99%不存在,只要1%命中就赚;
  3. 蹭转发:找没配置好的Postfix服务器当“跳板”,用你的服务器发垃圾邮件,最后锅算你的。

Postfix反垃圾的核心思路就是“层层拦截”:先在SMTP对话阶段把明显的垃圾邮件拦在门外,再检查邮件内容过滤可疑邮件,最后给用户留手动判断的余地——既不“一刀切”误判合法邮件,也不让垃圾邮件轻易进来。

二、第一步:拦在门外——SMTP阶段就拒掉垃圾邮件

这是最有效的一步!垃圾邮件发送者的服务器往往不遵守SMTP协议,比如不发HELO命令、地址格式不对,Postfix只要加几条规则,就能挡住60%以上的垃圾邮件。

1. 核心配置:给SMTP加“门槛”

编辑Postfix主配置文件(/etc/postfix/main.cf),在smtpd_recipient_restrictions参数里加规则,按“先宽松后严格”的顺序排(顺序很重要,早拦早省事):

smtpd_recipient_restrictions =
    permit_mynetworks,  # 允许自己人(局域网/登录用户)发信
    reject_invalid_hostname,  # 拒绝“主机名无效”的客户端(比如没有域名的服务器)
    reject_non_fqdn_sender,  # 拒绝“发件人地址不完整”的邮件(比如只有“user”没有“@example.com”)
    reject_unknown_sender_domain,  # 拒绝“发件人域名查不到DNS”的邮件(假域名)
    reject_unauth_destination,  # 拒绝“不是发给自己管理域名”的转发请求(防蹭转发)
    reject_rbl_client sbl-xbl.spamhaus.org,  # 查实时黑名单,拒绝已知垃圾源
    permit  # 其他情况允许(留余地,避免误判)

2. 关键规则解读(新手必懂)

  • reject_invalid_hostname:比如对方服务器连“mail.spam.com”这样的主机名都没有,直接拒;
  • reject_unknown_sender_domain:比如发件人是user@fake-domain.com,查DNS发现fake-domain.com不存在,直接拒;
  • reject_rbl_client:用“实时黑名单”(比如Spamhaus),这些机构会实时更新垃圾邮件服务器IP,Postfix查到此IP在黑名单里,直接拒。

3. 测试:看规则有没有生效

配置后重启Postfix,再看日志(/var/log/maillog),如果有类似这样的记录,说明规则生效了:

postfix/smtpd[12345]: NOQUEUE: reject: RCPT from unknown[192.168.1.200]: 554 5.7.1 <user@fake.com>: Sender address rejected: Domain not found; from=<user@fake.com> to=<kdent@example.com> proto=SMTP helo=<[192.168.1.200]>

——这段日志表示:因为发件人域名fake.com查不到DNS,Postfix直接拒绝了这封邮件。

三、第二步:防“字典攻击”——只收“已知用户”的邮件

垃圾邮件发送者爱用“字典攻击”瞎猜地址,比如user1@example.comuser2@example.com,就算大部分不存在,也会产生大量退信塞满队列。解决方法是“只收已知用户的邮件”。

1. 配置“本地用户列表”

告诉Postfix:只有在“用户列表”里的地址,才收下邮件,其他一律拒:

# 本地用户列表:系统账号+别名表(确保没有不明用户)
local_recipient_maps = unix:passwd.byname $alias_maps
# 虚拟域名用户(如果有):加上虚拟邮箱/别名的查询表
# local_recipient_maps += hash:/etc/postfix/virtual_mailbox, hash:/etc/postfix/virtual_alias

2. 效果:不明用户的邮件直接拒

如果有人发邮件给nonexist@example.com(不存在的用户),Postfix会直接回复“550 Unknown user”,不会收下再退信——既省服务器资源,又避免退信循环。

四、第三步:内容过滤——关键词挡住“一眼假”的垃圾邮件

有些邮件地址没问题,但内容全是“低价买房”“贷款中介”,这类垃圾邮件可以靠“关键词过滤”挡住。Postfix支持检查邮件标题和正文,发现可疑关键词就拒收或标记。

1. 配置标题/正文检查

编辑main.cf,指定内容过滤的规则文件:

# 检查邮件标题
header_checks = regexp:/etc/postfix/header_checks
# 检查邮件正文
body_checks = regexp:/etc/postfix/body_checks

2. 写过滤规则(关键是“别太严”)

创建/etc/postfix/header_checks(标题检查)和/etc/postfix/body_checks(正文检查),按“关键词+动作”写规则,比如:

# header_checks(标题检查):拒掉含这些关键词的标题
/free mortgage quote/i REJECT  # 不区分大小写,含“免费房贷报价”的标题拒
/repair your credit/i REJECT  # 含“修复信用”的标题拒
# body_checks(正文检查):拒掉含这些关键词的正文
/比特币挖矿/i REJECT  # 含“比特币挖矿”的正文拒
/点击链接领取/i REJECT  # 含“点击链接领取”的正文拒
  • 动作除了REJECT(拒收),还能选WARN(只记录不拒收,测试用)、HOLD(放到保留队列,人工审核)。

3. 生效:生成规则数据库

Postfix需要把文本规则转换成数据库格式:

postmap /etc/postfix/header_checks
postmap /etc/postfix/body_checks
postfix reload

关键提醒: 关键词别太泛!比如别写“优惠”“活动”,不然会误判合法的促销邮件——最好根据自己收到的垃圾邮件,提炼专属关键词(比如“精准引流”“加微信”)。

五、第四步:防“跳板”——关闭“开放转发”

最危险的情况是“服务器被当成垃圾邮件跳板”:外人通过你的Postfix转发垃圾邮件,最后你的服务器被列入黑名单,合法邮件也发不出去。必须确保“只有自己人能转发邮件”。

1. 检查是否有“开放转发”

用在线工具(比如MXToolbox)查“Open Relay”,输入你的服务器域名,如果显示“Not an open relay”就是安全的。

2. 配置转发控制(和第一步联动)

确保smtpd_recipient_restrictions里有这两条规则,只让自己人转发:

smtpd_recipient_restrictions =
    permit_mynetworks,  # 允许局域网内的自己人
    permit_sasl_authenticated,  # 允许登录验证的远程用户(比如出差员工)
    reject_unauth_destination  # 拒绝其他人转发
  • 远程用户要先登录(比如用用户名密码验证),才能通过你的服务器转发邮件,外人蹭不了。

六、第五步:留余地——别“一刀切”,避免误判合法邮件

就算配置再严,也可能误判合法邮件(比如客户的邮件含“合作推广”关键词被拒)。这两步能减少损失:

1. 用“软拒绝”测试新规则

刚加新规则时,先别直接REJECT,用soft_bounce = yes让Postfix“假装拒收”,把邮件放回队列而不是直接退信:

soft_bounce = yes  # 测试时用,正常后改回no

观察日志,确认没有误判合法邮件后,再改回soft_bounce = no

2. 给合法用户“开白名单”

如果某些客户的邮件总被误判,把他们的地址加到“白名单”,跳过过滤规则:

# 白名单查询表:这些地址的邮件直接过
smtpd_sender_access = hash:/etc/postfix/sender_whitelist

创建/etc/postfix/sender_whitelist,写下白名单地址:

# 格式:发件人地址 OK(OK表示直接允许)
client@partner.com OK  # 合作伙伴的邮件直接过
admin@trusted.com OK  # 可信客户的邮件直接过

生成数据库并生效:

postmap /etc/postfix/sender_whitelist
postfix reload

七、Postfix反垃圾完整流程

从“收件”到“放行/拒收”,Postfix的反垃圾逻辑是层层递进的,用流程图一看就懂:

flowchart TD
    A[外部发邮件到example.com] --> B[SMTP对话开始,Postfix检查客户端信息]
    B --> C{客户端过第一关?(主机名有效、发件人域名存在、不在黑名单)}
    C -->|否| D[直接拒收,回复错误码]
    C -->|是| E[检查收件人是否在“已知用户列表”]
    E --> F{收件人存在?}
    F -->|否| G[拒收,回复“Unknown user”]
    F -->|是| H[检查发件人是否在白名单]
    H --> I{在白名单?}
    I -->|是| J[跳过内容过滤,直接收下邮件]
    I -->|否| K[检查邮件标题和正文关键词]
    K --> L{含可疑关键词?}
    L -->|是| M[拒收或放到保留队列]
    L -->|否| N[收下邮件,投递到用户邮箱]

八、排坑:反垃圾配置常见问题

  1. 误判合法邮件,客户说发不过来
    原因:关键词太严(比如“推广”“合作”都拒),或者白名单没加客户地址。
    解决:① 查看日志(/var/log/maillog),找“reject”关键词,看是哪个规则拒的;② 把客户地址加到sender_whitelist,放宽过严的关键词。
  2. 还是有很多垃圾邮件,日志显示“规则都过了”
    原因:垃圾邮件发送者用“变形关键词”(比如“免_费_房_贷”),绕过关键词过滤。
    解决:用正则表达式写更灵活的规则,比如/免.?费.?房.?贷/i REJECT(“.”匹配任意一个字符,“?”表示前面的字符可选)。
  3. 服务器被列入黑名单,发不出邮件
    原因:之前没关“开放转发”,被垃圾邮件发送者当成跳板,IP被拉黑。
    解决:① 先按第四步配置转发控制,关闭开放转发;② 去黑名单网站(比如Spamhaus)提交申诉,说明已修复问题。

九、总结:反垃圾配置核心口诀

最后给大家整个简单口诀,记不住细节也能抓重点:

  • 第一关:SMTP阶段拦假域名、黑名单;
  • 第二关:只收已知用户,防字典攻击;
  • 第三关:内容过滤关键词,别太严;
  • 第四关:转发只给自己人,防跳板;
  • 留余地:软拒绝测试,白名单保合法。

Postfix反垃圾的关键不是“挡掉所有垃圾邮件”,而是“用最少的误判,挡掉最多的垃圾”。刚开始不用追求100%拦截,先搭好基础规则,再根据日志慢慢优化——毕竟误判一封重要客户的邮件,比收10封垃圾邮件损失更大。

此文章为原创文章,作者:胖哥叨逼叨,如若转载,请与我联系并注明出处:https://www.pangshare.com/4261.htm

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2天前
下一篇 2020年7月23日 上午10:49

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注