如果收件人未在 rcpthosts 中列出,我将 qmail 服务器配置为拒绝邮件,并且我将 tcp-env 与 xinetd 一起使用以允许本地 procs 向添加以下行的任何人发送电子邮件/etc/hosts.allow
:
tcp-env: 127.0.0.1 : setenv RELAYCLIENT
在测试期间,一切似乎都正常工作:
$ telnet mydomain.com 25
Trying xxx.xxx.xxx.xxx...
Connected to mydomain.com.
Escape character is '^]'.
220 mydomain.com ESMTP
HELO
250 mydomain.com
MAIL FROM: [email protected]
250 ok
RCPT TO: [email protected]
553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)
在现实生活中,队列中有很多这样的消息:
2744522 (1, remote)
Envelope Sender:
Envelope Recipient: [email protected] (To Be Delivered)
Date: 22 Apr 2014 07:38:14 -0000
From: [email protected]
To: [email protected]
Subject: failure notice
Size: 18.45KB (18889 Bytes)
QMail 应该为 rcpthosts 中列出的域发送失败通知,并且应该拒绝未在其中列出的域的电子邮件而不发送失败通知。
谁能解释我做错了什么?
谢谢!
qmail 的缺点之一是默认情况下,它在接受邮件之前不检查收件人地址的本地部分。它所做的只是检查收件人域是否在其允许的收件人域列表中。(这在 1990 年代早期是一个不合理的设计选择。如今已不那么如此了。)这意味着,例如垃圾邮件发送者进行字典喷洒可能会通过向不存在的收件人投掷大量邮件来填满您的服务器。当 qmail 尝试投递邮件时,会发现 localpart 不存在,并生成退回邮件。而且由于垃圾邮件发送者会伪造信封发件人,您的服务器将无法传递这些邮件,它会填满队列。
最好的解决方案是首先不接受这些电子邮件。如果您的服务器可以立即拒绝电子邮件
RCPT TO:[email protected]
,那么发送邮件服务器的工作就是发出退回邮件,您就不会被退回邮件淹没。另一个解决方案是减少 qmail 继续尝试传递退回邮件的时间,这样它们就会被更早地删除,因此也不会填满队列。
而且,当然,您可以过滤传入的垃圾邮件并将其丢弃,而不是让它产生退回邮件。
拒绝未知的本地部分
实现此目的的唯一方法是修补 qmail,以便
qmail-smtpd
检查 localparts。您不能仅使用配置选项来执行此操作,您需要实际打补丁并重新编译并安装打补丁的qmail-smtpd
.有几个不同的补丁可以实现这一点。我不能推荐其中任何一个——当我管理 qmail 服务器时,我们有另一个系统充当代理来进行过滤,所以我从不需要使用它。但是您可以在netdevice.com/wmail/rcptck和code.dogmap.org/qmail/找到几个补丁。
减少 qmail 尝试发送退回邮件的时间
如果这只能用于反弹,我不知道如何。但是您可以通过更改
queuelifetime
.man qmail-control
应该告诉你怎么做。垃圾邮件过滤
关于垃圾邮件过滤有太多要说的了,无法在这里找到一个答案。我会从考虑 RBL 风格的黑洞列表开始,并拒绝来自其中列出的 IP 地址的连接。当然,您需要仔细选择您的黑洞列表,并且您确实冒着阻止“真实”邮件的风险。在Chris Hardie 的 qmail anti-spam howto中有一些专门针对 qmail 进行垃圾邮件过滤的信息,在spamhaus.org上有关于各种黑洞列表的信息。
我希望这足以作为一个开始。我已经使用 qmail 几十年了,包括为拥有数百万用户的 ISP 运行邮件系统 - 但我还必须补充一点,如果我现在要设置这样的系统,qmail 将不再是我的首选. 它在创建时是一个非常好的邮件服务器,它做了很多事情都非常好,但现在我可能会使用 postfix 来代替。时间和垃圾邮件发送者已经过去了,而 qmail 没有。