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 с нуля.

Сказать спасибо