第九章:协议检查和阻止列表垃圾邮件行为Postscreen启用 Postscreen阻止列表权重测试响应侵入式 Postscreen 测试可用测试许可网络Postscreen 缓存跳过灰名单Postwhite配置Postwhite运行Postwhite目标域列表阻止列表阻止邮件在 MAIL FROM上阻止阻止IP地址阻止MX或NS记录拒绝的例外情况附带损害退出阻止列表
到目前为止,您已经花了时间查看邮件日志。如果你的测试机器在公共互联网上,这些日志显示,随着垃圾邮件发送者试图通过你的主机中继邮件,几乎不断有大量的传入连接。垃圾邮件发送者无处不在,而且经常出现,他们的大部分劣质软件在被拒绝后不知道应该停止尝试。持续搜索开放中继可能会使日志不可用,您很快就会发现大多数尝试的SMTP事务都是垃圾邮件。
你可能听说过SpamAssassin、rspamd、贝叶斯过滤和阻止列表以及数十种其他反垃圾邮件工具。Postfix可以与所有这些集成。问题在于决定使用哪种,在哪里使用。像rspamd这样的重型分析程序很强大,但如果你运行通过它们收到的每一封邮件,你就需要投资额外的处理器。拦截垃圾邮件的一般规则是:从最轻、最快的工具开始,过滤掉最严重的垃圾邮件,然后逐渐转向更敏感但更重的工具。
阻止大多数垃圾邮件的最有效工具是基于DNS的阻止列表。
多年来,Jon Postel是互联网的原始设计师之一,通常被认为是早期互联网社区的Yoda,他建议软件在发送方面应该严格,在接受方面应该慷慨。这一点被广泛接受,波斯特尔受到尊重,因此被称为波斯特尔定律或稳健性原则。当你编写SMTP客户端时,你应该让它遵守标准,但你的SMTP服务器应该接受其他人不会这样做。换句话说:减少自己的失败,但要接受别人也有失败。
垃圾邮件发送者的目标是在最短的时间内发送最多的垃圾。接受他人的缺点为垃圾邮件发送者提供了很大的自由度。垃圾邮件机器人实现了一个精简的SMTP,适用于大多数服务器。只接受严格遵守协议定义的客户会阻止这些垃圾邮件机器人。一个更棘手的垃圾邮件机器人可能会正确执行协议的开头部分,但以后会试图滥用它。您也可以检查这些违规行为,但这些测试更具侵入性,将迫使合法发件人重新发送他们的消息。
Postscreen(8)
执行这些测试。默认情况下启用非侵入性测试,而侵入性测试是可选的。
Postscreen的非侵入性检查根据配置的DNSBL测试传入客户端,并在220横幅之前验证客户端是否遵守SMTP协议。220横幅是MTA向客户提供的初始问候,因此这些被称为预问候测试。如果传入的SMTP请求通过了预问候检查,则该请求将被移交给 smptd(8)
进程。
与所有Postfix一样,postscreen被分解为多个执行特定任务的较小程序。 dnsblog(8)
程序执行DNSBL检查并记录结果。Postscreen将TLS活动外包给 tlsproxy(8)
。最后,它将验证的连接交给重新配置的 smtpd(8)
。
在 master.cf 中配置postscreen。第5章讨论了 master.cf 的配置,所以如果你需要提醒,请重新阅读。默认配置文件包括一个注释掉的 postscreen
配置。
Postscreen使用TCP端口25,因此Postfix的 smtpd
无法在该端口上运行。禁用该条目,并取消注释 postscreen
、 smtpd
、 dnsblog
和 tlsproxy
的以下条目:
xxxxxxxxxx
smtp inet n - n - 1 postscreen
smtpd pass - - n - - smtpd
dnsblog unix - - n - 0 dnsblog
tlsproxy unix - - n - 0 tlsproxy
如果您已将任何 -o
选项添加到默认 smtp
条目中,请将它们添加到新的 smtpd
条目中。
不要重新启动Postfix。您必须告诉 dnsblog(8)
要检查哪些DNSBL提供商,以及需要多少个。这在 main.cf 选项 postscreen_nsbl_sites
中。查看我的示例提供者Spamhaus和SpamRATS的文档,可以找到要查询的区域:
xxxxxxxxxx
postscreen_dnsbl_sites = zen.spamhaus.org all.spamrats.com
有了这个,请查看您的邮件日志并完全重新启动Postfix。
xxxxxxxxxx
# service postfix restart
您的日志条目应该从“relaying denied”消息切换到类似这样的内容:
xxxxxxxxxx
mail postfix/postscreen[30254]: CONNECT from [198.51.100.181]:44996 to [45.76.75.68]:25
mail postfix/dnsblog[30441]: addr 198.51.100.181 listed by domain all.spamrats.com as 127.0.0.38
mail postfix/dnsblog[43554]: addr 198.51.100.181 listed by domain zen.spamhaus.org as 127.0.0.4
mail postfix/dnsblog[43554]: addr 198.51.100.181 listed by domain zen.spamhaus.org as 127.0.0.9
mail postfix/dnsblog[43554]: addr 198.51.100.181 listed by domain zen.spamhaus.org as 127.0.0.2
mail postfix/postscreen[30254]: PREGREET 11 after 0.55 from [198.51.100.181]:44996: EHLO User\r\n
mail postfix/postscreen[30254]: DNSBL rank 2 for [198.51.100.181]:44996
第一个条目显示了到 postscreen
的传入TCP连接。新的几行来自 dnsblog
,显示了DNSBL检查的结果。每个检查在 127.0.0.0/8
中返回一个或多个响应,表示主机在阻止列表中。接下来,postscreen
报告客户端在 postscreen
发送其初始问候语之前预先问候或发送了命令。这是一个垃圾邮件机器人。
查看日志可能会发现,许多垃圾邮件机器人和扫描仪一直在用它们毛茸茸的小脑袋撞击你的MTA。更聪明的垃圾邮件机器人尝试的次数更少。
现在,从您的其他测试服务器发送一条消息。您将看到另一个MTA连接到smtpd并发送消息的日志条目。
我经常将来自 dnsblog(8)
和 postscreen(8)
的消息分流到一个单独的日志文件中,以使我的邮件日志有用。您可以将 fail2ban
或其他日志扫描程序指向该日志文件,并将垃圾邮件机器人的IP地址提供给主机的数据包过滤器,要么完全阻止它们,要么将它们的连接抑制到9600波特以扼杀垃圾邮件机器人的资源。
运行邮件系统一段时间后,您将为不同阻止列表的管理员建立不同级别的信任。你可能会认为Spamhaus非常可靠,但其他的一些过于咄咄逼人。您还需要冗余,以防其中一个DNSBL脱机。Postfix允许您在 postscreenn_dnsbl_sites
中对dnsbl结果乘数进行加权,并使用 postscreen_nsbl_threshold
设置评分阈值。
使用 postscreen_nsbl_threshold
,您可以设置阻止发件人所需的最小垃圾邮件分数。每个将发件人声明为垃圾邮件源的DNSBL都会为分数增加一分。如果我想让我的两个阻止列表提供商同意发件人是垃圾邮件源,我可以将其设置为两个。
xxxxxxxxxx
postscreen_dnsbl_threshold = 2
那么,不同阻止列表中的不同信任度呢?您可以在 postscreen_nsbl_sites
中增加阻止列表,以获得更多投票。在这里,我给Spamhaus两票,让其他两个提供商各投一票:
xxxxxxxxxx
postscreen_dnsbl_threshold = 2
postscreen_dnsbl_sites = zen.spamhaus.org*2
all.spamrats.com
dnsbl.sorbs.net
我们需要两点来阻止发件人。Spamhaus得了两分。如果Spamhaus声称某个客户端不是垃圾邮件机器人,但所有其他DNSBL都同意这是一个垃圾邮件机器人,Spamhauss将被否决。否则,Spamhaus就会得逞。
如果你想变得花哨,你可以根据块列表返回的响应代码微调你的分数。DNSWL列表(https://www.dnswl.org)与阻止列表相反:它试图列出可信任的邮件服务器。您可以解析来自该站点的响应,并为所需的响应分配一个较大的负乘数。这些列表中的所有响应都类似于127.0.0.0/8 IP地址,因此我们在括号中列出了可接受的值。
xxxxxxxxxx
postscreen_dnsbl_sites = zen.spamhaus.org*2
…
list.dnswl.org=127.0.[0..255].[1..3]*-2
不要将黑名单权重设置得过于花哨;如果它开始看起来像PAM链,那么你发电子邮件就错了。
postscreen_nsbl_action
和 postscreen_greet_action
选项告诉Postfix在客户端测试失败时如何做出反应。您可以将这些设置为 ignore
(忽略) 、 enforce
(强制)或 drop
(删除)。两者都默认为 ignore 。Postscreen记录违规行为,将客户端IP添加到临时分配列表中,并允许邮件继续发送到 smtpd
。这对于收集统计数据很有用,但没有提供任何保护。大多数服务器应该使用 drop
,或者,如果它们正在分析传入连接以查看哪些测试失败,则使用 enforce
。
enforce 设置告诉postscreen完成任何其他测试,但当测试完成时,连接会被丢弃,并显示550“您的消息不可接受”错误。发件人和收件人将被记录。
drop 设置更具权威性,应谨慎使用。当客户端未通过此测试时,连接会立即终止,并出现错误521,即“此主机不接受邮件”,因为SMTP缺少“此主机接受邮件,只是不接受来自您的邮件”的消息代码。发件人和收件人信息可能尚不可用,因此日志可能很少。
是什么让测试具有侵入性?
Postscreen测试每个传入的SMTP连接是否存在基本协议问题。所有这些测试都发生在SMTP的220问候语之前。如果连接通过了这些测试,postscreen
会将连接交给 smptd
进程,该进程会提供220问候语。SMTP对话框中的不文明行为将直接传递给 smtpd
。 smtpd
进程会断开行为异常的客户端的连接,但它不会跟踪哪些主机行为异常。坏客户端可以重试。
Postscreen的侵入性测试保留了对来自新客户端的SMTP会话的控制,并检查流水线滥用、非SMTP命令和裸露的新行。如果客户端有行为,postscreen会将客户端的IP地址添加到临时允许列表中。然后,它会给客户端一个400错误,告诉客户端“现在不行,稍后再试”。当相同的IP地址在允许列表条目到期之前再次出现时,电子邮件会立即被接受。
这些测试并不能阻止来自行为良好的MTA的垃圾邮件。当垃圾邮件发送者欺骗合法的邮件系统发送垃圾邮件时,该主机非常礼貌,并在将污水倾倒到用户的收件箱时遵循所有SMTP协议。您必须使用资源密集型(resource-heavy)测试来检测垃圾邮件。
Postfix提供了三种侵入性测试:流水线(pipelining)、非SMTP命令(non-SMTP commands)和裸LF检查(bare LF checks)。如果启用了这些测试中的任何一个,postscreen将以灰名单机制运行。
SMTP是一种来回(back-and-forth或半双工—— half-duplex )协议。它有关于哪些参与者可以发言以及哪些参与者必须在交易的任何阶段倾听的正式规则。如果不重写协议,这是无法改变的,但它并不完全有效。流水线(pipelining)是一种优化,当客户端被允许说话时,它会发送几个命令。MTA在初始化会话时必须声明支持流水线。(第3章显示了此声明。)虽然所有现代MTA都支持流水线,但合法客户端在尝试流水线之前会验证该支持。垃圾邮件机器人不会执行该检查:他们假设每个人都支持流水线。Postscreen没有声明它支持流水线,所以行为良好的客户端不会尝试它。任何在服务器没有声明支持的情况下尝试流水线的东西要么是垃圾邮件机器人,要么是编程太糟糕而应该被拒绝。将 postscreen_pipelining_enable
设置为 yes
以启用此检查。
【启用此项后,网易邮箱发过来的邮件会被拦截,提示以下信息:】
xxxxxxxxxx
NOQUEUE: reject: RCPT from [220.197.31.3]:50417: 450 4.3.2 Service currently unavailable; from=<网易邮箱>, to=<本地邮箱>, proto=ESMTP, helo=<m16.mail.163.com>
许多MTA仍然容忍协议错误;Postel的幽灵困扰着软件设计。但众所周知,垃圾邮件机器人的编程很糟糕。它们经常发送非SMTP命令,如CONNECT,甚至发送纯HTTP命令,如GET和POST。postscreen_forbidden_commands
选项启用此检查。
垃圾邮件机器人并不以健壮的编程而闻名。他们中的许多人没有正确处理裸线馈电(line feed —— LF)和带换行的回车(carriage-return with line feed —— CRLF)之间的区别。SMTP使用CRLF。裸线馈送违反了协议。如果您启用了其他检查中的任何一个,postscreen将启用此检查作为日志记录的辅助。您可以使用 postscreen_bare_newline_enable
显式启用它。
如果客户端未通过这些测试中的任何一个,postscreen会断开客户端的连接。客户端可以重试。再一次。再一次。如果你想阻止这些客户端,可以配置一个类似fail2ban的日志监视器,从日志中捕获IP地址并将其提供给你的数据包过滤器。一些操作系统支持专门用于馈送数据包过滤器的 blocklistd(8)
,并将其添加到其Postfix包中。
非侵入性测试没有影响,那么你为什么要跳过它们呢?一些合法的网络设备的SMTP堆栈编程与任何垃圾邮件插件一样糟糕,无法通过postscreen的测试。我们都有一些商业伙伴在2002年购买了最便宜的SMTP服务器,自那以后就没有升级过。
Postscreen跳过 postscreen_access_list
中列出的所有网络的测试。这默认为 permit_mynetworks
:
xxxxxxxxxx
postscreen_access_list = permit_mynetworks,
cidr:/etc/postfix/postscreen-allow.cidr
如第4章所述,在 /etc/postfix/postcreen-allow.cidr 中列出网络块,就像列出其他IP地址一样。使用此相同选项将postwhite允许列表附加到Postscreen。
Postscreen为好的和坏的参与者维护一个IP地址缓存。您可以控制每种类型的条目缓存的时间。默认情况下,临时分配列表条目将保留七天。使用 postscreen_cache_retention_time
更改此设置。
DNSBL测试有自己的计时器。使用 postscreen_dnsbl_max_ttl
和 postscreen_dnsbl_min_ttl
,您可以从DNSBL检查中选择postscreen缓存地址的最大和最小时间长度。这些计时器允许您覆盖DNS中设置的DNSBL的生存时间。这些默认值为最小60秒,最大1小时。(较旧的Postfix版本使用 postcreen_dnsbl_ttl
,但已不再有效。)
使用 postscreen_greet_ttl
设置postscreen记住IP通过预问候测试的时间。这默认为一天。
侵入式测试的结果会被缓存30天。您可以使用 postscreen_bare_newline_ttl
、 postscreen_non_smtp_command_ttl
和 postscreen_pipelining_ttl
更改各种测试的缓存时间。
Postfix按照 postscreen_cache_cleanup_inerval
的指示清除缓存,通常每12小时一次。
如果你为一个小型组织部署Postfix,Authority中那些自以为是“技术”的人最终会询问临时允许列表上的主机。Postscreen不会提供此信息,但您可以在私有数据库中查询IP列表。数据库格式和位置由 postscreen_cache_map
定义。
xxxxxxxxxx
# postconf postscreen_cache_map
postscreen_cache_map = btree:$data_directory/postscreen_cache
它位于数据目录中的一个名为 postcreen_cache 的btree文件中?好的。data_directory 在哪里?
xxxxxxxxxx
# postconf data_directory
data_directory = /var/db/postfix
在那里查找文件 postscreen_cache.db 。使用 postmap -s
读取它。您必须指定 postscreen_cache_map
中给出的数据库类型。将 .db 从文件名中删除:
xxxxxxxxxx
# postmap -s btree:postscreen_cache
155.138.237.75 1699118627;1699032287;1701624227;1;1701624227
2001:19f0:9002:2951:5400:4ff:fe59:997 1699117425;1699034625;1701623025;1;1701623025
40.92.19.44 1699119602;1699033262;1701625202;1;1701625202
...
读取数据库需要独占锁(exclusive lock)。Postscreen可能会在任何毫秒锁定此文件进行更新。在繁忙的服务器上,它可能会频繁锁定此文件。如果您的命令挂起,请等待或按 CTRL-C
重试。当你试图读取应用程序的内部数据库时,就会发生这种情况。如果必须可靠地读取数据库:停止Postfix,读取数据库,然后重新启动Postfix。
IP地址后的信息是时间戳和标志。不要试图对信息进行逆向工程,也不要以任何方式依赖它。格式是Postfix内部的,可以随时更改。
也许你想要postscreen的侵入性测试。也许你想安装postgrey并在灰名单上做完整的操作。某些公司部署的SMTP堆栈在收到400邮件后不会重试,在收到400后不会回退到辅助MX,或者从其他IP地址重试。其中值得注意的是电子邮件帝国的两大巨头,微软和谷歌。应对灰名单的细节取决于您使用的实现,但我们将使用postscreen的侵入性测试。
Postfix的文档包括在单个主机上使用伪备份(faux backup)MX的示例。当发送MTA在从主MTA获得400后立即尝试备份MX时,这是一个非常有效的绝妙技巧。我的测试表明,如果发件人正在运行Sendmail或Postfix,它的效果很好。在收到400错误后的Gmail、微软等待主MTA恢复,而不是尝试备份。
虽然灰名单完全符合SMTP协议,但其他一些组织的技术合法性与之交互不佳。如果你将他们的电子邮件列入灰名单,你将永远不会收到它。我们中的一些人完全可以接受从未收到任何使用Gmail或Office365的人的电子邮件。我、 大多数企业都没有那么幸运。您必须维护一个非灰名单访问列表。
你为什么允许大公司绕过筛查后的协议测试?虽然谷歌、微软、苹果和电子邮件帝国的其他公司确实会发送垃圾邮件,而且他们的协议栈绝不是完美的,但他们不会使用垃圾邮件发送者的协议技巧,所以他们永远不会触发postscreen的协议检查。您必须使用更多处理器密集型检查来检测他们的垃圾邮件,如第14章所述。大多数DNSBL不会将这些服务器列入其列表。
SPF允许组织表达复杂的策略。其中一个策略是列出可以发送邮件的主机。其他一些SPF策略不适合简化为访问列表。无论如何,我们都会使用postwhite和spf-tools滥用SPF来生成该列表。
Postwhite(https://gi.com/stevejenkins/postwhite)是一个shell脚本,它读取选定域的SPF记录,并生成允许从这些域发送邮件的与Postfix兼容的IP地址列表。它建立在spf工具之上(https://github.com/spf-tools/spf-tools),一组用于解析SPF记录的shell脚本。你的Unix可能没有这些包,但它们可以很容易地从git中提取出来。
Postwhite有一个配置文件 postwhite.conf 。您可以将其复制到 /etc 或将其作为命令行参数添加。根据您的环境进行配置。
xxxxxxxxxx
spftoolspath=/usr/local/scripts/spf-tools
postfixpath=/etc/postfix
postfixbinarypath=/usr/local/sbin
whitelist=postscreen_spf_allowlist.cidr
blacklist=postscreen_spf_blocklist.cidr
spftoolspath
选项提供了安装spf工具的目录。我从git克隆了它们,所以它们有自己的目录。
postfixpath
变量是您希望安装已完成的分配列表的目录的路径。如果你以root身份运行,这可能是 /etc/postfix 。如果您想以无特权用户身份运行 postwhite
,请将其设置为用户可以写入的目录。
postfixbinarypath
选项是安装 postfix
命令的目录。
whitelist
行,给出已完成的允许列表的文件名。
默认情况下不需要 blacklist
选项,但如果你想生成一个永远不会给你发邮件的主机列表,请在此处设置文件名。稍后我们将讨论阻止列表。
xxxxxxxxxx
yahoo_static_hosts=/usr/local/scripts/postwhite/yahoo_static_hosts.txt
include_yahoo="no"
2015年,雅虎在网页上公布了他们的出站MTA IP地址列表。一年后,该页面被删除,但列表已被抓取并缓存在各处。2018年,当Postwhite问世时,它仍然可能具有相关性,但已不再适用。Postwhite包含文件 yahoo_static_hosts.txt ,为了完整起见,您可以将 yahoo_stastic_hosts 设置为其路径,但 include_yahoo
应始终设置为 no
。(雅虎现在有一个新页面,但Postwhite尚未更新。)
xxxxxxxxxx
invalid_ip4=remove
simplify=no
reload_postfix=yes
SPF记录应全部位于具有有效网络掩码的有效子网中。Postfix要求所有ACL都在有效的网络块中。像 203.0.113.50/24
这样的SPF记录表明,数量惊人的提供商在“识别可以发送邮件的特定主机”和“在发送邮件的指定主机上配置的IP地址和网络掩码”之间混淆了。 invalid_ip4
选项告诉postwhite如何处理这些问题。默认情况下, remove
会丢弃无效记录。使用 keep
将它们保持不变,这意味着Postfix将忽略它们。 fix
设置试图纠正这些错误,但postwhite无法读懂人们的想法。安全的选择是 remove
。
许多大型组织都有重叠的SPF记录,或者与另一家企业共享出站MTA。在允许列表中重复网络块缺乏优雅。 simplify
选项告诉postwhite组合它们。虽然我喜欢优雅,但启用 simplify
功能会将postwhite的运行时间从一两分钟增加到十五分钟以上,由此产生的allowlist长度是未放大的长度的92%。在日常使用中,增加运行时间可能并不重要,但在调试过程中至关重要,所以我不再讨论这个问题。
如果您想在更新后向Postfix发出重新读取允许列表的信号,可以使用 reload_postfix
选项来实现。
xxxxxxxxxx
custom_hosts="mwl.io"
你可能有自己的域名,永远不应该被列入灰名单。将它们添加到 custom_host
包含的域中。
Postwhite不需要任何命令行选项,除非您使用其他配置文件。运行它:
xxxxxxxxxx
# ./postwhite
它将读取 /etc/postwhite.conf ,创建临时文件,并开始遍历域列表。
如果要使用 /etc/postwhite.conf 以外的配置文件,请将完整路径作为参数。或者,您可以编辑脚本。
Postwhite工作得很好,但不太可配置。要添加到允许列表中的域列表是硬编码的。我知道很多人不同意默认名单,世界已经向前发展了——没有必要允许像推特这样无关的公司。幸运的是,该列表位于脚本顶部附近,易于修改。
如果你在互联网上呆过一段时间,你会有一份你永远不想听到的人和组织的名单。您可以使用 enable_blacklist
和 blacklist_hosts
选项来启用生成永远无法向您发送邮件的IP地址列表。
xxxxxxxxxx
enable_blacklist=yes
blacklist_hosts="galacticempire.gov"
基于出站MTA阻止域可能会产生副作用。假设你的一个客户使用亚马逊的云服务发送邮件。垃圾邮件发送者也是如此。如果您使用基于IP的阻止,两个域将被同等对待。
你最终会得到这样的阻止列表:
xxxxxxxxxx
203.0.113.0/24 reject
2001:db8:bad:c0de::/64 reject
我们将在本章稍后看到如何使用此阻止列表。
自动生成阻止列表记录是有风险的。考虑一下这个SPF记录。
xxxxxxxxxx
"v=spf1 +all"
互联网上的任何主机都可以为此域发送电子邮件。垃圾邮件发送者喜欢这个完全有效的SPF记录。如果我将具有此记录的域添加到 blacklist_hosts
,自动生成阻止列表,并将其提供给Postfix,我的MTA将立即拒绝来自所有不在早期允许列表中的人的邮件。在部署之前,所有阻止列表都必须由一个有点偏执的人进行验证。
有了允许列表后,将其添加到 postscreen_access_list
并重新启动Postfix。
如果我收到另一封来自某家招聘公司的电子邮件,给我提供了一个入门级帮助台的绝佳机会,我将违反几项州法律、许多国家法律以及一些明显晦涩的《日内瓦公约》附加议定书。我宁愿避免把我所谓的“退休”“积蓄”花在一个绝望到足以接手我的案件的刑事辩护律师身上,所以谨慎建议我避免整个问题,并在MTA级别屏蔽他们的电子邮件。
屏蔽电子邮件很棘手。你可以按域名屏蔽,但域名价格低廉且容易伪造。你可以深入了解SPF记录,但修改它们的成本更低。您可以在邮件标题中搜索要屏蔽的项目,但标题是短暂的。尽管如此,有时还是要在尝试和积累法律账单之间做出选择。
Postfix使用 smtpd_sender_restrictions
选项对此MTA将接受的邮件设置策略。就像它的镜像双胞胎 smtpd_recipient_restrictions
一样,它接受其他选项作为参数。这些选项的设置决定了哪些邮件将被拒绝。
虽然破坏邮件系统的垃圾邮件发送者经常伪造发件人的地址,但更改邮件发件人通常需要比垃圾邮件发送者更多的访问权限。您可以使用 check_sender_access
过滤单个电子邮件地址、父域或本地帐户。这里我有一个 /etc/postfix/bad-domains 中不需要的MAIL FROM组件的列表,并用它来构建一个数据库。
xxxxxxxxxx
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/bad-domains
假设你厌倦了我的来信。我的电子邮件地址是 mwl@mwl.io
。考虑以下bad-domains条目:
xxxxxxxxxx
mwl@mwl.io REJECT
任何邮件发件人包含以下内容的邮件 mwl@mwl.io
会被拒绝吗?太棒了!但第二天,我的一条信息直冲而过。问题是,我的邮件在MAIL FROM中无法识别自己。请检查邮件日志中的 from 语句。
xxxxxxxxxx
Nov 21 15:05:20 mail postfix/qmgr[88751]: 0BE4C30B4D: from=<mwlucas@mail.mwl.io>, size=1756, nrcpt=1 (queue active)
from=
给出 MAIL FROM: mwlucas@mail.mwl.io
。用特定的bad-domains题目拒绝该地址:
xxxxxxxxxx
mwlucas@mail.mwl.io REJECT
这拒绝了我的常规电子邮件。
不幸的是,我控制着我的邮件主机。我可以轻松创建新帐户。通过删除帐户阻止此主机的所有内容。如果我引入其他主机,你需要屏蔽整个域。最好从那里开始。
xxxxxxxxxx
mwl.io REJECT
原来我是一个拥有许多域名的顽固混蛋。检查邮件来源会显示我倾向于在任何地方使用相同的用户名:
xxxxxxxxxx
mwlucas@ REJECT
应该可以了!
不过,我可能会很快理解的。你需要更强壮的东西。
若我仍然打扰你们,你们可以使用Postwhite解析出我的SPF记录,如前所述,并生成我发送邮件的IP地址列表。 check_sender_a_access
选项允许您设置禁止的IP地址列表。将其添加到 smtpd_sender_restrictions
中:
xxxxxxxxxx
smtpd_sender_restrictions =
check_sender_a_access cidr:/etc/postfix/postscreen_spf_blocklist.cidr,
check_sender_access hash:/etc/postfix/bad-domains
无论我从哪个出站邮件主机发送邮件,如果其IP地址出现在SPF记录中,则表示您已将其阻止。
问题在于,我可以随时决定启动一个新的虚拟机,并获取新的IP地址。我甚至写了一本关于邮件服务器的书,所以我(大概)可以快速安装一个。对我的冒犯做出动态反应的东西可能更有效。
MX记录不是衡量主机可以发送邮件的完美指标,但如果你不愿意接收我的邮件,你可以尝试将我的MX记录中的任何内容添加到禁止联系你的主机列表中。为此,请使用 check_sender_mx_access
选项:
xxxxxxxxxx
smtpd_sender_restrictions = check_sender_mx_access hash:/etc/postfix/bad-mx
文件 bad-mx 包含要禁止的MTA列表:
xxxxxxxxxx
mail.mwl.io REJECT
mail.michaelwlucas.com REJECT
任何包含在MX记录中使用这些主机的MAIL FROM都将被拒绝。如果MAIL FROM主机不存在MX记录,postfix会检查主机的A或AAAA记录是否与这些主机匹配。如果有匹配,它会拒绝。
您还可以禁止使用所选域名服务器的主机发送邮件。垃圾邮件操作通常对其所有域都有标准的名称服务器。使用 check_sender_ns_access
选项指向名称服务器列表。
xxxxxxxxxx
smtpd_sender_restrictions = check_sender_ns_access hash:/etc/postfix/bad-ns
在文件中列出与MX主机完全相同的名称服务器:
xxxxxxxxxx
ns1.mwl.io REJECT
ns2.mwl.io REJECT
就像阻止用户和域一样,您可以通过列出域来阻止域中的每个名称服务器或MTA:
xxxxxxxxxx
mwl.io REJECT
这些都不是完美的,但它可能会减少我到达你收件箱的频率。
假设你想允许你屏蔽的用户、域名或地址范围的一小部分。也许我的域中有一个特殊用户你愿意接受来自它的邮件,但你想阻止我们其他人。你可以提供一个排除列表。
smtpd_sender_restrictions
中排除的诀窍是,您不能使用 OK
列出允许的邮件。狡猾的发件人可以使用此选项绕过其他限制。请改用 DUNNO
,声明此政策对是否接受或拒绝此邮件没有意见。先放大的阻止,然后放小的例外。
xxxxxxxxxx
mwl.io REJECT
legalcounsel@mail.mwl.io DUNNO
你现在可以收到我的律师的邮件,但我不能。假设我没有假装是我的律师,就是这样。
阻止不需要的邮件可能会阻止想要的邮件。
互联网不是静止的。也许你已经决定可以屏蔽来自亚马逊邮件服务amazonses.com的所有邮件。这很有效,直到你最大的客户切换到使用它们,并且事先没有通知你。从SPF记录中自动生成被阻止的IP可能会阻止整个互联网。阻止名为mwl@的用户访问任何域都会阻止您接收来自非我的人的消息。虽然我不断收到南非商法培训的邀请,但我不能绝对阻止所有 .za
。有选择地部署阻止。
无论你多么小心,最终用户都会表现得不明智,或者入侵者会闯入你的服务器,你的主机的IP地址会出现在一个或多个阻止列表中。你是做什么的?
大多数阻止列表由邮件管理员运行。他们遇到的问题和你一样,也明白你有这些问题。在他们取消您的主机列表之前,他们想知道问题已经解决。在继续之前,确定并解决您的问题。一些阻止列表提供的反馈比其他阻止列表更好,但您始终可以检查日志中的非典型邮件模式。检查 postmaster@
帐户是否有退回消息或通知。弄清楚。
每个信誉良好的阻止列表都有一个网站,可以请求除名,并要求这样做。有些人甚至将这些链接放在他们的退回消息或SMTP拒绝消息中。记住,这些列表是由人管理的,你没有任何影响力。解释你的问题是什么,以及你是如何解决的。
如果这些操作员发现你没有解决问题,或者如果你是一个要求苛刻的混蛋,他们完全有能力永久阻止你。他们对那些声称自己已经解决了问题,但还没有解决的人非常不友好。
邮件系统运营商应该是负责任的公民。这不像是置身于一群你再也见不到的人之中;阻止列表服务器操作员记住。
现在,您可以阻止最恶劣的垃圾邮件机器人和选定的主机。让我们考虑更严格地验证电子邮件。