AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 67507
Accepted
sh-beta
sh-beta
Asked: 2009-09-22 14:12:23 +0800 CST2009-09-22 14:12:23 +0800 CST 2009-09-22 14:12:23 +0800 CST

如何使用 Postfix 进行垃圾邮件陷阱?

  • 772

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

postfix
  • 5 5 个回答
  • 4310 Views

5 个回答

  • Voted
  1. Best Answer
    sh-beta
    2009-09-22T14:48:46+08:002009-09-22T14:48:46+08:00

    概述

    贝叶斯过滤器和模式匹配以及 RBL 都是打击垃圾邮件的一部分。此设置旨在增强而不是替换这些设置。

    请注意,我没有列入灰名单。灰名单在理论上很棒,但在实践中它对您的用户来说非常烦人。有些人在这方面取得了巨大的成功。我不是那些人中的一员。

    我所做的是设置一些电子邮件地址(我有大约 10,000 个,但你可以用几百个)作为垃圾邮件陷阱。这些地址的列表与各种高流量站点分开链接,机器人会在这些站点找到它们,但人们不会。这些地址被收集,卖给垃圾邮件发送者,现在我知道垃圾邮件会从哪里进来。

    Postfix 被配置为将消息重定向到这些地址中的任何一个到我的垃圾邮件陷阱脚本,该脚本将它们添加到 PF 中的一个表中,以便来自该客户端的任何进一步的消息最终在我的 tarpit 中。

    优点:

    • 零误报率(或至少尽可能接近)
    • 资源便宜
    • 在第一次违规后在防火墙层阻止垃圾邮件发送者
    • 自我修复(被困地址在 24 小时后过期)

    缺点:

    • 非即插即用
    • 相当多的活动部件

    如何?

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

    我已经为 FreeBSD 编写了这个。OpenBSD 用户应该能够主要通过更改路径来适应这些步骤。

    最后,这一切都适用于 Postfix 2.5+

    • 启用 PF ( http://www.freebsd.org/doc/en/books/handbook/firewalls-pf.html )
    • 添加到 PF:
    表 <spamd> 持久化
    表 <local-whitelist> 持久化文件“/usr/local/etc/spamd/local-whitelist.txt”
    
    • 从端口安装 spamd
    • 创建 /usr/local/etc/spamd/local-whitelist.txt。PF 将读取该文件以生成 <local-whitelist> 表。我建议参考http://www.greylisting.org/whitelisting.shtml以获取永远不应该被缓送的地址。一个示例文件:
    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
    
    #易趣
    66.135.197.0/24
    66.135.209.0/24
    
    # 邮箱
    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

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

    #!/bin/sh
    /usr/local/sbin/spamdb | grep TRAPPED | cut -d '|' -f 2
    
    • 创建 /usr/local/etc/spamd/spamd.conf。我建议也使用 nixspam 和 ualbert.ca 列表,但至少您需要 spamtrapped 和 override 列表。(注意:我知道覆盖对于 PF 的 rdr 规则是多余的——我移动的东西足够多,我想要这种双重保护):
    全部:uatraps:覆盖:nixspam:覆盖:垃圾邮件陷阱:覆盖:
    
    # 阿尔伯塔大学灰色陷阱命中。
    # 从行为不端开始,地址会在其中保留 24 小时。
    utraps:\
            :黑色的:\
            :msg="您的地址 %A 已将邮件发送到 ualberta.ca 垃圾邮件陷阱\n\
            过去 24 小时内":\
            :方法=http:\
            :file=www.openbsd.org/spamd/traplist.gz:
    
    # Nixspam 最近的来源列表。
    # 镜像自 http://www.heise.de/ix/nixspam
    垃圾邮件:\
            :黑色的:\
            :msg="您的地址 %A 在 nixspam 列表中\n\
            有关详细信息,请参见 http://www.heise.de/ix/nixspam/dnsbl_en/":\
            :方法=http:\
            :file=www.openbsd.org/spamd/nixspam.gz:
    
    # Trapped IPs - 所以我们可以在不使用灰名单的情况下阻止它们
    垃圾邮件:\
            :黑色的:\
            :msg="您的地址 %A 已将邮件发送到此服务器上的垃圾邮件陷阱\n\
            过去 24 小时内":\
            :方法=执行:\
            :file=/usr/local/scripts/get-spamtrapped:
    
    覆盖:\
            :白色的:\
            :方法=文件:\
            :file=/usr/local/etc/spamd/local-whitelist.txt:
    
    • 将 spamd 设置为在启动时运行。请注意,您没有在仅黑名单模式下运行,并且当有人尝试发送到黑名单时会引发 5xx 错误。前者是如此 spamdb 将处理存储/过期的被困地址。后者是礼貌。添加到/etc/rc.conf:
    obspamd_enable="是"
    obspamd_flags="-5"
    
    • 启动垃圾邮件:/usr/local/etc/rc.d/obspamd start

    • Cronjob 每小时一次以仅黑名单模式运行 spamd-setup。黑名单模式强制它更新 <spamd> pf 表而不是 spamd 的内部表。由于 spamd 只是缓送和存储数据,因此其他所有内容都需要在 PF 中。(将 XX 替换为您希望它运行的任何分钟)

    # 垃圾邮件设置
    XX * * * * root /usr/local/sbin/spamd-setup -b
    
    • 在您的计算机上创建垃圾邮件陷阱用户。我给他一个主目录以供将来扩展:
    $ sudo pw useradd spamtrap -s /sbin/lologin -d /home/spamtrap -m -c "垃圾邮件收集器"
    
    • 创建 /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 中配置一个新的传输服务。X 标志告诉 Postfix 考虑邮件的最终传递,以便垃圾邮件发送者获得成功消息。请注意用户 - 它需要对脚本的 sudo 访问权限。
    # 垃圾邮件陷阱
    spamtrapper unix - nn - - 管道
      flags=X user=nobody argv=/usr/local/bin/sudo /usr/local/scripts/spamtrap ${client_address}
    
    • 添加到 sudoers:
    没有人全部= NOPASSWD:/usr/local/scripts/spamtrap
    
    • 创建一个传输规则,将发送到 spamtrap@localhost 的所有消息发送到 spamtrapper 服务。有关要编辑的文件,请参见“postconf transport_maps”。默认为 /usr/local/etc/postfix/transport:
    spamtrap@localhost 垃圾邮件陷阱
    
    • 重启后缀。向 spamtrap@localhost 发送几条消息,并验证发送客户端是否已加载到 spamdb 和 <spamd> pf 表中。
    $ echo "测试" | 邮件垃圾邮件陷阱@localhost
    $ 垃圾邮件数据库 | grep 127.0.0.1
    被困|127.0.0.1|1253655172
    $ sudo pfctl -qt spamd -T 显示
       127.0.0.1
    $
    

    每个被垃圾邮件捕获的电子邮件地址都需要做两件事。首先,它必须解析为一个实际的邮箱,这样它才不会在 SMTP 对话期间被拒绝。我使用了别名为 spamtrap@localhost 的虚拟用户。其次,它需要匹配 Postfix 中的 check_recipient_access 规则并被重定向到 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_recipients 的格式:
    [email protected] 重定向 spamtrap@localhost
    
    • 将这些文件添加到您的 Makefile 并进行测试。

    此时,所有向您的垃圾邮件陷阱地址发送邮件的客户端都应添加到 spamdb 和 <spamd>。尚未向 spamd 发送任何内容。要使整个阻塞机制生效,请添加到 /etc/pf.conf 并重新加载 pf:

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

    就是这样。

    可能的扩展

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

    • 如果您订阅了任何 RBL rsync 服务,将这些消息的弹跳卸载到 spamd 是微不足道的。

    • 6
  2. Marcus Spiegel
    2009-09-22T23:14:22+08:002009-09-22T23:14:22+08:00

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

    Policyd 是一个用于 Postfix(基于 MySQL)的反垃圾邮件插件,它执行灰名单、基于发件人(信封或 SASL)的限制(在每个定义的时间单位的消息和/或数量上)、垃圾邮件陷阱监控/黑名单和 HELO 自动黑名单。

    您不需要使用所有这些武器,并且您可能会在smtpd_recipient_restrictions.

    无论如何,试一试(并阅读文档)或建立您自己的解决方案 - 这取决于您。

    • 2
  3. Izzy
    2015-12-01T11:09:06+08:002015-12-01T11:09:06+08:00

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

    第 1 步:设置过滤器文件/etc/postfix/spamtraps

    这只是一个简单的“匹配列表”:一个正则表达式(用于垃圾邮件陷阱),在遇到时会应用一个操作:

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

    调整您的地址。

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

    查找smtpd_recipient_restrictions块,并将相应的规则放在您的网络检查之前(负载较少),但在经过身份验证的用户之后。例如:

    smtpd_recipient_restrictions = permit_sasl_authenticated
            permit_mynetworks
            check_recipient_access 正则表达式:/etc/postfix/spamtraps
            …
    

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

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

    第 4 步:现在将那些垃圾邮件发送者拒之门外

    这是您可能希望考虑的可选步骤:使用Fail2ban,并让它监视您的邮件日志文件。一旦有人解决了垃圾邮件陷阱,就立即禁止该 IP(例如 30 分钟,或者可能 1 小时 - 不要太长,因为垃圾邮件发送者可能使用一个很快就会变得“无辜”的动态 IP)。

    • 2
  4. Marcus Spiegel
    2009-09-22T14:31:52+08:002009-09-22T14:31:52+08:00

    只是一个快速提示:使用 postfix-policyd,示例包含在配置中...

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

    ## call policyd
    check_policy_service inet:127.0.0.1:10031,
    

    就像启用了灰名单的魅力垃圾邮件陷阱一样。祝你好运!

    • 1
  5. benscha
    2019-06-25T05:33:03+08:002019-06-25T05:33:03+08:00

    如果有人需要第 4 步的示例脚本,我们开始...

    grep '[email protected]' /var/log/maillog >/tmp/badips_raw
    grep '[email protected]' /var/log/maillog >>/tmp/badips_raw
    
    egrep -o -e "[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}" /tmp/badips_raw >> /tmp/badips_nu
    
    sort -u /tmp/badips_nu > /tmp/badips
    
    rm -rf /tmp/badips_raw
    rm -rf /tmp/badips_nu
    
    
    while read ip
    do
    fail2ban-client set postfix-sasl banip $ip
    done < /tmp/badips
    
    
    rm -rf /tmp/badips
    
    
    • 0

相关问题

  • Postfix 在特定端口上接受邮件

  • 让 Postfix 以两种方式处理垃圾邮件

  • Postfix 或 exim:自动/程序化和转发电子邮件设置

  • 后缀电子邮件地址

  • 什么是最好的开源电子邮件解决方案包

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve