我需要安装 Postfix 并让它监听两个不同的端口:1025 和 1026:
/etc/postfix/master.cf:
1025 inet n - y - - smtpd
1026 inet n - y - - smtpd
我需要两个不同的中继主机来接收来自这两个端口的消息:
relay1.domain.com
对于到达端口的消息1025
relay2.domain.com
对于到达端口的消息1026
中继主机使用不同的身份验证(对于此我知道我可以使用该smtp_sasl_password_maps
选项)。
我能做的是在不同的端口上启用两种传输,但我不能做的是为不同的传输指定不同的中继主机:我知道我可以使用该transport_maps
选项为不同的目的地指定不同的传输(和中继主机),但不能为不同的监听端口指定。
我也知道我可以创建不同的 Postfix 实例(使用不同的master.cf
配置文件),但我想保留单个实例,这样我就不必处理不同的systemctl
服务。
你有什么主意吗?
答案1
读男人 5 大师小心:
逻辑行以非空白文本开头。以空白开头的行继续逻辑行。
通常以空格开头的行会延续表的最后一个字段,并允许为该表中的命令提供参数。
知道您可以通过命令行参数直接设置(覆盖)smtpd
属性:master.cf
1025 inet n - y - - smtpd
-o relayhost=[relay1.example.com]
1026 inet n - y - - smtpd
-o relayhost=[relay2.example.com]
方括号抑制 MX 查找(例如,这将使用 A 记录,relay1.example.com
而不是查找它的 MX 记录,然后查找该名称的 A 记录)。
main.cf
这样,您就只需覆盖该守护进程特定实例的设置。
在“-o”的参数中不应有空格master.cf
(特别是“=”周围不应有空格),您甚至不能为此使用引号。如果您需要在那里留空格,或者您只是想在中设置它main.cf
,您可以在那里声明变量并在中引用它们master.cf
:
main.cf
:
relayhost_1025 = [relay1.example.com]
relayhost_1026 = [relay2.example.com]
master.cf
:
1025 inet n - y - - smtpd
-o relayhost=$relayhost_1025
1026 inet n - y - - smtpd
-o relayhost=$relayhost_1026
或者,可以使用花括号来括起空格;这在我链接的手册中描述过,但我自己从未这样做过。
您可能已经猜到了,任何选项都可以像这样覆盖,而且您可以覆盖多个选项。即使您master.cf
仔细查看默认值,您也可能会注意到使用该语法的(可能)注释掉的submission
服务。通常还会定义其他服务,这些服务跨越多行,就像这样。用它作为示例。