使用 Alpine 保护您的电子邮件服务器
![]() 这些指示适用于 Alpine 1.7.............. (讨论) |
本文档将概述如何使用 Alpine Linux 设置垃圾邮件/病毒网关。我想首先说明,这并非设置此类系统的唯一方法。有很多方法可以实现此目标,但这只是我采用的方式。我不保证这对您有效!
我想提到的第一件事是,在无盘系统上设置 Postfix(将邮件队列保存在内存中)可能不是一个好方法。如果您遇到电源故障,您将丢失 Postfix 队列的内容。话虽如此,在我们的组织中,我们使用 UPS 设备为我们的服务器提供备用电源,因此我们的服务器因电源故障而关机的可能性极小(并且我们已准备好承担此风险)。
对于此特定设置,我们将使用以下内容
- 邮件守护进程:Postfix
- 病毒扫描器:Clamav
- SMTP 过滤器:Clamsmtp
- 灰名单服务器:Gross
- 额外定义:SaneSecurity & MSRBL
- relay_recipient_maps 中的 Exchange 2003 用户/组
- Alpine Linux 1.7.19(某些软件包在此版本之前不可用)
设置邮件守护进程
我们要安装的第一件事是我们的邮件守护进程
apk add postfix
这将安装 Postfix,并在 /etc/postfix 中使用默认配置。让我们首先看一下 main.cf,这是(顾名思义)Postfix 的主要配置文件。我将向您展示我的配置文件,您可以使用它(我已经注释掉了一些我们稍后启用的选项)
mynetworks = lan-net/24, 127.0.0.0/8 transport_maps = hash:/etc/postfix/transport relay_domains = $transport_maps smtpd_helo_required = yes disable_vrfy_command = yes #relay_recipient_maps = hash:/etc/postfix/exchange_receipients
smtpd_recipient_restrictions = reject_invalid_hostname, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_sender_domain, reject_unknown_recipient_domain, permit_mynetworks, reject_unauth_destination, #check_policy_service inet:127.0.0.1:5525, # # in case you want reject DNS blacklists rather than greylist them # with gross, uncomment the lines below # # reject_rbl_client cbl.abuseat.org, # reject_rbl_client sbl.spamhaus.org, # reject_rbl_client pbl.spamhaus.org, # reject_rbl_client bl.spamcop.net, # reject_rbl_client list.dsbl.org, permit
smtpd_data_restrictions = reject_unauth_pipelining, permit
#content_filter = scan:[127.0.0.1]:10025
这些是我用于设置 Postfix 邮件网关的最小设置。如果您正在寻找其他设置,请执行以下命令
postconf
这将显示您当前的默认配置。如果您想更改其中任何设置,您可以将它们添加到 main.cf 并重新加载 Postfix。查看我的 main.cf 文件,您将看到设置“transport_maps”。此设置指的是 Postfix 配置目录中的一个文件,该文件将保存 Postfix 的信息,以指示 Postfix 应将电子邮件转发到哪个服务器。它应该看起来像这样
domain-a.tld smtp:[192.168.1.1] domain-b.tld smtp:[192.168.1.2]
每当电子邮件进入我们的邮件网关,并且其域名在我们的“transport_maps”文件中指定时,它将在处理后将此电子邮件转发到分配的 IP 地址。有关完整文档,请参阅 Postfix 文档。当您准备好编辑此文件时,请执行以下命令
postmap /etc/postfix/transport
这将创建此文件的哈希数据库,以便 Postfix 更容易/更快地读取。我们要查看的第二个设置是“relay_domains”。此设置将告诉 Postfix 它将为哪些域中继电子邮件。因为此设置很可能与我们在“transport_maps”中提及的域相同,所以我们可以直接链接到它。现在您的基本电子邮件网关已准备就绪,您可以启动它,但请记住,不会有病毒或垃圾邮件过滤。
rc-service postfix start
我们可以在启动时启动它
rc-update add postfix
设置病毒扫描器
为了能够从我们的电子邮件中过滤掉病毒,我们需要一个病毒扫描器。唯一可用的真正的开源解决方案是 Clamav。让我们安装它
apk add clamav
我们将使用 Clamav 的守护进程版本“clamd”。我们无需更改 Clamav 的任何内容,我们可以使用默认设置,并且病毒定义会自动使用 freshclam 更新。让我们启动它
rc-service clamd start
让我们在启动时启动它
rc-update add clamd
更新: 请参阅 https://wwws.clamav.net/bugzilla/show_bug.cgi?id=1028 这应该在 clamav 0.93.1 中修复
设置 SMTP 过滤器
好的,现在我们已经安装并设置了邮件守护进程和病毒守护进程。现在我们需要让两个守护进程相互通信。最常用的工具是 amavisd-new,但它基于 Perl,我不喜欢它,因为 Perl 可能会占用大量资源,而且我不打算在我的 Alpine 安装上安装它。另一个更轻量级的基于 C 的解决方案是 Clamsmtp。它是一个 SMTP 过滤器,用于侦听传入连接,并使用 clamd 扫描电子邮件,然后将其转发回 MTA。它不像 amavisd-new 那样具有许多功能,但对我来说足够了。让我们安装它
apk add clamsmtp
这是我的 clamsmtp.conf 配置文件
OutAddress: 127.0.0.1:10026 Listen: 127.0.0.1:10025 ClamAddress: /var/run/clamav/clamd.sock TempDirectory: /tmp Action: drop Quarantine: on User: clamav VirusAction: /etc/postfix/scripts/virus_action.sh
Clamsmtp 支持病毒操作脚本,每次 clamd 返回肯定检测结果时都会运行该脚本。我在此处包含了我的病毒操作脚本,但尚未经过充分测试,因此请您自行承担风险使用!确保您在 /etc/postfix/scripts/ 目录中设置了正确的权限,因为 clamsmtp 将以用户 clamav 身份运行。监控您的 /tmp 目录中的日志文件。
好的,让我们通过编辑我们的 master.cf 并在文件末尾添加以下行来为 clamsmtp 配置 Postfix
# AV scan filter (used by content_filter) scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes -o smtp_enforce_tls=no # For injecting mail back into postfix from the filter 127.0.0.1:10026 inet n - n - 16 smtpd -o content_filter= -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks_style=host -o smtpd_authorized_xforward_hosts=127.0.0.0/8
让我们启动 Clamsmtp
rc-service clamstmp start
并将其添加到我们的系统启动项中
rc-update add clamsmtp
如果您确定您的所有设置都正确,我们可以取消注释 main.cf 中的“content_filter”行,这将为 Postfix 启用 Clamsmtp 并运行
postfix reload
设置灰名单服务器
我已经使用灰名单几个月了,虽然它有积极影响,但也有消极影响。积极影响之一是您几乎不会再收到垃圾邮件/病毒电子邮件到您的系统中,但它会给您的部分电子邮件流量带来延迟。如果您的组织足够大,您将开始注意到人们抱怨电子邮件延迟,这就是 Gross 将介入的地方。它仍然使用灰名单,但不会对所有主机都这样做,而只会对与指定的 DNSBL 数据库匹配的主机这样做。如果您想了解有关 gross 的更多信息,请访问他们的网站
https://code.google.com/p/gross/
让我们安装 gross
apk add gross
这是我的 grossd.conf 文件
protocol = postfix statefile = /var/db/gross/state check = dnsbl check = rhsbl dnsbl = zen.spamhaus.org dnsbl = list.dsbl.org dnsbl = bl.spamcop.net dnsbl = combined.njabl.org dnsbl = cbl.abuseat.org dnsbl = dnsbl.sorbs.net rhsbl = rhsbl.sorbs.net
让我们启动 grossd
rc-service grossd start
{{Cmd|lbu_include /var/db/gross/state}
rc-service grossd stop
lbu_commit
rc-service grossd start
让我们在启动时启动它
{{Cmd|rc-update add grossd}
现在我们需要使 Postfix 使用我们的灰名单服务,方法是取消注释 main.cf 中的“check_policy_service”行并运行
postfix reload
设置 SaneSecurity & MSRBL 额外定义
捕获垃圾邮件的另一种好方法是 Sanesecurity 和 MSRBL 定义。您可以在此处找到有关这些定义的更多信息
https://www.sanesecurity.co.uk/
要使用以下脚本,您需要安装以下软件包
apk add curl rsync
将此脚本添加到此 /etc/postfix/scripts/ 目录
并将此脚本添加到 cron
echo "37 03 * * * /etc/postfix/scripts/up_clam_ex.sh &> /dev/nul" >> /etc/crontabs/root
并确保 cron 在启动时运行
rc-update add cron
Exchange 2003 & relay_recipient_maps
Postfix 将处理在“relay_domains”中指定的每个电子邮件地址的邮件。因为我们想阻止 Postfix 处理不存在的目的地的电子邮件,所以我们将 relay_recipient_maps 选项添加到我们的 main.cf 文件中。我已经添加了它,所以只需要取消注释即可。我在此处包含了一个 Visual Basic 脚本,它将提取 Exchange 2003 中用户和组的所有有效电子邮件地址,并将它们放在 IIS 服务器根目录下的文本文件中。我还包含了一个脚本,该脚本将下载此文件并将其处理为 Postfix 可以读取的数据库。将以下文件放在您的 Exchange 服务器上的某个位置,并使其每隔一段时间通过 Windows 任务运行一次
下载以下文件并将其移动到
/etc/postfix/scripts/
并更改其设置并将其添加到 cron。我设置了一个时间,在我在 Exchange 服务器上运行 vbs 脚本后 10 分钟
echo "10,40 * * * * /etc/postfix/scripts/exchange_receipients.sh &> /dev/nul" >> /etc/crontabs/root