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

Предотвратить отправку почты Postfix через неправильный сетевой интерфейс

У меня есть почтовый сервер Postfix, работающий на хосте с несколькими сетевыми адаптерами, один из которых является виртуальным устройством tun0. Мне нужен этот почтовый сервер, чтобы принимать соединения на любом адаптере и отправлять электронную почту только на виртуальном устройстве tun.

У меня есть конфигурация, в соответствии с ответом на этот вопрос, который определяет smtp_bind_address = 10.20.30.40, где 10.20.30.40 - это адрес, связанный с устройством tun0. Этот сервер-сервер не поддерживает IPV6.

В течение многих лет это работало идеально - до тех пор, пока однажды устройство tun0 не умерло - и Postfix отправил электронное письмо через сетевое устройство по умолчанию, eth0 (10.0.0,1), а не tun0.

Это ожидаемое поведение? Могу ли я изменить настройки, чтобы Postfix всегда отправлял электронную почту только через tun0 (10.20.30.40) - оставляя сообщения в очереди, если tun0 недоступен?

Если это актуально, это на Ubuntu 16.04.2 LTS с Postfix версии 3.1.0-3. tun0 реализован с использованием OpenVPN версии 2.3.10-1ubuntu2.1

- Отредактируйте, чтобы добавить дополнительные детали -

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.20.30.40     0.0.0.0         255.255.255.255 UH    0      0        0 tun0

На этом сервере работает несколько служб, из которых Postfix только одна. Только электронная почта должна быть маршрутизирована через 10.20.30.40 - все остальные службы должны быть маршрутизированы через шлюз по умолчанию.

Что происходит, так это то, что postfix будет использовать настроенный smtp_bind_address первый. В вашем случае это статический ip, привязанный к tun0. Когда он заработает, он отключится через tun0. Если tun0 не работает, то клиент bind не удастся заставить postfix вернуться к поведению по умолчанию, не привязывая конечную точку tcp клиента, и поэтому он будет использовать маршрут по умолчанию, который подключен к eth0.

Казалось бы, postfix не обеспечивает подходящего переопределения для отказа smtp_bind_address.

Итак, ответ - просто заблокировать исходящую электронную почту на порту 25 интерфейса eth0 с помощью правила таблиц IP. Это приведет к тому, что вся электронная почта будет стоять в очереди на некоторое время, прежде чем произойдет сбой или пока не вернется tun0.

Что-то вроде следующего должно работать:

iptables -A OUTPUT -i eth0 -p tcp --dport 25 -j DROP

Это предотвратит отправку всей электронной почты через порт 25 через eth0 и ее отправку непосредственно с вашего сервера (без маршрутизации). Он не будет блокировать почтовый трафик, отправляемый через tun0.

Давненько мне не приходилось возиться с postfix. Но я думаю, вам следует использовать реле смарт-хоста.

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

Ретранслятором будет почтовый сервер, соответствующий SPF-записи отправителя в вашем почтовом домене. Ваш интернет-провайдер должен быть в состоянии действовать для вас как ретранслятор электронной почты смарт-хоста.

По памяти это может быть так же просто, как установить параметр в /etc/postfix/main.cf

например relayhost = mx1.mydomain.com:587

Тогда вам не нужно будет заботиться о том, с какого интерфейса отправляется почта.

Судя по тому, что я смог собрать и протестировать в лаборатории, похоже, что это работает так, как задумано. smtp_bind_address переключится на другой inet_interface, если он недоступен.

Возможно, вы могли бы настроить другой экземпляр Postfix, который имеет только один inet_interface из 10.20.30.40, а исходящий postmap / relay к этому? Возможно, тогда вы сможете получать через несколько адаптеров и принудительно отправлять по одному IP-адресу.