防止垃圾邮件和中继

作者:John Wong

互联网自 1970 年代以来就已存在,人们主要将其用于电子邮件。即使在今天,当我们看到互联网上基于多媒体的应用程序数量不断增加时,情况仍然如此。人们仍然比网络浏览器和文件传输程序更频繁地使用电子邮件。原因很简单——它是一种低成本且有效的与世界各地其他人交流的方法。越来越多的人正在接入互联网,他们做的第一件事就是获取一个电子邮件地址。

意识到这一点,某些个人甚至组织抓住了机会向互联网用户发送未经请求的电子邮件。这些邮件大多是商业广告。他们将同一消息的数千份副本发送到从 Usenet 帖子或公司主页获得的电子邮件地址列表。这种行为被称为垃圾邮件。

垃圾邮件的后果是接收者最终要支付电子邮件的费用,因为 ISP(互联网服务提供商)通常按连接时间收费,而下载邮件需要时间。在每个员工都有电子邮件地址且公司有固定线路用于电子邮件的公司中,如果该线路成为垃圾邮件发送者的目标,则该线路可能会变得非常昂贵。

为了隐藏身份,垃圾邮件发送者通常从伪造的电子邮件地址发送邮件,并使用未配置为阻止此类活动的邮件服务器。通常称为中继的行为将导致目标电子邮件服务器代表垃圾邮件发送者向数百甚至数千名用户发送邮件。垃圾邮件会严重影响邮件服务器的性能,并给受影响的公司造成巨大的带宽损失。不仅邮件服务器的性能会受到影响,垃圾邮件的接收者还会认为该公司与垃圾邮件发送者有业务往来。

有关此方面的更多信息,请访问互联网上排名第一的反垃圾邮件网站:http://spam.abuse.net/。

smtpd 软件包

我的公司最近成为垃圾邮件发送者的目标,他们使用我们的邮件服务器作为中继。垃圾邮件发送者使用的是一家知名服务提供商的帐户,我猜这可能是一个试用帐户。我没有安装任何预防此类攻击的措施,因此成为了目标。当我发现攻击时,我放下了手头的所有工作,开始寻找解决方案。我首先查看了 Sendmail 主页 (http://www.sendmail.org/)。它有一些链接,指向更多用于预防垃圾邮件的工具和技巧。我选择基于 Obtuse Systems Corporation 的 smtpd 软件包实施该解决方案,原因如下:

  1. smptd 是一个小型的软件包,只有两个可执行文件需要管理,以及一个配置文件需要调整。

  2. 它可以很好地与我的邮件服务器 (Sendmail v8.8.8) 协同工作。

  3. 配置文件非常灵活且易于配置。

截至撰写本文时,smtpd 软件包的版本为 2.0,可以从 ftp://ftp.obtuse.com/pub/smtpd/smtpd-2.0.tar.gz 获取。

smtpd 可以与其他 MTA(邮件传输代理)一起使用,但我只使用 Sendmail。最新的 Sendmail 可以从 ftp://ftp.sendmail.org/ucb/src/sendmail/sendmail.8.9.1.tar.gz 获取。

请注意,在安装 smtpd 之前,您必须拥有一个可正常工作的 MTA。它仅充当邮件代理,存储邮件并将邮件转发到其他 MTA 以进行实际传递。

简而言之,以下是 smtpd 的工作原理:smtpd 守护程序运行并接受邮件,而不是您的常规邮件服务器。它接受来自互联网以及您自己域的邮件。smtpd 可以配置为基于以下几个标准拒绝邮件:

  1. 发件人的 IP 地址

  2. 发件人的主机名或域名

  3. 发件人的电子邮件地址

  4. 收件人的电子邮件地址

根据配置文件,邮件将被拒绝或接受并放入假脱机目录。第二个程序 smtpfwdd 将执行将假脱机邮件转发到 MTA(在本例中为 Sendmail)的实际操作。

编译和安装软件包

获得软件包后,将文件解压缩到目录中。假设文件将被放置在 /usr/src/smtpd-2.0 目录中,请执行以下操作:

cd /usr/src
tar xvzf ~/smtpd-2.0.tar.gz
cd smtpd-2.0

现在,通过键入 ls,您将看到许多文件和子目录。请务必阅读 README 和 INSTALL,因为这些文件包含有关邮件代理安装的重要信息。

要编译软件包,请执行以下操作:

  1. 为运行 smtpd 守护程序选择用户和组。您的选择必须在 sendmail.cf 文件中定义为受信任用户。我选择使用用户 daemon。如果您不确定要使用什么作为受信任用户,请检查 /etc/sendmail.cf 文件中类似这样的行:

    # Trusted users #
    Troot
    Tdaemon
    Tuucp
    
    在此示例中,受信任用户是 rootdaemonuucp不要 使用 rootsmtpd 在没有任何 root 权限的情况下工作;因此,以其他用户身份运行它更安全。
  2. 创建一个目录,smtpd 可以在其中存储假脱机邮件,然后再由 smtpfwdd 处理。更改权限以及该目录的用户/组,以便只有该用户拥有完全权限。如果您将其放在 /home/smtpd/spool 目录中,请执行以下命令:

    mkdir /home/smtpd
    mkdir /home/smtpd/spool
    chown -R daemon.daemon /home/smtpd
    chmod 700 /home/smtpd
    ls -lad /home/smtpd
    
    ls 的输出将如下所示:
    drwx------ 3 daemon daemon 1024 Mar 26 01:34
     /home/smtpd/
    
  3. 编辑源目录中的 Makefile 以反映您的选择。我们需要为我们的示例进行的更改如下:

    SMTP_USER = daemon
    SMTP_GROUP = daemon
    SPOOLDIR = /home/smtpd
    SPOOLSUBDIR = /spool
    EHLO_KLUDGE=1
    JUNIPER_SUPPORT=0
    #LD_LIBS=-lresolv
    CHECK_IDENT = 0
    
    需要 EHLO_KLUDGE 来修复 Netscape Communicator 中的一个错误。除非您正在使用 Obtuse 的防火墙内核,否则 JUNIPER_SUPPORT 设置为 0。LD_LIBS 已被注释掉,因为我的 Linux 发行版不需要外部库 libresolv。CHECK_IDENT 已设置为 0 以禁用 IDENT 检查。我个人不相信 IDENT 检查——它们很耗时,并且不返回任何有用的信息。

    默认情况下,Makefile 已配置为在 Linux 上编译,因此无需进行其他更改。

  4. 在源目录中,键入 make 以编译 smtpd 和 smtpfwdd。

  5. 编译完成后,您将在目录中找到两个可执行文件。将它们复制到 PATH 中的另一个位置。要将它们复制到 /usr/local/sbin 目录,请键入:

    cp smtpd /usr/local/sbin
    cp smtpfwdd /usr/local/sbin
    
  6. 通过键入以下命令在 /home/smtpd/ 目录下创建几个子目录:

    cd /home/smtpd
    mkdir etc usr
    mkdir usr/lib
    mkdir usr/lib/zoneinfo
    
    由于 smtpd 对目录 /home/smtpd 执行 chroot,我们需要将一些 smtpd/smtpfwdd 正确执行所需的文件复制(或创建符号链接)到此目录中。文件以及每个文件应位于的目录是:
    • /etc/resolv.conf -> /home/smtpd/etc/resolv.conf

    • /usr/lib/zoneinfo/localtime -> /home/smtpd/usr/lib/zoneinfo/localtime

    需要 resolv.conf 文件,以便 smtpd 可以执行 DNS 查询(查找主机 IP 地址)。localtime 文件包含您的时区设置,并且是为电子邮件添加正确时间戳所必需的。localtime 的位置在您的系统上可能有所不同,因此您必须找到确切的路径并在 /home/smtpd 目录下创建一个副本。

  7. 配置 smtpd 和 smtpfwdd 以替换正在运行的邮件服务器。

配置 smtpd

邮件代理从 /etc 目录中的文件 (smtpd_check_rules) 读取其配置,在我们的示例中,为 /home/smtpd/etc/smtpd_check_rules。文件中以 # 开头的每一行都是注释。允许空行。规则具有以下格式(一行):

[allow|deny|noto]:SourceList:FromList:ToList[:XXX message]

其中 XXX 是错误消息编号。将采用第一个匹配的规则并结束检查,因此应谨慎放置规则。

第一个字段说明操作是允许 SMTP 连接、拒绝 SMTP 连接并关闭会话,还是 noto,这将为匹配的规则返回错误,但仍将继续会话。

第二个字段是 IP 地址和/或主机名的列表,用于匹配源 SMTP 连接。IP 地址可以使用网络掩码指定,以包含整个网络。其格式为 XX.XX.XX.XX/位,其中位是网络的网络掩码位数。例如,网络 192.168.0.0,网络掩码为 255.255.255.0,将写为 192.168.0.0/24。可以使用的一些特殊保留标识符是:

  • ALL:任何 IP 地址和主机名

  • KNOWN:仅 DNS 可解析的 IP 地址和主机名

  • UNKNOWN:DNS 不可解析的 IP 地址和主机名

  • EXCEPT:例外

  • *:通配符

第三个和第四个字段用于匹配电子邮件地址,格式为 user@host。特殊单词 ALL 也可以在这些字段中使用。

第五个字段是可选的,用于从 denynoto 向 SMTP 客户端返回错误消息。以下特殊变量可用于在错误消息中返回信息:

  • %F:邮件发件人地址

  • %T:收件人地址

  • %H:连接主机名

  • %I:连接 IP 地址

  • %U:来自主机的用户

所有三个字段(SourceListFromListToList)都必须匹配才能采取操作。

列表 1 是一组规则的示例,该规则假定内部网络为 10.0.0.0,邮件中心位于 10.0.0.9。请注意,noto_delay 将在采取操作之前暂停一定秒数。引入此选项是为了延迟中继者和垃圾邮件发送者,并且控制此超时的参数在 Makefile 中设置。

NOTO_DELAY = 60
DENY_DELAY = 60

还可以完成一些我在此处未展示的其他配置,即 NS= pattern-check 以及使用 IDENT 协议来识别用户。需要更详细地设置此文件的用户应阅读源目录中的文件 smtpd_address_check.txt。过滤垃圾邮件和中继的示例可以从 Obtuse 的 FTP 站点下载。

运行 smtpd

创建配置文件后,必须停止正在运行的邮件守护程序,并将其替换为 smtpd/smtpfwdd。对于 Sendmail,可以通过键入以下命令来完成:

> ps ax | grep sendmail
24569 ? S 0:00 sendmail: accepting connections on port 25
> kill 24569

这将有效地关闭邮件守护程序。现在,通过发出以下命令检查守护程序尚未发送的排队邮件:

/usr/lib/sendmail -bp
如果邮件队列不为空,请通过键入以下命令刷新队列:
/usr/lib/sendmail -q
如果一段时间后邮件仍在队列中,则可以稍后重新发送此命令,以便 smtpd/smtpfwdd 的安装可以继续。在邮件守护程序关闭期间,不会接受任何新邮件。

通过发出以下命令启动 smtpd 守护程序:

/usr/local/sbin/smtpd -c /home/smtpd -d /spool\
-u daemon -g daemon -D
-L

smtpd 守护程序将开始接受邮件并将其放入 /home/smtpd/spool 目录。命令行上的参数定义如下:

  • -c /home/smtpd:smtpd 主目录

  • -d /spool:应存储假脱机邮件的目录

  • -u daemon -g daemon:用户/组 smtpd

  • -D:以守护程序身份运行并侦听 SMTP 端口的指令

  • -L:指示在守护程序模式下禁止子进程发出 openlog 调用

一旦 smtpd 正在运行,请检查目录——它将充满以 smtp 为前缀的文件。这些文件是假脱机邮件消息,需要由 MTA 处理。这是 smtpfwdd 的工作。我们通过键入以下命令运行 smtpfwdd:
/usr/local/sbin/smtpfwdd -d /home/smtpd/spool -u\
daemon -g daemon
一旦开始运行,smtpfwdd 将检查假脱机目录 /home/smtpd/spool,并通过运行 MTA(在本例中为 Sendmail)开始处理假脱机邮件。

一个好主意是以这样一种方式运行 MTA,使其定期处理其邮件队列并发送任何存在的邮件。请注意,我们实际上这里有两个假脱机目录:一个由 smtpd 使用,另一个由 sendmail 使用(通常在 /var/spool/mqueue 中)。要以非守护程序模式运行 sendmail 以便每 15 分钟处理队列,请键入:

/usr/lib/sendmail -q15m

一旦一切运行良好,请编辑您的启动文件,以便默认运行 smtpd/smtpfwdd 而不是 sendmail。

总结

互联网已不再是我们曾经认为的“友好的地球村”。在网民中生活着一些肆无忌惮的个人甚至公司,他们利用互联网的开放性为自己谋取利益,却让别人承担成本。如果我们想避免成为受害者,就必须采取预防措施来应对这些攻击。电子邮件服务器上的适当策略将有助于确保这一点。通过安装 smtpd,您将更好地控制您的电子邮件服务器。

John Wong 的联系方式是 johnw@extol.com.my。

加载 Disqus 评论