Я хочу сбалансировать исходящие электронные письма через несколько 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