基于源的 postfix 中继

基于源的 postfix 中继

我有 4 台服务器。prod1.example.com、prod2.example.com、dev1.example.com 和 dev2.example.com。它们都将邮件发送到 smtp.example.com。此服务器负责中继。现在我希望 dev1 和 dev2 将所有电子邮件发送到[电子邮件保护]除了发送至[电子邮件保护]。来自prod1和prod2的电子邮件不受任何限制地转发。

我读到在访问文件中,您可以定义服务器必须由过滤器而不是简单的 RELAY(使用 FILTER foo:bar)处理。我找不到如何以及在何处定义此 foo(传输)和 bar(目标)。所有这些不同的参数让我感到困惑。此外,不同文件的处理顺序是什么?

有人能帮助我吗?

答案1

您的问题可以用这个伪代码来表达

if (client == dev1 OR client == dev2)
    if recipient == admin
        pass it
    else
        redirect to devbox
else
    pass it

不幸的是,postfix 没有通用语言(例如用于 varnish 配置的 vcl)来处理限制和转发。因此,我们可以尝试使用 postfix 中的哈希表功能来解决这个问题。我有两个想法来解决这个问题。

多端口解决方案

我假设(默认情况下)您的开发和生产服务器使用相同端口(端口 25)连接到 smtp.example.com。如果您可以修改代码并调整防火墙限制,因此 dev1 和 dev2 应该使用不同于 25 的端口(例如端口 2525)连接到 smtp.example.com,那么您就可以采用简单的解决方案。如果这种情况不可能发生,您可以跳过这个想法并转到解决方案 2。

为了允许开发服务器通过端口 2525 连接到 postfix,请设置另一个 smtpd 实例并添加此行master.cf

2525       inet  n       -       n       -       -       smtpd -o smtpd_client_restrictions=check_recipient_access,pcre:/etc/postfix/devbox

现在,/etc/postfix/devbox

/admin@example\.com/    OK
/devbox@example\.com/   OK
/.*/                   REDIRECT [email protected]

现在,生产服务器将不会获得如上所述的过滤器,因为它们通过端口 25 连接到 postfix。因此,它可以像以前一样通过 postfix。

限制类别解决方案

如果第一个想法无法实现,那么您可以使用限制类来实现。为此,您可以使用称为限制类的后缀功能。请参阅

在 main.cf 中添加此行

smtpd_restriction_classes = devbox
devbox = check_recipient_access pcre:/etc/postfix/devbox
smtpd_recipient_restrictions = 
    ...
    check_client_access hash:/etc/postfix/emailrouting,
    ...

内容/etc/postfix/emailrouting

dev1.example.com    devbox
dev2.example.com    devbox

内容/etc/postfix/devbox

/admin@example\.com/    OK
/devbox@example\.com/   OK
/.*/                   REDIRECT [email protected]

答案2

我不是这方面的专家,但我最近一直在研究 Postfix,也许至少可以为你提供正确的指导。

使用 postfix,您可以使用别名并将一个地址或一组地址映射到另一个地址。您可能需要的是收件人规范映射:

http://www.postfix.org/ADDRESS_REWRITING_README.html#canonical

当然,使用此方法意味着你必须将所有可能的地址放入文件中,以确保电子邮件发送到除以下地址之外的任何地址:[电子邮件保护]发送至[电子邮件保护],但通过映射您可以使用正则表达式。

https://superuser.com/questions/353488/regex-multiple-catch-all-setup-in-postfix

我的建议是在 Stackoverflow 上询问一个简单的正则表达式来检查地址是否不等于[电子邮件保护]然后发送至[电子邮件保护]。这意味着所有其他地址都将通过此检查,因此转到[电子邮件保护], 然而[电子邮件保护]将会失败,因此只会被发送到预定的地址。

希望这可以给你指明正确的方向,如果你有任何问题我都会尽我所知回答。

相关内容