[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

灰名单教学文档

1. 引言

ArtWork/WikiDesign/icon-admonition-info.png

注:写这份指南的原意是要补充基本的 postfix 指南postfix 规限指南,但其后已演变至适用于其它 MTA 。

postgrey 是个政策服务器,通过实施灰名单在 Postfix 邮件服务器上过滤垃圾邮件。灰名单的原理建基于多数垃圾邮件都寄件者都是垃圾邮件程序或其它不乎合 RFC 的 MTA。postgrey 会在缺省时限内临时以「稍后重试」450 号错误拒绝新邮件,并在它的数据库内记录客端 IP/寄件者/收件者这三组数据。假若寄件的服务器乎合 RFC,它应该重寄该邮件,到时 postgrey 便会在数据库内找寻配对并接纳该邮件。这个拖时延限是可自定的,而且 postgrey 维护一个数据库存储已知的组合,因此来自同一位寄件者邮件只会在首封经历延误。

相反地,典型的垃圾邮件程序一般都会接收大量的回邮或被拒邮件,因此垃圾邮件寄件者多数在临时被拒的情况下不会重寄邮件。故此任何来自该类来源地的邮件将会被弃置。这样额外带来的好处就是减省邮件服务器花在过滤及处理邮件上的时间,因为大部份的邮件在进入 MTA 之先便会被弃置,所以不必过滤或处理。

attachment:HowTos/postgrey/postgrey-en.png

2. 设置

灰名单可以回应不同的 MTS 而被设置。请根据你所采用的 MTA 来参考下列相关部份。

2.1. Postfix

Postgrey 在 CentOS 5.1 上是通过 RPMForge 安装最新版本的,虽然这里的指示也适用于其它版本。要启用 RPMForge 软件库,请参阅 RPMForge 内的指引。首先,请安装 postgrey:

# yum install postgrey

Postgrey 是用 Perl 写成的,因此 Perl 及某些 Perl 模块必须被安装。Yum 应该会自动判断你所仍未安装的依赖性组件,而你亦可以在 Postgrey 的网站查阅它的要求。

我们首要是设置 Postfix 应用 Postgrey。编辑 /etc/postfix/main.cfg 仿照下面在 smtpd_recipient_restrictions 这个部份加入 check_policy_service 这一行(假如你没有 smtpd_recipient_restrictions 这部份,那么下面是个不错的列子):

smtpd_recipient_restrictions =
   permit_mynetworks,
   reject_unauth_destination,
   check_policy_service unix:postgrey/socket,
   permit

按缺省值,Postgrey 拒绝新邮件的时间是 5 分钟,但我们可以利用 --delay 这个选项来更改它。这里要权衡的,就是时间越长拒绝垃圾邮件的机会越大,但合法邮件初次被延误的时间也会越久。你也许值得在开始时把这个值设为 1 分钟(60 秒),然后当 Postgrey 已经为你的邮件服务器创建了一个常见邮件联络人的数据库时,才把数值增大。我们不推荐你把延误时间设至多于 300 秒(5 分钟)。要以手动的方式设置延误时间(以秒计算),我们必须在 /etc/sysconfig/postgrey 创建 Postgrey 的配置文件,然后如下所示加入 --delay 这个选项(选项清单请参阅 man postgrey):

OPTIONS="--unix=/var/spool/postfix/postgrey/socket --delay=60"

最后,我们须要引导 Postgrey 这个服务及重新装入 Postfix 的设置:

# /sbin/service postgrey start
# /sbin/service postfix reload

请确保 postgrey 在机器开机时会被自动引导:

# /sbin/chkconfig --levels 345 postgrey on 

现在我们可以检查邮件日志并看到 postgrey 大展所长。以下内容来自我的 /var/log/maillog:

#
# postgrey loads:
#
Dec 17 21:44:58 jessie postgrey[6844]: Process Backgrounded
Dec 17 21:44:58 jessie postgrey[6844]: 2007/12/17-21:44:58 postgrey (type Net::Server::Multiplex) starting! pid(6844)
Dec 17 21:44:58 jessie postgrey[6844]: Binding to UNIX socket file /var/spool/postfix/postgrey/socket using SOCK_STREAM
Dec 17 21:44:58 jessie postgrey[6844]: Setting gid to "101 101"
Dec 17 21:44:58 jessie postgrey[6844]: Setting uid to "100"
#
# postgrey greylisting a message:
#
Dec 17 21:23:49 jessie postfix/smtpd[6714]: connect from mk-outboundfilter-4-a-1.mail.uk.tiscali.com[212.74.114.8]
Dec 17 21:23:49 jessie postfix/smtpd[6714]: NOQUEUE: reject: RCPT from mk-outboundfilter-4-a-1.mail.uk.tiscali.com[212.74.114.8]:
        450 4.2.0 <ned@example.com>: Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/example.com.html;
        from=<bob@example.com> to=<ned@example.com> proto=ESMTP helo=<mk-outboundfilter-4-a-1.mail.uk.tiscali.com>
Dec 17 21:23:54 jessie postfix/smtpd[6714]: disconnect from mk-outboundfilter-4-a-1.mail.uk.tiscali.com[212.74.114.8]
#
# postgrey accepting a message:
#
Dec 17 22:23:45 jessie postgrey[2218]: action=pass, reason=triplet found, client_name=mk-outboundfilter-3-a-1.mail.uk.tiscali.com,
        client_address=212.74.114.7, sender=bob@example.com, recipient=ned@example.com

如果你看到这样一则信息:

Nov 18 09:39:03 jessie postfix/smtpd[26006]: warning: connect to postgrey/socket: Permission denied

请不要灰心。这是 SELinux 的问题,而这个 wiki 页面谈论了解决方法:zh/HowTos/SELinux#head-c107e0a7fef7854abd2f1e330b2bfd734b678caa

2.2. Sendmail 内的灰名单

Sendmail 采用 milter-greylist,它已收录在 RPMForge。要启用 RPMForge 软件库,请参阅 RPMForge 内的指引。首先,请安装 milter-greylist:

# yum install milter-greylist

milter-greylist 是已 C 写成,因此它的依赖性寥寥可数。Yum 应该会自动判断你所仍未安装的依赖性组件,而你亦可以在 milter-greylist 的网站查阅它的要求。

请在你的 sendmail.mc 脚本的尾部加入以下内容:

INPUT_MAIL_FILTER(`greylist',`S=local:/var/milter-greylist/milter-greylist.sock')dnl
define(`confMILTER_MACROS_CONNECT', `j, {if_addr}')dnl
define(`confMILTER_MACROS_HELO', `{verify}, {cert_subject}')dnl
define(`confMILTER_MACROS_ENVFROM', `i, {auth_authen}')dnl
define(`confMILTER_MACROS_ENVRCPT', `{greylist}')dnl

你也可以按首选指定闲置时间,而以下的例子设置发送信息给邮寄程序及等待回复时等待一分钟,因为缺省的 10 秒时限或许在采用 DNSRBL 及/或 SPF 时也许会不足够。详情请参阅 Sendmail 的邮寄程序安装指南

INPUT_MAIL_FILTER(`greylist',`S=local:/var/milter-greylist/milter-greylist.sock, F=, T=S:1m;R:1m')dnl

利用 m4 档编译 sendmail.cf 档。很多系统都拥有一个能自动完成这个步骤的 Makefile。

/usr/bin/m4 /usr/share/sendmail/cf/m4/cf.m4 sendmail.mc > sendmail

接着重新引导 sendmail

service sendmail restart

2.3. Exim

Exim 的设置应该放在这里。假如你把灰名单应用在 exim(或其它 MTA)上,欢迎你自动请缨

3. 汇报

Postgrey 包含一个名叫 postgreyreport 的汇报工具。它已缺省在安装 postgrey 的组件时一并被安装。postgreyreport 会分析(来自 STDIN)的邮寄日志,将它与 postgrey 的数据库比较,然后列出所有「致命」灰名单项目的详情。当一台主机于首次寄件往某个特定收件者的 300 秒未能重试寄件,它便被放进「致命」灰名单内。postgreyreport 将会采用客端 IP/寄件者/收件者这三组数据作标识之用。你可以利用 --delay 这个命令行选项来调整 300 秒的时限,但 300 是个不错的基准。多数邮件服务器都会在 300 移内重试。

基本用法:

cat /var/log/maillog | /usr/sbin/postgreyreport --delay=300

视乎你的服务器有多繁忙,这个报告有可能会颇大。要取得首 20 个被放进灰名单内的来源地,你可以用这个方法:

cat /var/log/maillog | postgreyreport | awk '{print $1}' | sort | uniq -c | sort -nr | head -n20

要取得首 20 个灰名单来源地所寄往的电邮地址:

cat /var/log/maillog | postgreyreport | awk '{print $4}'  | sort  | uniq -c | sort -nr | head -n20

要列出 postgreyreport 支持的所有选项及它们的功用:

postgreyreport -h

4. 多重 MX 的考虑

假若你的网域拥有多于一台邮件服务器(MX),请确保你在所有服务器上启用灰名单,否则垃圾邮件寄件者将会对准你的后备 MX 机器并从那里转发邮件。你也值得把每台机器放在对方的白名单内。请参阅下一部份关于如何在 postgrey 内设置白单名。

要让灰名单在后备 MX 机器上运作,灰名单的检查必须在邮件被接纳前进行!虽然这听起来是理所当然的事,它却是导致不少人在后备 MX 机器上设置灰名单时出现混乱的原因之一。举个例说,如果你在 postfix 内采用 permit_mx_backup,你的备份 MX 上的 smtpd_recipient_restrictions 应该是这样的:

smtpd_recipient_restrictions =
    reject_unauth_destination,
    check_policy_service unix:/var/spool/postfix/postgrey/socket,
    permit_mx_backup,
    permit

5. 白名单

postgrey 也可以把寄件者及收件者放在白名单内。要把一台主机加进白名单,你只需把它的完整机域名或 IP 地址加进 /etc/postfix/postgrey_whitelist_clients.local,譬如:

192.168.1.10
mydesktop.office.mydomain.com

现在所有来自 192.168.1.10 或 mydesktop.office.mydomain.com 的邮件将不会被被灰名单过滤,而会立即获接纳(只要它是合法的,并通过所有 postfix 规则)。另一方面,假若你想把一个收件者加入白名单内,你可以将电邮地址的用户名称部份加进 /etc/postfix/postgrey_whitelist_recipients 档内,譬如:

postmaster@
abuse@
theboss@

现在所以寄往上述地址的电邮将不会被被灰名单过滤,而会立即获接纳。请留意 postgrey 已缺省把 postmaster 及 abuse 列进白名单内。

6. 总结

灰名单能高度有效地对抗来自不乎合 RFC 的垃圾邮件程序的邮件。Postgrey 是一个易设置的灰名单政策服务器,它仅需数分钟便可被安装和设置于在一台运作中的 CentOS 邮件服务器上。

7. 连结

http://www.greylisting.org/

http://postgrey.schweikert.ch/

http://milter-greylist.wikidot.com/sendmail

Translation of revision 37


2023-09-11 07:23