Toqeer Asked: 2012-09-11 09:40:08 +0800 CST2012-09-11 09:40:08 +0800 CST 2012-09-11 09:40:08 +0800 CST 具有多个 IP 的出站电子邮件负载平衡 772 我想通过多个 IP 负载平衡出站电子邮件,是否有任何内置工具或一些简单的方法可以使用 postfix、sendmail 或 exim 来实现?例如,如果我为电子邮件服务器分配了三个 IP,并且电子邮件通过所有 IP 逐一发送。 email 3 个回答 Voted Luca Gibelli 2015-11-20T10:26:48+08:002015-11-20T10:26:48+08:00 使用 Postfix 2.7 或更高版本,这很容易。 首先在 master.cf 中为每个 IP 创建一个条目,如下所示: out1 unix - - n - - smtp -o syslog_name=postfix-out1 -o smtp_helo_name=out1.yourdomain.tld -o smtp_bind_address=a.b.c.1 out2 unix - - n - - smtp -o syslog_name=postfix-out2 -o smtp_helo_name=out2.yourdomain.tld -o smtp_bind_address=a.b.c.2 [...] outN unix - - n - - smtp -o syslog_name=postfix-outN -o smtp_helo_name=outN.yourdomain.tld -o smtp_bind_address=a.b.c.N 然后在 main.cf 中创建一个依赖于发送者的传输映射,如下所示: sender_dependent_default_transport_maps = mysql:/etc/postfix/config/transport_roundrobin.cf 注释掉 main.cf 中的所有其他 transport_map,如下所示: #transport_maps = ... 现在这里是诀窍,这个传输表将使用 RAND() 来随机化 master.cf 中列出的所有 out[1..n] 传输的使用。 在 /etc/postfix/config/transport_roundrobin.cf 中写入: user = dbuser password = dbpass dbname = dbname hosts = dbhost query = SELECT transport FROM transport_roundrobin ORDER BY RAND() LIMIT 1 最后,在“dbhost”上运行的数据库“dbname”上创建一个名为“transport_roundrobin”的表,并为每个传输插入一行: CREATE TABLE transport_roundrobin (transport varchar(40) not null) INSERT INTO transport_roundrobin (transport) VALUES ('out1'); INSERT INTO transport_roundrobin (transport) VALUES ('out2'); [...] INSERT INTO transport_roundrobin (transport) VALUES ('outN'); Postfix 会从 transport_roundrobin mysql 表中随机选择一行,然后使用获得的值在 master.cf 中选择相应的传输。根据 -o smtp_bind_address,每个传输将使用不同的 ip 地址 Best Answer user128296 2012-09-11T09:55:50+08:002012-09-11T09:55:50+08:00 如果您想从单个邮件服务器发送来自不同 Ip 的邮件,那么您应该考虑在单个主机上使用 postfix 多个实例。您可以为每个实例分配不同的 IP 地址,您的空实例将为每个实例提交邮件。有关更多详细信息,您可以参考这些链接 This one for how to assign Ip and all http://souptonuts.sourceforge.net/postfix_sbr.html 以及关于我们如何创建以及实例如何工作的所有基本信息http://www.postfix .org/MULTI_INSTANCE_README.html synkro 2017-01-27T13:50:14+08:002017-01-27T13:50:14+08:00 如果使用 postfix 3,请检查此解决方案,它使用randmap,因此您不需要 mysql 的RAND()功能。 https://shami.blog/2016/04/randomize-source-ip-addresses-with-postfix/ 您可以执行master.cf建议的配置,并添加以下内容main.cf(假设您在 中有 3 个条目master.cf): sender_dependent_default_transport_maps = randmap:{out1,out2,out3} smtp_connection_cache_on_demand=no
使用 Postfix 2.7 或更高版本,这很容易。
首先在 master.cf 中为每个 IP 创建一个条目,如下所示:
然后在 main.cf 中创建一个依赖于发送者的传输映射,如下所示:
注释掉 main.cf 中的所有其他 transport_map,如下所示:
现在这里是诀窍,这个传输表将使用 RAND() 来随机化 master.cf 中列出的所有 out[1..n] 传输的使用。
在 /etc/postfix/config/transport_roundrobin.cf 中写入:
最后,在“dbhost”上运行的数据库“dbname”上创建一个名为“transport_roundrobin”的表,并为每个传输插入一行:
Postfix 会从 transport_roundrobin mysql 表中随机选择一行,然后使用获得的值在 master.cf 中选择相应的传输。根据 -o smtp_bind_address,每个传输将使用不同的 ip 地址
如果您想从单个邮件服务器发送来自不同 Ip 的邮件,那么您应该考虑在单个主机上使用 postfix 多个实例。您可以为每个实例分配不同的 IP 地址,您的空实例将为每个实例提交邮件。有关更多详细信息,您可以参考这些链接 This one for how to assign Ip and all http://souptonuts.sourceforge.net/postfix_sbr.html 以及关于我们如何创建以及实例如何工作的所有基本信息http://www.postfix .org/MULTI_INSTANCE_README.html
如果使用 postfix 3,请检查此解决方案,它使用randmap,因此您不需要 mysql 的
RAND()
功能。 https://shami.blog/2016/04/randomize-source-ip-addresses-with-postfix/您可以执行
master.cf
建议的配置,并添加以下内容main.cf
(假设您在 中有 3 个条目master.cf
):