我如何用Postfix垃圾邮件?

如何使用Postfix设置垃圾邮件收发器,以防止发送到被困地址的客户端向我发送更多的垃圾邮件?

概述

贝叶斯filter和模式匹配以及RBL都是对付垃圾邮件的一部分。 这个设置是为了增加而不是替代那些。

请注意,我不是灰名单。 灰名单在理论上是伟大的,但在实践中,这是非常恼人的用户。 有些人有很大的成功。 我不是那些人之一。

我所做的是设置一些电子邮件地址(我有大约10,000个,但你可以做几百个)作为垃圾邮件。 这些地址列表离散地链接到各种高stream量的网站,机器人会发现他们,但人们不会。 这些地址被收集,出售给垃圾邮件发送者,现在我知道垃圾邮件将进入哪里。

Postfix被configuration为将消息redirect到任何这些地址到我的spamtrap脚本,这些脚本将它们添加到PF中的一个表中,以便来自该客户端的任何进一步的消息最终在我的tarpit中。

优点:

  • 零假阳性率(或者至less可以得到)
  • 资源低价
  • 阻止第一次违规后的防火墙层的垃圾邮件发送者
  • 自愈(被困地址在24小时后过期)

缺点:

  • 不是即插即用的
  • 不less移动部件

怎么样?

您的邮件服务器必须能够运行PF和垃圾邮件。 据我所知,这意味着OpenBSD或FreeBSD。 我确定这些说明可以适应Linux和他们的防火墙的风格,但这超出了我的答案范围。

我已经写了这个FreeBSD的。 OpenBSD用户应该能够通过改变path来适应这些步骤。

最后,这是所有Postfix 2.5+

 表<spamd>坚持
表<本地 - 白名单>坚持文件“/usr/local/etc/spamd/local-whitelist.txt”
  127.0.0.1
 10.0.0.0/8

 #亚马逊
 207.171.168.0/24
 207.171.180.0/24
 207.171.187.0/24
 207.171.188.0/24
 207.171.190.0/24

 #美国在线
 64.12.137.0/24
 64.12.138.0/24
 152.163.225.0/24
 205.188.139.0/24
 205.188.144.0/24
 205.188.156.66
 205.188.157.0/24
 205.188.159.7

 # 苹果
 17.254.6.0/24

 #ebay
 66.135.197.0/24
 66.135.209.0/24

 #gmail
 64.68.80.0/21
 64.233.160.0/19
 64.233.162.192/28
 64.233.170.192/28
 64.233.182.192/28
 64.233.184.192/28
 66.249.82.192/28
 66.249.92.192/28
 66.249.64.0/19
 66.102.0.0/20
 70.89.39.152/29
 70.90.219.48/29
 70.90.219.72/29
 72.14.192.0/18
 74.125.0.0/16
 209.85.128.0/17
 216.239.32.0/19
 216.239.56.240/28

 #postini
 63.146.199.13/32
 63.146.199.14/32
 63.71.11.123/32
 63.71.11.124/32
 64.18.0.0/20
 67.114.133.222/32
 68.123.185.46/32
 74.125.148.0/22
 204.14.232.0/22
 207.126.144.0/20
 208.111.151.5/32
 208.74.204.5/32

 #skynet.be
 195.238.2.0/24
 195.238.3.0/24

 #雅虎
 64.94.237.0/24
 66.163.160.0/19
 66.196.64.0/18
 66.218.64.0/19
 66.218.66.0/24 
 66.218.67.0/24
 66.218.69.0/24
 69.147.92.0/24
 73.30.0.0/16
 74.6.0.0/16
 206.190.32.0/19
 216.34.77.0/25
 216.136.226.0/24
  • 重新加载PF

  • 创build/ usr / local / scripts / get-spamtrapped:

#!/bin/sh /usr/local/sbin/spamdb | grep TRAPPED | cut -d '|' -f 2 
  • 创build/usr/local/etc/spamd/spamd.conf。 我build议使用nixspam和ualbert.ca列表,但至less需要垃圾广告和覆盖列表。 (注:我知道覆盖与PF的rdr规则是多余的 – 我移动的东西,我想要这个双重保护):
所有:uatraps:覆盖:nixspam:覆盖:spamtrapped:覆盖:

 #阿尔伯塔大学greytrap命中。
 #地址呆在里面24小时不正常。
 uatraps:\
         :黑色:\
         :msg =“您的地址%A已经发送邮件到ualberta.ca spamtrap \ n \
        在过去24小时内“:\
         :方法= HTTP:\
         :FILE = www.openbsd.org / spamd的/ traplist.gz:

 #Nixspam最近的资源列表。
 #从http://www.heise.de/ix/nixspam镜像
 nixspam:\
         :黑色:\
         :msg =“您的地址%A在nixspam列表中\ n \
        有关详细信息,请参见http://www.heise.de/ix/nixspam/dnsbl_en/“:\
         :方法= HTTP:\
         :FILE = www.openbsd.org / spamd的/ nixspam.gz:

 #被困IPs  - 所以我们可以阻止他们,而不使用灰名单
 spamtrapped:\
         :黑色:\
         :msg =“您的地址%A已将邮件发送到此服务器上的垃圾邮件收据\ n \
        在过去24小时内“:\
         :方法= EXEC:\
         :文件=在/ usr /本地/脚本/ GET-spamtrapped:

覆盖:\
         :白色:\
         :方法=文件:\
         :文件=的/ usr /本地/ etc / spamd的/本地whitelist.txt:
  • 将spamd设置为在启动时运行。 请注意,您没有以黑名单模式运行,而且当有人试图发送黑名单时,您将抛出5xx错误。 前者是这样spamdb将处理存储/到期陷阱地址。 后者是礼貌。 添加到/etc/rc.conf中:
  obspamd_enable = “YES”
 obspamd_flags = “ -  5”
  • 启动spamd:/usr/local/etc/rc.d/obspamd start

  • Cronjob以每小时一次的黑名单模式运行spamd-setup。 黑名单模式强制它更新<spamd> pf表而不是spamd的内部表。 由于垃圾邮件只是tarpitting和存储数据,其他一切都需要在PF。 (用任何你想要运行的时间来代替XX)

  #spamd-setup
 XX * * * * root / usr / local / sbin / spamd-setup -b
  • 在您的机器上创build一个垃圾邮件用户。 我给他一个主目录,供将来的扩展使用:
  $ sudo pw useradd spamtrap -s / sbin / lologin -d / home / spamtrap -m -c“垃圾邮件收集器”
  • 创build/ usr / local / scripts / spamtrap:
 #!/usr/local/bin/bash # rudimentary checking - more complex checking will be done by # the pfctl and spamdb commands ADDRESS=${1%%[!0-9.]*} if [[ ! ${#ADDRESS} = ${#1} ]] then echo "Invalid characters in IP address" exit 1 fi if [ ! ${ADDRESS} ] then echo "Usage: $0 <address>" exit 1 fi /usr/local/sbin/spamdb -t -a ${ADDRESS} if [ "$?" -ne 0 ] then echo "Failed to add ${ADDRESS} to spamdb" exit 1 fi /sbin/pfctl -qt spamd -T add ${ADDRESS} if [ "$?" -ne 0 ] then echo "Failed to add ${ADDRESS} to pf" exit 1 fi /usr/bin/logger -t spamtrap "Spamtrap caught ${ADDRESS}" 
  • 在Postfix的/usr/local/etc/postfix/master.cf中configuration一个新的传输服务。 X标志告诉Postfix考虑这个消息的最终传送,以便垃圾邮件发送者获得成功消息。 注意用户 – 它需要sudo访问脚本。
  #垃圾邮件
 spamtrapper unix  -  nn  -   - pipe道
   flags = X user = nobody argv = / usr / local / bin / sudo / usr / local / scripts / spamtrap $ {client_address}
  • 添加到sudoers:
 没有人ALL = NOPASSWD:/ usr / local / scripts / spamtrap
  • 创build传输规则,将发送到spamtrap @ localhost的所有消息发送到spamtrapper服务。 请参阅“postconf transport_maps”来编辑文件。 默认是/ usr / local / etc / postfix / transport:
 spamtrap @ localhost spamtrapper
  • 重新启动后缀。 发送几条消息到spamtrap @ localhost,并validation发送客户端是否已加载到spamdb和<spamd> pf表中。
 $ echo“Test”|  mail spamtrap @ localhost
 $ spamdb |  grep 127.0.0.1
被困| 127.0.0.1 | 1253655172
 $ sudo pfctl -qt spamd -T显示
    127.0.0.1
 $

需要为每个垃圾邮件垃圾邮件地址发生两件事情。 首先,它必须parsing为一个实际的邮箱,以免在SMTP对话框中被拒绝。 我使用别名为spamtrap @ localhost的虚拟用户。 其次,它需要匹配Postfix中的check_recipient_access规则,并被redirect到spamtrap @ localhost,这样收件人列表中包含的合法用户永远不必看到它。 我是如何做到这一点的:

  • 添加到/usr/local/etc/postfix/main.cf:
  virtual_maps = hash:/ usr / local / etc / postfix / spamtrap_maps
 smtpd_recipient_restrictions = check_recipient_access散列:/ usr / local / etc / postfix / spamtrap_recipients
  • spamtrap_maps的格式:
  [email protected] spamtrap
  • spamtrap_recipients的格式:
  [email protected] REDIRECT spamtrap @ localhost
  • 将这些文件添加到您的Makefile并testing。

此时,所有向您的垃圾邮件地址发送邮件的客户端都应添加到spamdb和<spamd>中。 没有任何信息被发送到垃圾邮件。 为了使整个阻塞机制生效,添加到/etc/pf.conf并重新加载pf:

 没有从<local-whitelist>到端口25的rdr proto tcp
 rdr将<spamd>的proto tcp传递给端口25  - > 127.0.0.1端口8025

就是这样。

可能的扩展

  • 修改spamtrap脚本以将该消息的副本存储在贝叶斯垃圾邮件语料库中将是微不足道的。

  • 如果您订阅任何RBL rsync服务,将这些邮件的反弹卸载到垃圾邮件是微不足道的。

好吧,看起来你已经完成了自己的答案。 只是不要责备postfix-policyd,它比你想象的要灵活得多,因为它提供了几种反垃圾邮件的机制:

Policyd是Postfix(基于MySQL)的反垃圾邮件插件,可以实现灰名单,基于发件人(信封或SASL)的限制(按照定义的时间单位在邮件和/或卷上),垃圾邮件监控/黑名单和HELO自动黑名单。

你不需要使用所有的waepons,你可能会在你的smtpd_recipient_restrictions设置更多的规则。

无论如何,试试看(并阅读文档)或build立自己的解决scheme – 这取决于你。

只是一个简短的提示:使用postfix-policyd,例子包括在configuration…

在main.cf的smtpd_recipient_restrictions中将其设置为策略服务,即:

 ## call policyd check_policy_service inet:127.0.0.1:10031, 

像灰色垃圾邮件一起工作,并启用灰名单。 祝你好运!

OP提出的解决scheme相当复杂。 我用了一个更简单的方法:

第1步:设置一个filter文件/etc/postfix/spamtraps

这只是一个简单的“匹配列表”:一个正则expression式(对于垃圾邮件filter),当满足时应用一个动作:

 /spam(master|trap)?\@.*/i DISCARD触发垃圾邮件
 /funkyspammer\@.*/i DISCARD触发垃圾邮件

调整你的地址。

第2步:在/etc/postfix/main.cf设置规则

查找smtpd_recipient_restrictions块,并networking检查(较less负载)之前,但在经过身份validation的用户之后放置相应的规则。 例如:

 smtpd_recipient_restrictions = permit_sasl_authenticated
         permit_mynetworks
         check_recipient_access正则expression式:/ etc / postfix / spamtraps
         ...

第3步:重新加载守护进程

当然,你现在需要重新加载postfix,所以你的更改才会生效。 根据你的发行版,这可以通过service postfix reload ,/ /etc/init.d/postfix reload service postfix reload或者类似的命令来完成。

第4步:现在保留这些垃圾邮件发送者

这是您可能希望考虑的一个可选步骤:使用Fail2ban ,并让它看着您的邮件日志文件。 只要有人对垃圾邮件进行处理,就禁止该IP(例如30分钟或1小时 – 不要太长时间,因为垃圾邮件发送者可能会使用dynamicIP,这将很快变得“无辜”)。