我很难弄清楚如何为将在容器内运行的 Postfix 实例创建特定的 Postfix 配置。
这是我的要求:
- 禁止中继,除非发件人来自一小组 IP 地址之一或者发件人是本地程序(尽管如何允许容器外部的程序为容器中运行的 Postfix 排队邮件是一个有趣的难题)。
- 通过一小组检查运行来自非中继 IP 地址的每封传入邮件,如果未全部通过则拒绝投递:
- 如果发件人 IP 在指定的 RBL 中,则拒绝它。
- 将传入 IP 列入灰名单 我以前没有接受过邮件。
- 如果目标地址的用户部分与一小组正则表达式中的任何一个都不匹配,则拒绝它。
- 如果邮件未通过 Spamassassin 的一些简单而快速的检查,请拒绝它。
- 对于所有本地交付,请使用程序来确定最终处置。该程序将产生四个结果之一。
- 投递至不同的本地地址(Delivered-To 将更新以提供循环保护,并且本地投递程序将再次运行)。
- 转发到远程地址(例如 Gmail 帐户或其他地址)。
- 传送到特定用户(目前始终是同一用户)拥有的本地 Maildir 目录。
我只需要处理发送到一个域的邮件。在某些时候,我想添加一个新的域,其中所有邮件都由 Mailman 处理,尽管在投递之前拒绝任何不存在的列表地址的邮件也很好。
是否有任何指向指定如何实现这些目标中的一个或多个目标的文档?本地和传输的 Postfix 手册太晦涩难懂,没有真正的帮助。如果有一个文档详细说明系统中的邮件流以及如何在各个点更改邮件流,那就太好了。
另外,虽然我可以编写自己的程序来发送到 Maildir 邮箱,但完全正确地做到这一点相当棘手,并且我希望尽可能避免它,并且 Postfix 的一部分已经知道如何执行此处理它。
Postfix 将在容器中运行。队列目录和 Maildir 目录将是安装在容器内的持久文件系统。我认为实现我之前谈到的东西(postgrey、spamassassin、决定如何处理本地邮件的东西)所需的所有程序也将在同一个容器中运行。我可能必须安排 postgrey 和 spamassassin 保持的状态在容器调用中也保持不变。
我将使用 mutt 来阅读邮件。目前,我将是唯一一个在本地传送邮件的人,尽管我将有几个不同的 Maildir 目录来传送邮件。我可能会在同一系统上运行 Dovecot(可能在不同的容器中容器化)来执行此操作。
另外,我有几百个本地收件人地址,我希望以相同的方式处理其中的大多数地址。它们都符合某种模式,但有些符合这种模式的人需要与其他人区别对待。我事先知道哪些内容,而无需参考电子邮件的内容,因此我可以为这些内容创建更具体的模式。
答案1
许多项目都可以在以下smtpd_client_restrictions
部分中涵盖后缀配置参数
以下是我的客户限制:
smtpd_client_restrictions = permit_mynetworks
permit_sasl_authenticated
check_helo_access
hash:/etc/postfix/helo_access
check_client_access
hash:/etc/postfix/client_checks
reject_unauth_destination
check_policy_service unix:private/policy-spf
reject_rbl_client cbl.abuseat.org
reject_rbl_client pbl.spamhaus.org
reject_rbl_client sbl.spamhaus.org
reject_rbl_client bl.blocklist.de
reject_unknown_client
此配置可删除大约 99% 的传入垃圾邮件。该列表是一个有序列表。每项检查都会被忽略到下一项。一旦发生故障,邮件就会被拒绝。我发现我需要为我的规则创建一些例外,这些例外包含在client_checks
db 文件中。
该异常文件如下所示:
cat /etc/postfix/client_checks
ip.address.123.456 OK
ip.address.789.123 REJECT
制作纯文本柱状文件后,您需要发出命令postmap
,以便该文件作为数据库文件输出。
postmap /etc/postfix/client_checks
通过别名设置具有一两个收件人的系统的转发规则应该相当容易。
man aliases
man postaliases
文件格式和过程几乎相同。逐行输入别名,然后发出命令postaliases
来创建数据库。
对于更复杂的别名,可以将正则表达式包含在别名表中:
man regexp_table
...
EXAMPLE SMTPD ACCESS MAP
# Disallow sender-specified routing. This is a must if you relay mail
# for other domains.
/[%!@].*[%!@]/ 550 Sender-specified routing rejected
# Postmaster is OK, that way they can talk to us about how to fix
# their problem.
/^postmaster@/ OK
# Protect your outgoing majordomo exploders
if !/^owner-/
/^(.*)-outgoing@(.*)$/ 550 Use ${1}@${2} instead
endif