我正在寻找一个简单的 Postfix 服务器,它可以修改某些特定 SMTP 消息的内容和收件人。
到目前为止,我对自己的方法并不是很有信心,并且觉得我缺少一些关于 Postfix 如何做事的基础知识,所以我希望能得到一些指导。
语境
我工作的组织的设置最初对像我这样从未真正使用过 Postfix 的人来说有点令人生畏,所以希望我的解释是有道理的。
我能够了解到的是,DMZ 网络中的一台 Linux 机器{1}
正在运行一个 Postfix 服务器,并且是所有传入电子邮件都集中到的地方。
然后,服务器在其文件中定义了一些规则,这些规则根据域(例如, )/etc/postfix/transport
确定要将消息中继到哪些其他邮件服务器。如果域只是基本名称(例如),则消息将传递到员工登录的主电子邮件服务器并检查他们的邮件等。{3..N}
@domain1.company.org
@domain2.company.org
@company.org
{2}
INTERNET | DMZ | INTERNAL
SMTP ---|---> {1} ---|---> {2}
\---> {3..N}
我提到的“特定 SMTP 消息”是来自一些工程师正在设置的一些简单设备的集合。这些设备在可以发送的内容上有些限制。
工程师:我无法更改主题的内容或电子邮件正文的某些区域。
当这些设备发送消息时,我的理解是网络会将消息汇集到{1}
,然后将消息中继到适当的电子邮件服务器。
要求的解决方案
工程师:我们是否可以要求当来自特定地址的电子邮件具有可预测的简单主题和主体时,在转发给收件人之前由我们的系统拦截和修改?例如在主题和正文中,将发送“泄漏”一词,我们可以在转发消息之前将其更改为“冷冻机”吗?
因此,我基本上需要在将邮件转发到任何其他电子邮件服务器之前修改邮件的内容。在消息到达之前{1}
或附近需要发生一些事情。{1}
{2..N}
到目前为止我的方法
鉴于一切顺利{1}
,并且我不想对邮件通过这台机器的方式进行任何重大更改,我想我会启动另一台 Linux 机器来运行另一台 Postfix 服务器(我将调用它mailmunger
,如图所示作为{1a}
)。
然后,工程师将配置设备并指定它将发送的消息的收件人,例如[email protected]
.
最后,我将添加另一条规则(/etc/postfix/transport
我认为是在 中),{1}
以便将邮件*@mailmunger.company.org
转发到我的新 Linux 机器。
然后{1a}
,我会使用诸如队列后内容过滤器之类的东西来处理消息,根据请求修改内容,从收件人地址中删除mailmunger.
,然后将消息传递回{1}
.
这是因为 Postfix server 的relay_host
属性{1a}
会被配置为 server 的名字{1}
。
INTERNET | DMZ | INTERNAL
SMTP ---|---> {1} ---|---> {2}
/ ^ \---> {3..N}
| |
v /
{1a}
我认为这种方法尽可能安全,因为它会限制编写错误的过滤器的影响。但是,也许我在这个设计中犯了一个我没有注意到的错误。
我希望所有正常的邮件流都应该按预期继续,并且只有邮件[email protected]
会卡在我的新mailmunger
机器上。
问题
- 我是否在使用“队列后内容过滤器”的正确轨道上?或者我应该看一个不同的机制,比如队列前内容过滤器?
{1a}
服务器真的需要transport
配置它的文件吗?还是我误解了该属性的使用?- 这些简单的设备如何知道将 SMTP 消息发送到哪个服务器?
- 有什么我应该注意的问题吗?
经过一番挣扎和仔细测试,我有一个解决方案!
它的短处是:
mailmunger
我误解了 MX 记录,不得不为我的服务器创建一些新记录。mailmunger
服务器不需要/etc/postfix/transport
修改其文件。只有/etc/postfix/main.cf
和/etc/postfix/master.cf
需要的修改。更详细的解决方案
所以第一步是修改
/etc/postfix/transport
服务器{1}
。我需要在传输映射中添加一行,以便将消息[email protected]
定向到我的mailmunger
服务器。下一点是配置
mailmunger
。mailmunger
的main.cf
在
main.cf
文件中,我需要两个关键部分。定义
relayhost
变量是告诉服务器“如果您不是应该接收消息的人,请将其传递给这个人”。这是一个关键部分,因为在我修改了消息之后,我将它放回了队列中并使用了不同的收件人。
该
local_recipient_maps
变量需要一个空值,否则服务器将在我的过滤器脚本处理邮件之前找不到指定收件人的邮箱时拒绝邮件。我不在乎收件人是否是在服务器上没有帐户的人,因为我的目的是修改邮件内容和收件人地址。
如果我的脚本失败,消息将被退回给发件人。
mailmunger
的master.cf
我在此处所做的更改基本上正是After-Queue Content Filter指南指定的内容。
该
smtp
服务添加了一个额外的选项,将消息定向到filter
管道服务。该
filter
服务以我创建的特殊用户身份运行我的脚本postfix-filter
,并根据脚本的退出代码将消息放回队列或将其退回给发件人。上的其他东西
mailmunger
正如您在服务配置中可能注意到的那样
filter
,还有一些其他的东西需要创建/配置。/opt/postfix-filters/
. 我只是喜欢那个位置。postfix-filter
用户。我使用 shell 指定了该用户/usr/sbin/nologin
,并将其主目录指定为/opt/postfix-filter
.start-filter
在我的目录中创建了该文件:/opt/postfix-filters/
/opt/postfix-filters/
,例如filters/
和tmp/
。filters/
目录中创建一个或多个用户可执行的脚本postfix-filter
。我会让你弄清楚如何做到这一点,但我会留下一个建议,即所述脚本可以修改传入的参数(最终传递给sendmail
命令)并且应该返回以下任一退出代码:0
(成功并且修改了sendmail
参数)2
(成功,但未修改参数)开始做事
剩下的就是确保 Postfix on
mailmunger
以我的新配置启动。