Postfix — выбор ip адреса отправителя по принципу Round Robin

В Postfix ip адреса при отправке можно устанавливать самостоятельно и менять если в этом есть необходимость. Обычно несколько адресов задается для больших сервисов рассылки. Если один из них блокируется получателем, письма с других будут продолжать поступать.

 

Postfix ip адреса при отправке

Настроим конфигурацию при которой один из двух адресов, используемых сервером, будет выбираться в качестве адреса сервера отправителя автоматически.

 

Postfix версий 3+ позволяет выбирать адрес случайным образом, для более ранних версий такой возможности нет. В примере используется Postfix 2.9 с выбором значения по принципу Round Robin в SQL таблице. Такое решение универсально.

 

 

Внесем изменения в файл /etc/postfix/main.cf добавив одну строку

 

mcedit /etc/postfix/main.cf

sender_dependent_default_transport_maps = mysql:/etc/postfix/config/transport_roundrobin.cf

 

В /etc/postfix/config/transport_roundrobin.cf будут храниться настройки подключения к базе данных, из которой берутся значения, соответствующие IP адресам.

 

mcedit /etc/postfix/master.cf

out1 unix — — n — — smtp
-o syslog_name=postfix-out1
-o smtp_helo_name=example.com
-o smtp_bind_address=123.123.123.123
out2 unix — — n — — smtp
-o syslog_name=postfix-out2
-o smtp_helo_name=example.com
-o smtp_bind_address=123.123.124.124

 

Здесь заданы блоки out1 и out2, они будут идентификаторами в SQL таблице. Для каждого блока определен IP адрес отправителя (посмотреть все возможные адреса можно выполнив ip a). Также задано имя, которое передается в SMTP сессии и имя в syslog.

 

Чтобы Postfix мог работать с MySQL требуется установка дополнительного пакета

apt-get install postfix-mysql

 

 

Задаем реквизиты подключения к базе

mcedit /etc/postfix/config/transport_roundrobin.cf

user = root
password = PznqhqyuJKghds8dwhsUWfHj9
dbname = rr
hosts = 127.0.0.1
query = SELECT transport FROM transport_roundrobin ORDER BY RAND() LIMIT 1;

 

Подключимся к серверу баз данных, создадим базу и таблицу

mysql -u root -pPznqhqyuJKghds8dwhsUWfHj9

create database rr;

use rr;

CREATE TABLE transport_roundrobin (transport varchar(40) not null);

 

Добавляем в таблицу записи со значениями out1 и out2

INSERT INTO transport_roundrobin (transport) VALUES ('out1')

INSERT INTO transport_roundrobin (transport) VALUES ('out2');

 

Теперь нужно проверить работает ли выборка в случайном порядке. Проще всего сделать это выполняя заданный ранее запрос вручную

 

SELECT transport FROM transport_roundrobin ORDER BY RAND() LIMIT 1;

+————+
| transport |
+————+
| out1 |
+————+
1 row in set (0.01 sec)

 

SELECT transport FROM transport_roundrobin ORDER BY RAND() LIMIT 1;

+————+
| transport |
+————+
| out2 |
+————+

 

Получены разные значения — соответственно выборка производится так, как нужно.

 

Теперь достаточно выполнить tail -f /var/log/mail.log и в другой консоли отправлять письма telnet-ом. В лог будет писаться информация об успешности или не успешности отправки.

 

Просмотрев исходник полученного письма в дальнейшем можно будет увидеть, что отправляются письма с разных IP адресов.

Про настройку почтового сервера с Postfix с нуля.