Назад | Перейти на главную страницу

Балансировка исходящей электронной почты с несколькими IP-адресами

Я хочу сбалансировать исходящие электронные письма через несколько IP-адресов, есть ли какой-либо встроенный инструмент или какой-либо простой способ сделать это с помощью postfix, sendmail или exim? например, если я назначаю почтовому серверу три IP-адреса, и электронные письма отправляются через все IP-адреса один за другим.

С Postfix 2.7 или новее это довольно просто.

Сначала создайте по одной записи для каждого IP-адреса в master.cf, например:

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

Закомментируйте все остальные transport_maps в main.cf, например:

#transport_maps = ...

Вот трюк: эта транспортная таблица будет использовать RAND () для рандомизации использования всех out [1..n] транспортов, перечисленных в master.cf.

В /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

Наконец, создайте таблицу с именем 'transport_roundrobin' в базе данных 'dbname', запущенную на 'dbhost', и вставьте по одной строке для каждого транспорта:

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 выберет случайную строку из mysql-таблицы transport_roundrobin, а затем будет использовать полученное значение для выбора соответствующего транспорта в master.cf. Каждый транспорт будет использовать другой IP-адрес в соответствии с -o smtp_bind_address

Если вы хотите отправлять письма с разных IP-адресов с одного почтового сервера, вам следует подумать о нескольких экземплярах postfix на одном хосте. И вы можете назначить другой IP-адрес для каждого экземпляра, и ваш нулевой экземпляр будет отправлять письма для каждого экземпляра. для более подробной информации вы можете обратиться к этим ссылкам. Здесь описано, как назначить IP и все 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 config, предложенный уже, и добавьте следующее main.cf (при условии, что у вас есть 3 записи в master.cf):

sender_dependent_default_transport_maps = randmap:{out1,out2,out3}
smtp_connection_cache_on_demand=no