Pull to refresh

Настройка нескольких экземпляров Postfix на одном сервере

Reading time 4 min
Views 20K
Хочу поделиться с Вами одним из вариантов настройки и использования Postfix’a, когда в нашем распоряжении есть несколько IP с которых можно вести доставку писем.

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



Прошу пожаловать под кат, кому эта тема интереса.


Дано:
  • Debian сервер
    • eth0, eth0:1, eth0:2 — внешний интерфейс с алиасами
      • x.x.x.1, x.x.x.2, x.x.x.3
    • eth1, eth1:1, eth1:2 — внутренний интерфейс с алиасами
      • y.y.y.1, y.y.y.2, y.y.y.3
  • Postfix 2.9.x
  • Домен — example.com


Задача:
  • Мапинг внутренних и внешних IP с индивидуальными очередями и возможностью индивидуальной настройки. Все что приходит на отсылку в определенный внутренний интерфейс должно уйти через предопределенный внешний интерфейс
    • localhost(sendmail, mail()) -> x.x.x.1
    • y.y.y.1 -> x.x.x.1
    • y.y.y.2 -> x.x.x.2
    • y.y.y.3 -> x.x.x.3
  • Входящая почта (MX) example.com принимается на один IP
    • x.x.x.1
  • Доставка почты от пользователей домена + sasl авторизация
    • x.x.x.1 -> x.x.x.1


Решение:

Для удобства придумываем хостнеймы для IP, я использую нотацию по назначению:
  • y.y.y.1 — mx.example.com
  • y.y.y.2 — mail-out2.example.com
  • y.y.y.3 — mail-out3.example.com
  • x.x.x.1 — mx.local
  • x.x.x.2 — mail-out2.local
  • x.x.x.3 — mail-out3.local


Для нормальной работы следует позаботиться о DNS, у нас один принимает почту и все postfix’ы будут отсылать почту, для них следует прописать PTR и SPF записи, вот так будут выглядеть прямые и обратные RR для example.com:
	
	example.com.			IN	MX	0 mx.example.com.
	mx.example.com.		IN 	A 	x.x.x.1 
	mail-out2.example.com.	IN 	A 	x.x.x.2
	mail-out3.example.com.	IN 	A 	x.x.x.3
	example.com.			IN	TXT	"v=spf1 ip4:x.x.x.2 ip4:x.x.x.4 mx -all"

	1.x.x.x..in-addr.arpa.		IN	PTR	mx.example.com.
	2.x.x.x..in-addr.arpa.		IN	PTR	mail-out2.example.com.
	3.x.x.x..in-addr.arpa.		IN	PTR	mail-out3.example.com.

Пред тем как заняться инстансами, необходимо изменить настройки основного postfix’а, как настроить postfix для работы MX написано было много, посему остановлюсь на основных моментах, редактируем /etc/postfix/main.cf:
Оставляем только ipv4 и прописываем необходимые ip, обработка писем
		inet_interfaces = x.x.x.1, y.y.y.1, 127.0.0.1
		inet_protocols = ipv4

Принудительно отправляем письма с одного IP и прописываем к нему HELO
		smtp_bind_address = x.x.x.1
		smtp_helo_name = mx.example.com
		myhostname = mx.example.com

Доставляем письма только со своей внутренней сети и своих IP:
		mynetworks = x.x.x.1, x.x.x.2, x.x.x.3, y.y.y.0/24

Принимаем почту для своего домена:
		mydestination = example.com, *.example.com, localhost

Основной Postfix готов. Создаем наши инстансы. Нам понадобиться 2 дополнительных инстанса которые будут настроены лишь для отсылки писем, стандартный будет принимать локальную почту, а так же будет MX’ом для домена example.com.

		# postmulti -e init
		# postmulti -I postfix-mail-out2 -G out-only -e create
		# postmulti -I postfix-mail-out3 -G out-only -e create

Настраиваем инстансы. Файлы настроек будет в /etc/postfix-mail-out2 и postfix-mail-out3 соответственно. Открываем /etc/postfix-mail-out2/main.cf. Прописываем HELO, внешний и внутренний IP:
		myhostname = mail-out2.example.com
		smtp_bind_address = x.x.x.2
		smtp_helo_name = mail-out2.example.com
		inet_protocols = ipv4
		inet_interfaces = x.x.x.2, y.y.y.2

Поскольку дополнительные инстансы будут заниматься только отсылкой почты, надо запретить локальную доставку и прописать откуда возможен релей:
		mydestination =
		alias_maps =
		alias_database =
		local_recipient_maps =
		local_transport = error:5.1.1 Mailbox unavailable
		mynetworks = /etc/postfix/mynetworks

Чтобы иметь возможность перекидывать почту с одного физического сервера на другой в внутри локальной сети, необходимо добавить еще один траспорт, назовем его lrelay. Делаем это в master.cf каждого инстанса. Добавляем строку:
		lrelay     unix  -       -       -       -       -       smtp
					    -o smtp_bind_address=y.y.y.2

Перекидывать с одного сервера на другой можно будет через transport_maps. Прописываем в каждый инстанс:
		transport_maps = hash:/etc/postfix-mail-out1/transport

Например чтобы все письма с mail-out1 были переправлены на mail-out2. В /etc/postfix-mail-out1/transport добавляем строку:
		*	lrelay:y.y.y.3

Второй инстанс настраивается аналогично, меняются только IP.

После настройки необходимо активировать инстансы:
		# postmulti -i postfix-mail-out2 -e enable
		# postmulti -i postfix-mail-out3 -e enable

И перезапустить postfix:
		# /etc/init.d/postfix restart

Перезапуск, старт и остановка отдельных инстансев может производиться через postmulti:
		# postmulti -i postfix-mail-out2 -p start/stop
		# postmulti -i postfix-mail-out3 -p start/stop

Проверить кто запущен, а кто нет:
		# postfix status
		postfix/postfix-script: the Postfix mail system is running: PID: 762
		postfix-mail-out2/postfix-script: the Postfix mail system is running: PID: 114
		postfix-mail-out3/postfix-script: the Postfix mail system is running: PID: 149

Теперь имеем 3 раздельные очереди, которые можно до-настраивать по собственному желанию.

У меня для основного постфикса и дополнительных инстансев запущены dkim и domainkey демоны которые подписывают исходящие письма.

Для каждого инстанса можно настроить любые фильтры и подключить все что необходимо, spamassin, gerylist и т.д.

Как и для чего можно использоваться такую конфигурацию:
  • bulk рассылка, можно иметь на одном сервере много IP с которых ведется рассылка с индивидуальными настройками
  • высокая производительность
  • часто большие почтовые службы ограничивают прием писем по IP, имея в своем распоряжении несколько можно улучшить доставку большего количества писем
  • виртуальный почтовых безопасный хостинг
  • для каждого домена можно настроить свою копию
  • сложная обработка писем, на уровне сервера
  • например внутренняя корреспонденция обрабатывается без фильтров
  • внешняя корреспонденция обрабатывается более строго, спам, серые и листы, например


Немного полезные ссылок по настройке Postfix\а:


P.S. Какая же работа сервиса без статистики. В связи с этим написал расширение для Cacti которое будет собирать с каждого инстанса статистику по кол-ву писем в очередях через SNMP. Напишу это отдельным постом.

Задавайте вопросы, буду рад помочь.
Tags:
Hubs:
+23
Comments 5
Comments Comments 5

Articles